Groudz377 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. #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; Order::createOrder(); return 0; }
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" ); }
|
|
jankowalski25 |
» 2019-03-06 00:56:47 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. |
|
Groudz377 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ę. |
|
Groudz377 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)" . |
|
jankowalski25 |
» 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ć. |
|
« 1 » |