Russian Qt Forum

Qt => Базы данных => Тема начата: DpoHro от Январь 08, 2008, 19:29



Название: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 08, 2008, 19:29
Qt 4.3.2
Mysql БД

Выдержка переменных из mysqladmin:
Цитировать
character set client       utf8      latin1
character set connection    cp1251    latin1
character set database    latin1    latin1
character set results    utf8    latin1
character set server    latin1    latin1
character set system    utf8    utf8
collation connection       cp1251_general_ci      latin1_swedish_ci
collation database    latin1_swedish_ci    latin1_swedish_ci
collation server    latin1_swedish_ci    latin1_swedish_ci

БД в кодировке cp1251

Устанавливаю кодеки:
Код:
QTextCodec* codec = QTextCodec::codecForName("CP1251");

QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
setlocale(LC_ALL,"");


До сих порпроблем небыло, но производил только чтение из БД.
Настала необходимость вставки данных в таблесы и...
Русские букафки заменяются на "????"

Может стоило БД в utf8 делать?
И вообще какие еще проблемы могут быть и посоветуйте как поступить в моей ситуации?


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: Пантер от Январь 08, 2008, 19:43
Делай конверт типа:
libeEdit->text().toLocal8Bit()
Или что-то типа этого. А вообще воспользуйся поиском, вопрос не раз поднимался.


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 08, 2008, 23:31
Первым делом попробовал, но увы тут дело видимо в чемто другом :(
Сейчас пороюсь по форуму...


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 08, 2008, 23:48
Да я забыл сообщить, что QSqlQuery создаю так:
Код:
QSqlQuery q = db.exec("SET NAMES 'cp1251'");


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 09, 2008, 00:40
Облазал форум, ничего не нашел чтобы привело меня к решению...

Кстати, замечательный факт, вместе с данными из поля ввода с формы, которые собственно и превращаются в знаки вопроса, еще добавляются данные полученные из другого запроса. В какой кодировке они - ХЗ, точно не в 1251


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: Пантер от Январь 09, 2008, 12:42
Код:
QTextCodec* qtcCodec = QTextCodec::codecForName("CP1251"); 
....
qsqQuery->bindValue(":value",qtcCodec->fromUnicode(lineEdit->text()));
Попробуй так...
А вообще.... может перевести базу на ютф?


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 09, 2008, 13:15
Не совсем понял пример.

Я до выполнения запроса, все данные сохраняю в свою структуру и потом только формирую запрос:

Код:
....
qPerson.exec(
"INSERT INTO am_insured_peoples SET "
"transport_id='"+qSessionID+"',"
"firstname='"+qsFN+"',"
"lastname='"+NorE_person.qsLastName+"',"
"middlename='"+NorE_person.qsMiddleName+"',"
"birthday='"+qsDateBD+"',"
"sex='"+QString(NorE_person.nSex)+"',"
"experience='"+qsDateExp+"',"
"p_series='"+NorE_person.qsPSerie+"',"
"p_number='"+NorE_person.qsPNumber+"',"
"p_exit_organ='"+NorE_person.qsPWhoExit+"',"
"p_exit_date='"+qsDatePExit+"',"
"d_series='"+NorE_person.qsDSerie+"',"
"d_number='"+NorE_person.qsDNumber+"',"
"region_id='"+NorE_person.qsRegionID+"',"
"city_id='"+NorE_person.qsCityID+"',"
"city_noexist='"+NorE_person.qsCityName+"',"
"street='"+NorE_person.qsStreet+"',"
"house='"+NorE_person.qsHome+"',"
"building='"+NorE_person.qsBuilding+"',"
"apart='"+NorE_person.qsApart+"'"
);

В utf не желательно переводить :(



Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 09, 2008, 13:21
А вообще как определить в какой кодировке текст?
И второй вопрос как в эту кодировку перевести текст получаемый от пользователя?

Как я уже писал, часть данных полученных другим запросом из БД сохраняется как надо, но я не могу остальные данные перевести в ту же кодировку.
Вот например есть населенный пункт "Аинское", в отладчике я его вижу как "Aeineia". Эти иероглифы чудесным образом сохраняются как нужно, то есть в БД я вижу их как "Аинское". Но данные которые вводит пользователь в отладчике просматриваются один к одному, а при сохранении в БД знаки вопроса...


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: Пантер от Январь 09, 2008, 19:29
Ну ты крутишь... Вообще проще делать так:
QSqlQuery* qsqQuery=new QSqlQuery();
qsqQuery->prepare("INSERT INTO am_insured_peoples SET "
      "transport_id=:transport_id,"
      "firstname=:firstname,"
      "lastname=:lastname,"
..............................
)
qsqQuery->bindValue(":transport_id",qSessionID);
qsqQuery->bindValue(":firstname",qsFN);
qsqQuery->bindValue(":lastname",qtcCodec866->fromUnicode(NorE_person.qsLastName));
..................................
qsqQuery->exec();
В общем покрути так...


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: Mikhail от Январь 09, 2008, 21:14
Qt 4.3.2
Mysql БД

Выдержка переменных из mysqladmin:
Цитировать
character set client       utf8      latin1
character set connection    cp1251    latin1
character set database    latin1    latin1
character set results    utf8    latin1
character set server    latin1    latin1
character set system    utf8    utf8
collation connection       cp1251_general_ci      latin1_swedish_ci
collation database    latin1_swedish_ci    latin1_swedish_ci
collation server    latin1_swedish_ci    latin1_swedish_ci

БД в кодировке cp1251

Устанавливаю кодеки:
Код:
QTextCodec* codec = QTextCodec::codecForName("CP1251");

QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
setlocale(LC_ALL,"");


До сих порпроблем небыло, но производил только чтение из БД.
Настала необходимость вставки данных в таблесы и...
Русские букафки заменяются на "????"

Может стоило БД в utf8 делать?
И вообще какие еще проблемы могут быть и посоветуйте как поступить в моей ситуации?

Все ну очень запущено.

Причем тут переменные mysqladmin?

Для работы с MySql установи необходимую кодировку для MySql в файле my.ini:
в секции [mysqld]
default-character-set=cp1251
 И перезапусти сервер MySql.


А что такое QSqlQuery q = db.exec("SET NAMES 'cp1251'");

Зачем одинарные кавычки?
Правильно будет QSqlQuery q = db.exec("SET NAMES cp1251");

Это надо выполнить после подключения к базе данных и спокойно работать с ней в кодировке cp1251 без дополнительный преобразований в cp1251 из  QString.




Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 10, 2008, 00:33
И ничего не запущено...  ::)

Причем тут переменные mysqladmin?
Для порядку =)
Я ж задаю вопрос, и пока не знаю на него ответа, малоли пригодится...

