crossplatform.ru

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


  Ответ в Кодировки при работе с MySQL
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Гость_ALex-Annet_* Дата 10.12.2010, 19:51
  Мне помогло:

QSqlQuery query(db);
query.exec("SET CHARACTER SET latin1");
zerling Дата 20.2.2009, 9:10
 
Цитата(Константин @ 19.2.2009, 16:39) *
зря


Знаю, что зря. Наступил на подводные грабли уже: при чтении всё было ОК, но при записи данные портило т.к. запрос к БД драйвер тоже перекодирует...
вышел из положения так:

На чтении оставил правку в драйвере
На запись в программе использую

// f1 и f2 описаны как QString и значения получают из QLineEdit от пользователя.
QByteArray tmp1=f1.toUtf8();
QByteArray tmp2=f2.toUtf8();
QString qw=QString("INSERT INTO `tab1` (`f1`,`f2`) VALUES (0x"+tmp1.toHex()+",0x"+tmp2.toHex()+")");


Так в БД пишет нормально, но меня не волнует скорость т.к. ожидаемая интенсивность запросов примерно 10 штук в неделю.
С удовольствием бы решил без правок, но сроки жмут...
Константин Дата 19.2.2009, 16:39
  зря
zerling Дата 19.2.2009, 14:47
  :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 и всё отображается нормально, перестали портится русские.
zerling Дата 19.2.2009, 8:51
 
Цитата(Константин @ 18.2.2009, 16:51) *
не торопись с выводами. mysql-gui-tools так и не попробовал?


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

Пробовал сервер заменить с 4.1 на 5й (5.0.67).. пересоздавал в 5м базу заново, при этом поменял либу в QT на ту, что от 5го шла, перекомпилировал QT..
Результат тот же...
Константин Дата 18.2.2009, 16:51
  не торопись с выводами. mysql-gui-tools так и не попробовал?
zerling Дата 18.2.2009, 16:49
  В общем прикол с кодировками так и не решился.

из командной строки запускаю 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:
Константин Дата 13.2.2009, 14:25
  а если через гуй? например, mysql-gui-tools.
и обязательно попробуй через sqlbrowser из стандартных примеров
zerling Дата 13.2.2009, 13:52
 
Цитата(Константин @ 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, 13:22
  zerling, а в папке с базой (непосредственно в папке схемы) имеется файлик db.opt? и, если имеется, что в нём написано?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 19.4.2024, 18:10