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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt4.3.2+mysql - проблемы с кодировкой, =(  (Прочитано 11224 раз)
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 делать?
И вообще какие еще проблемы могут быть и посоветуйте как поступить в моей ситуации?
« Последнее редактирование: Январь 08, 2008, 19:32 от DpoHro » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 08, 2008, 19:43 »

Делай конверт типа:
libeEdit->text().toLocal8Bit()
Или что-то типа этого. А вообще воспользуйся поиском, вопрос не раз поднимался.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DpoHro
Гость
« Ответ #2 : Январь 08, 2008, 23:31 »

Первым делом попробовал, но увы тут дело видимо в чемто другом Грустный
Сейчас пороюсь по форуму...
Записан
DpoHro
Гость
« Ответ #3 : Январь 08, 2008, 23:48 »

Да я забыл сообщить, что QSqlQuery создаю так:
Код:
QSqlQuery q = db.exec("SET NAMES 'cp1251'");
Записан
DpoHro
Гость
« Ответ #4 : Январь 09, 2008, 00:40 »

Облазал форум, ничего не нашел чтобы привело меня к решению...

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Январь 09, 2008, 12:42 »

Код:
QTextCodec* qtcCodec = QTextCodec::codecForName("CP1251"); 
....
qsqQuery->bindValue(":value",qtcCodec->fromUnicode(lineEdit->text()));
Попробуй так...
А вообще.... может перевести базу на ютф?
« Последнее редактирование: Январь 09, 2008, 19:29 от panter_dsd » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DpoHro
Гость
« Ответ #6 : Январь 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 не желательно переводить Грустный

Записан
DpoHro
Гость
« Ответ #7 : Январь 09, 2008, 13:21 »

А вообще как определить в какой кодировке текст?
И второй вопрос как в эту кодировку перевести текст получаемый от пользователя?

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Январь 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();
В общем покрути так...
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #9 : Январь 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.


Записан
DpoHro
Гость
« Ответ #10 : Январь 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 не помогает =( даже когда работаю с БД на дефолтных настройках на локалхосте.

Из БД данные получаются и нормально отображаются в программе...
« Последнее редактирование: Январь 10, 2008, 01:00 от DpoHro » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #11 : Январь 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
Записан
DpoHro
Гость
« Ответ #12 : Январь 10, 2008, 17:23 »

Совету твоему внял я...
Но ничего из этого не вышло, сплошные знаки вопросов. Перебрал все возможные кодировки Грустный

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

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

Сообщений: 587


Просмотр профиля
« Ответ #13 : Январь 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
Записан
DpoHro
Гость
« Ответ #14 : Январь 10, 2008, 21:13 »

У меня знаки вопроса после добавления, параметр default-character-set=latin1 действительно установлен в latin1
Но он похоже и на сервере (на хостинге) также установлен в latin1

Вопрос, как решить проблему?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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