crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Кодировки при работе с MySQL
zerling
  опции профиля:
сообщение 13.2.2009, 12:05
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 31.10.2008
Из: г.Мытищи Московской обл.
Пользователь №: 406

Спасибо сказали: 0 раз(а)




Репутация:   0  


База MySQL 4.1, QT 4.3.4 (под windows)
Нужно читать и записывать в БД русские буквы. Таблицы в базе лежат в кодировке UTF8 (даже специально файлы таблиц посмотрел)
На форме таблица заполняется таким образом: (взял из примера в асистенте)
QSqlTableModel*model;
QTableView*tableView;

model=new QSqlTableModel(this,db);
model->setTable("sotrudniki");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->removeColumn(0); // don't show the ID
model->setHeaderData(0, Qt::Horizontal, tr("столбец1"));
model->setHeaderData(1, Qt::Horizontal, tr("столбец2"));
model->setHeaderData(2, Qt::Horizontal, tr("столбец3"));
tableView->setModel(model);
tableView->show();


После соединения с БД делаю запрос QSqlQuery(QString("set character set КОДИРОВКА;"),db); для того, чтоб из БД читало в заданной кодировке.. пробовал запрос не делать..
Пробовал задавать для кодеков и для БД кодировки UTF8, cp1251 и даже cp866 :-)
Ничего не помогает отобразить в таблице русские буквы..

Какие кодеки надо поставить в setCodecForCStrings(), setCodecForTr(), setCodecForLocale() чтоб русские буквы отображались нормально в таблице?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.2.2009, 13:17
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я предлагаю делать так (setCodecForCStrings). Почему? не знаю, но для случая с FireBird это позволяет нормально работать.

П.С. в настройках соединения я не указываю кодировку, т.к. не помогает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 13.2.2009, 13:22
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

Спасибо сказали: 15 раз(а)




Репутация:   1  


zerling, а в папке с базой (непосредственно в папке схемы) имеется файлик db.opt? и, если имеется, что в нём написано?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zerling
  опции профиля:
сообщение 13.2.2009, 13:52
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 31.10.2008
Из: г.Мытищи Московской обл.
Пользователь №: 406

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Константин @ 13.2.2009, 13:22) *
zerling, а в папке с базой (непосредственно в папке схемы) имеется файлик db.opt? и, если имеется, что в нём написано?


В файлике вот это:
default-character-set=utf8
default-collation=utf8_general_ci

Попробовал так

QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); // Для внутренних преобразований Qt
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()

Результат: Знаки вопроса вместо символов если БД отдаёт в UTF8
Крокозяблы если в cp1251
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 13.2.2009, 14:25
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

Спасибо сказали: 15 раз(а)




Репутация:   1  


а если через гуй? например, mysql-gui-tools.
и обязательно попробуй через sqlbrowser из стандартных примеров

Сообщение отредактировал Константин - 18.2.2009, 16:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zerling
  опции профиля:
сообщение 18.2.2009, 16:49
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 31.10.2008
Из: г.Мытищи Московской обл.
Пользователь №: 406

Спасибо сказали: 0 раз(а)




Репутация:   0  


В общем прикол с кодировками так и не решился.

из командной строки запускаю mysql --user -p (ввожу пароль)
Даю команду set character set cp866; - консоль ХР по моему работает в cp866
потом делаю select * from table1;
показывает русские буквы нормалньно...

Когда соединяюсь из QT
 QSqlQuery(QString("set character set cp866;"),db); //запрашиваю эту же кодировку cp866 для сеанса
QSqlQuery q=QSqlQuery(QString("select * from table1;"),db); // в общем выбираю значения
while (q.next())
  {
   qDebug(q.value(0).toString().toAscii()); // тут просто цифра 1, 2, и т.д. - показывет нормалньно
   qDebug(q.value(1).toByteArray().toHex()); // тут поле со строкой
   qDebug("------------");
  };

происходит такая беда:
вывод qDebug:
код 3f для всех русских букв
нормальные коды для цифр для 1 - 31h 2 -32h и английских букв. цифры и буквы нормально печатаются в консоли

строка qDebug(q.value(1).toByteArray().toHex()); вроде как с кодировкой не играется и вывод считанных данных в шеснадцатеричном виде не должен зависеть от кодека.
toByteArray - представляем результат запроса как массив байтов
toHex - получаем шеснадцатеричную строку...

По моему данные портятся на уровне библиотеки для работы с БД из QT4
:blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 18.2.2009, 16:51
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

Спасибо сказали: 15 раз(а)




Репутация:   1  


не торопись с выводами. mysql-gui-tools так и не попробовал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zerling
  опции профиля:
сообщение 19.2.2009, 8:51
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 31.10.2008
Из: г.Мытищи Московской обл.
Пользователь №: 406

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Константин @ 18.2.2009, 16:51) *
не торопись с выводами. mysql-gui-tools так и не попробовал?


Гуи тулз пробовал.. Скачал бинарики, чтоб не компилировать у себя.. через них всё читается/пишется нормально.

Пробовал сервер заменить с 4.1 на 5й (5.0.67).. пересоздавал в 5м базу заново, при этом поменял либу в QT на ту, что от 5го шла, перекомпилировал QT..
Результат тот же...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zerling
  опции профиля:
сообщение 19.2.2009, 14:47
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 31.10.2008
Из: г.Мытищи Московской обл.
Пользователь №: 406

Спасибо сказали: 0 раз(а)




Репутация:   0  


:D :D Решил проблему!! Правда коряво сделал...
В общем подправил драйвер QT434\src\sql\drivers\mysql\qsql_mysql.cpp
Исправил кусочек кода в функции static QVariant::Type qDecodeMYSQLType(int mysqltype, uint flags)
    case FIELD_TYPE_STRING :
    case FIELD_TYPE_VAR_STRING :
    case FIELD_TYPE_BLOB :
    case FIELD_TYPE_TINY_BLOB :
    case FIELD_TYPE_MEDIUM_BLOB :
    case FIELD_TYPE_LONG_BLOB :
        //type = (flags & BINARY_FLAG) ? QVariant::ByteArray : QVariant::String; // БЫЛО
        type =QVariant::ByteArray; // СТАЛО
        break;


От MySQL прошу давать данные в кодировке cp1251 и всё отображается нормально, перестали портится русские.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 19.2.2009, 16:39
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

Спасибо сказали: 15 раз(а)




Репутация:   1  


зря
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 31.10.2020, 16:33