Цитировать
Для работы с MySql установи необходимую кодировку для MySql в файле my.ini:
в секции [mysqld]
default-character-set=cp1251
 И перезапусти сервер MySql.
БД на хостинге, пока что своего сервера нет, как купимс, так будем редактировать настройки...

Цитировать
А что такое QSqlQuery q = db.exec("SET NAMES 'cp1251'");

Зачем одинарные кавычки?
Правильно будет QSqlQuery q = db.exec("SET NAMES cp1251");
Давно уже пользуюсь таким синтаксисом еще с PHP, все работает, и в QT тоже...
Я ж не сам придумал: http://dev.mysql.com/doc/refman/4.1/en/charset-connection.html
Вообще не думаю что есть разница ...

Цитировать
Это надо выполнить после подключения к базе данных и спокойно работать с ней в кодировке cp1251 без дополнительный преобразований в cp1251 из  QString.

Вооот, а SET CHARACTER SET cp1251 не помогает =( даже когда работаю с БД на дефолтных настройках на локалхосте.

Из БД данные получаются и нормально отображаются в программе...


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: Mikhail от Январь 10, 2008, 09:06
И ничего не запущено...  ::)

Причем тут переменные mysqladmin?
Для порядку =)
Я ж задаю вопрос, и пока не знаю на него ответа, малоли пригодится...

Цитировать
Для работы с MySql установи необходимую кодировку для MySql в файле my.ini:
в секции [mysqld]
default-character-set=cp1251
 И перезапусти сервер MySql.
БД на хостинге, пока что своего сервера нет, как купимс, так будем редактировать настройки...

Цитировать
А что такое QSqlQuery q = db.exec("SET NAMES 'cp1251'");

