Kodowanie zapytań SQL/Visual Studio 2017
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Kodowanie zapytań SQL/Visual Studio 2017

AutorWiadomość
Temat założony przez niniejszego użytkownika
Kodowanie zapytań SQL/Visual Studio 2017
» 2019-03-05 23:58:16
Cześć, piszę program, który łączy się z bazą danych MySQL. Problem pojawia się w momencie wpisania do zapytania polskich znaków (program nie zwraca wyniku zapytania), pomimo, że w konsoli takowe się wyświetlają. Mam wrażenie, że problem jest gdzieś w połączeniu C++ z MySQL'em.

C/C++
#include "pch.h"
#include <iostream>
#include "R.h"
#include "CDU.h"
#include "order.h"
#include <string>
#include <windows.h>


using namespace std;

int main()
{
    SetConsoleOutputCP( 852 );
    cout << "zażółć" << endl; //wyświetla się poprawnie w konsoli
    Order::createOrder();
   
    return 0;
   
   
   
}
//połączenie z bazą danych
DBconnect::DBconnect( string a, string u, string p, string db, unsigned long pt, string s, unsigned long f )
{
   
    MYSQL wsk;
    session = & wsk;
   
    mysql_init( & wsk );
    mysql_set_character_set( & wsk, "utf-8" );
   
   
    if( mysql_real_connect( & wsk, a.c_str(), u.c_str(), p.c_str(), db.c_str(), pt, NULL, f ) )
         printf( "Połączenie z bazą danych MySQL nawiązano poprawnie!\n" );
    else
         printf( "Błąd połączenia z bazą MySQL: %d, %s\n", mysql_errno( & wsk ), mysql_error( & wsk ) );
   
    mysql_select_db( & wsk, "ksiegarnia" );
}


P-174121
» 2019-03-06 00:56:47
C/C++
mysql_set_character_set( & wsk, "utf-8" );
W bazie ustawiasz UTF-8, więc baza takich znaków oczekuje. Windowsowa konsola nie obsługuje UTF-8, tylko UTF-16, więc możesz użyć tego kodowania zarówno w bazie, jak i w konsoli (funkcje WinAPI takie, jak WriteConsoleW sobie z tym poradzą). Możesz również nadal używać UTF-8 w bazie, a UTF-16 w konsoli, ale wtedy będą potrzebne odpowiednie konwersje pomiędzy tymi kodowaniami.
P-174122
Temat założony przez niniejszego użytkownika
» 2019-03-06 17:24:52
baza danych z kolei nie obsługuje utf-16(MySQL Server nie ma takiego charsetu), więc pozostaje druga opcja. Czy to znaczy, że muszę każde zapytanie przepuścić przez funckje zamieniającą znaki? Chociaż właściwie, skoro połączenie z bazą danych jest nawiązywane w utf-8, to zapytanie powinno być kodowane prawidłowo, a ewentualnie zwracany wynik może być źle odczytywany przez konsolę.
P-174126
Temat założony przez niniejszego użytkownika
» 2019-03-06 17:58:35
Pokombinowałem trochę i w połączeniu z bazą dałem zamiast "utf-8"; "cp852" takie jak w Windowsie, natomiast w konsoli dalej jest 1250. Zapytania obsługują polskie znaki, w konsoli też działają ogonki i wszystko hula jak marzenie. Ogromne dzięki za pomoc.

Edit: odpowiedzi z polskimi znakami pochodzące z bazy danych wyświetlają się prawidłowo w konsoli przy "SetConsoleOutputCP(852)", natomiast te z programu tylko przy "SetConsoleOutputCP(1250)" .
P-174128
» 2019-03-07 07:58:56
natomiast te z programu tylko przy "SetConsoleOutputCP(1250)"
Bo takie masz ustawione kodowanie w Visualu. Jak je zmienisz na stronę kodową 852 (jeśli się da), to wtedy to zadziała. Tak czy inaczej, za każdym razem gdy kodowanie się nie zgadza, masz dwie możliwości:
1. Ustawić identyczne kodowanie w obu miejscach.
2. Wykonywać konwersję przy każdym użyciu.
Jeśli w Visualu nie uda się ustawić identycznego kodowania, to pozostaje druga opcja. Może się również okazać, że baza wspiera Windows-1250, wtedy możesz tam to przestawić.
P-174131
« 1 »
 Strona 1 z 1