Russian Qt Forum
Сентябрь 30, 2024, 18:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: И снова проблемы с кодировкой в MySQL  (Прочитано 3683 раз)
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)
{
#if MYSQL_VERSION_ID >= 32321
QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql));
if (heuristicCodec)
return heuristicCodec;
#endif
return QTextCodec::codecForLocale();
}
вызывается в двух местах:
1. в конструкторе
Код:
QMYSQLDriver::QMYSQLDriver(MYSQL * con, QObject * parent) : QSqlDriver(parent)
{.... d->tc = codec(con);}
2. и в функции
Код:
bool QMYSQLDriver::open(const QString& db,......)
{...d->tc = codec(d->mysql);....}
3. В классе имеет место следующая строка QTextCodec *tc;
Вроде все логично.
Если в функции заменить строку
Код:
QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql));
на
Код:
QTextCodec* heuristicCodec = QTextCodec::codecForName("cp1251");//(или "CP1251" или "Windows-1251" )
Пересобрать Dll вышеуказаным способом то все работает.
Судя по всему без подобного "хака" не обойтись
как не обойтись и без следующих строк в коде программы:
Код:
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr(codec);
QSqlQuery sql = QSqlQuery();
sql.exec("SET NAMES cp1251");

PS. Потратил немало времени пока разобрался, надеюсь кому-то помог.
« Последнее редактирование: Февраль 04, 2008, 15:20 от pastor » Записан
DpoHro
Гость
« Ответ #1 : Февраль 04, 2008, 18:37 »

А я вот, поборол это только приведенными строками в собственном коде, ничего не пересобирал.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #2 : Февраль 14, 2008, 17:53 »

А я вот, поборол это только приведенными строками в собственном коде, ничего не пересобирал.

Проблема с такой пересборкой была ранее. Ведь указано, что Qt 4.1.1.
Для 4.3 и кажется 4.2 сейчас лезть и править qsql_mysql.cpp не надо.
Записан
ритт
Гость
« Ответ #3 : Февраль 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
это всё нужно только при сборке статиком. при сборке шаредом нужно только указать инклюдепаз и либпаз, где компоновщик будет искать майскл.длл
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 22.