Название: И снова проблемы с кодировкой в MySQL Отправлено: DRema от Февраль 04, 2008, 09:48 WinXpPROSP2 Qt 4.1.1 opensource MinGW-3.4.2 mysql-5.0.45-win32(appserv-win32-2.4.9) CP1251.
О Qt задумывался давненько но познакомится с ним решил недавно. До этого по большей части писал на PHP. Естественно всталазадача подключения к базе данных и как не странно именно к mySQL. Но все оказалось не так просто :(. 1. Dll для работы с MySQL нужно сделать самому. 2. Русским буквам он предпочитает ??????????. Если со сборкой Dll все почти понятно, т.к. разные источники гласят почти одно и тоже, то с ???????? немного сложнее. Итак сборка Dll для mySQL прошла следующим образом: 1) скачал с сайтов источников mysql-noinstall-5.0.45-win32.zip и mingw-utils-0.3.tar 2) первый архив извлек в С:\MySQL\ - чтоб не было к чему придраться, а второй в папку C:\MinGW\ 3) следуя указаниям из источников описывающих процедуру проделал следующее: - запустил консоль; - cd С:\MySQL\lib\opt - reimp -d libmysql.lib - dlltool -k --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a - cd C:\Qt\4.1.1\src\plugins\sqldrivers\mysql - qmake -o Makefile "INCLUDEPATH+=C:\MySQL\include" "LIBS+=C:\MySQL\lib\opt\libmysql.a" mysql.pro - make Казалось бы все просто, но вот в параметре "LIBS+=..." у меня возникла проблема: в источнике по которому я это проделывал была строка "LIBS+=-L C:\MySQL\lib\opt -libmysql" которая у меня вызывала ошибку! С Dll все вышло, но как оказалось позже не на долго! Подключился я значит к базе, все прошло гладко. Отправил SQL запрос на добавление, затем на выборку и ??????????? Проверил character_set в конфиге базы, представился после коннекта с какой кодировкой работаю, проверил кодек. Ну думаю все, пересобрал и все осталось на том же месте ??????????? помучался еще несколько часов и забросил. На следующий день начал форсировать по форуму нашел около 10 похожих тем, видно грабли большие, стороной не обойти. Начитался, уселся прибывать, перепробовал почти все и в кавычках отправлял кодировку после соединения, и без, и с уточнением "_bin". Ничего толком не выходило, и в конце-концов пошел смотреть C:\Qt\4.1.1\src\sql\drivers\mysql\qsql_mysql.cpp там есть функция Код: static QTextCodec* codec(MYSQL* mysql) 1. в конструкторе Код: QMYSQLDriver::QMYSQLDriver(MYSQL * con, QObject * parent) : QSqlDriver(parent) Код: bool QMYSQLDriver::open(const QString& db,......) Вроде все логично. Если в функции заменить строку Код: QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql)); Код: QTextCodec* heuristicCodec = QTextCodec::codecForName("cp1251");//(или "CP1251" или "Windows-1251" ) Судя по всему без подобного "хака" не обойтись как не обойтись и без следующих строк в коде программы: Код: QTextCodec *codec = QTextCodec::codecForName("Windows-1251"); PS. Потратил немало времени пока разобрался, надеюсь кому-то помог. Название: Re: И снова проблемы с кодировкой в MySQL Отправлено: DpoHro от Февраль 04, 2008, 18:37 А я вот, поборол это только приведенными строками в собственном коде, ничего не пересобирал.
Название: Re: И снова проблемы с кодировкой в MySQL Отправлено: Mikhail от Февраль 14, 2008, 17:53 А я вот, поборол это только приведенными строками в собственном коде, ничего не пересобирал. Проблема с такой пересборкой была ранее. Ведь указано, что Qt 4.1.1. Для 4.3 и кажется 4.2 сейчас лезть и править qsql_mysql.cpp не надо. Название: Re: И снова проблемы с кодировкой в MySQL Отправлено: ритт от Февраль 14, 2008, 19:21 > Для 4.3 и кажется 4.2 сейчас лезть и править qsql_mysql.cpp не надо.
однозначно, не надо! советую не юзать 4.1.х в пользу 4.3.х > Dll для работы с MySQL нужно сделать самому. всего лишь плагин. а как звучит! > следуя указаниям из источников описывающих процедуру проделал следующее: - запустил консоль; - cd С:\MySQL\lib\opt - reimp -d libmysql.lib - dlltool -k --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a - cd C:\Qt\4.1.1\src\plugins\sqldrivers\mysql - qmake -o Makefile "INCLUDEPATH+=C:\MySQL\include" "LIBS+=C:\MySQL\lib\opt\libmysql.a" mysql.pro - make это всё нужно только при сборке статиком. при сборке шаредом нужно только указать инклюдепаз и либпаз, где компоновщик будет искать майскл.длл |