Зачем одинарные кавычки?
Правильно будет QSqlQuery q = db.exec("SET NAMES cp1251");
Давно уже пользуюсь таким синтаксисом еще с PHP, все работает, и в QT тоже...
Я ж не сам придумал: http://dev.mysql.com/doc/refman/4.1/en/charset-connection.html
Вообще не думаю что есть разница ...

Цитировать
Это надо выполнить после подключения к базе данных и спокойно работать с ней в кодировке cp1251 без дополнительный преобразований в cp1251 из  QString.

Вооот, а SET CHARACTER SET cp1251 не помогает =( даже когда работаю с БД на дефолтных настройках на локалхосте.

Из БД данные получаются и нормально отображаются в программе...


Ну если не можешь редактировать настройки БД, то хотя бы узнай какие установлены и в соответствии с этим "Set names .... "

А для начала поработай с БД на localhost из $(QTDIR)/demos/sqlbrowser


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 10, 2008, 17:23
Совету твоему внял я...
Но ничего из этого не вышло, сплошные знаки вопросов. Перебрал все возможные кодировки :(

Какаято ерунда.

Скажите как у кого все работает и на чтение и на запись БД.
Если можно с примерами, если не трудно поменять код в $(QTDIR)/demos/sqlbrowser и скриптом БД на дефолтных настройках mysql...


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: Mikhail от Январь 10, 2008, 19:12
Совету твоему внял я...
Но ничего из этого не вышло, сплошные знаки вопросов. Перебрал все возможные кодировки :(

Какаято ерунда.

Скажите как у кого все работает и на чтение и на запись БД.
Если можно с примерами, если не трудно поменять код в $(QTDIR)/demos/sqlbrowser и скриптом БД на дефолтных настройках mysql...

Еще аз повторяю:
1. Поставь на своей машине MySql (  у меня стоит MySql 5.0 )
2. Установи необходимую кодировку для MySql в файле my.ini( файл этот в каталоге установки MySql ):
в секции [mysqld]
default-character-set=cp1251
 И перезапусти сервер MySql.
3. Запусти пример из $(QTDIR)/demos/sqlbrowser.
4. Создай соединение с базой данных mysql.
5. создай новую базу. Например с именем Proba.
6. Создай соединение с базой данных Proba.
7. Выполни запрос SET NAMES cp1251;
8. создай таблицу и внеси в нее несколько записей.

Если у тебя при просмотре записей кракозябры вместо русских букв, то это значит несовпадение кодировок по п.п. 2 и 7.
Если у тебя при просмотре записей ???? вместо русских букв, то это значит что по п.2 прописано default-character-set= latin1


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 10, 2008, 21:13
У меня знаки вопроса после добавления, параметр default-character-set=latin1 действительно установлен в latin1
Но он похоже и на сервере (на хостинге) также установлен в latin1

Вопрос, как решить проблему?


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 10, 2008, 21:36
Сменил на локалхосте latin1 на cp1251 в программе запрос SET NAMES cp1251 всегда был и до сих пор есть .
БД cp1251 я не знаю что еще нужно...
Я в шоке, 3 день и ничего не ясно (((


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: Mikhail от Январь 10, 2008, 22:10
Сменил на локалхосте latin1 на cp1251 в программе запрос SET NAMES cp1251 всегда был и до сих пор есть .
БД cp1251 я не знаю что еще нужно...
Я в шоке, 3 день и ничего не ясно (((

Ну а теперь выполни пункты 3 - 8  но конечно создай новую базу, не Proba и проверь. должно все работать.


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 10, 2008, 22:40
Все сделал (создал новую БД добавил запись), и все по-прежнему...
Я вот только одного не пойму, ведь с этой же БД я работаю из PHP и все в норме...


Название: Re: Qt4.3.2+mysql - проблемы с кодировкой, =(
Отправлено: DpoHro от Январь 11, 2008, 01:37
Ну слава Богу!  Я рад что это оказалось возможным!

Настройки my.ini менять не пришлось, БД cp1251, соединение cp1251.

В моем случае помогло следующее:
Код:
QString newstring=inputstring.fromLatin1(test1251.toAscii());

Вобщем каждый из учавствовавших в диалоге были в чем то правы =)

Спасибо, друзья! :)