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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt MySQL и русские символы  (Прочитано 18669 раз)
bob
Гость
« : Октябрь 30, 2005, 18:24 »

В БД (MySQL) данные хранятся в кодировке ср1251, на консоли отображаются без проблем, а если загружаю данные с помощью программы написанной на Qt, то все выводится разными некузявыми значками.:shock: Кто ни будь разруливал это проблему? Поделитесь опытом.

PS: MySQL и Qt и программа на нем писанная ходят под WindowsXP.
Записан
bob
Гость
« Ответ #1 : Октябрь 30, 2005, 21:30 »

Я думал это проблема отбражения символов самим Qt, но при использовании БД Access ни каких проблем нет.
Записан
Alexei
Гость
« Ответ #2 : Октябрь 31, 2005, 10:33 »

У меня была такая же проблема: дома все работает нормально, на работе - нет. Оказалось, что если сервер MySQL находится в папке
C:\mysql
то все путем.

На работе у нас сервер конечно же стоит на отдельной машине да еще под Linux.

Если сервер находится не в папке C:\mysql, то кодировка не работает.
Подсмотрев исходники, я выяснил, что кодировка устанавливается в файле qsql_mysql.cpp  с помощью функции mysql_character_set_name, которая ищет файл с кодировкой в папке !!! C:\mysql. А если там не находит, что естественно для машин, на которых нет сервера да еще в папке C:\mysql, то выставляет codecForLocale(), который является latin1. Я решил проблему закоментировав соответствующие строчки и пересобрав библиотеку QtSql4.dll. Такое решение я считаю неприемлимым и думаю, что это trolltech должна исправить.

Может, я не прав и у кого-то есть более подходящее решение?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #3 : Октябрь 31, 2005, 11:41 »

народ во первых пишите версию mysql

их уже 3 гуляет

во вторых, в 4 например, клиент должен сказать серверу на какой кодировке общатся будем, сервер тоже может в разных кодировках хранить
Записан
bob
Гость
« Ответ #4 : Октябрь 31, 2005, 17:04 »

Сервер MySQL 4.1 по умолчанию для него установлена ср1251 Qt 4.0.1.
А как из Кутешной проги серверу БД сообщить в какой кодировке сеанс будет не пойму, и кроме того Qt ведь использует latin1. Как это все обойти, или я что-то усложняю?
Записан
Alexei
Гость
« Ответ #5 : Октябрь 31, 2005, 18:49 »

Admin, ты прав, извини. Я все писал про MySQL 4.0.18.
Возможно, функция mysql_character_set_name в версии 4.1.0 и выше работает корректно.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #6 : Октябрь 31, 2005, 19:29 »

Цитата: "bob"

А как из Кутешной проги серверу БД сообщить в какой кодировке сеанс будет не пойму, и кроме того Qt ведь использует latin1. Как это все обойти, или я что-то усложняю?


Там исользуется SQL запрос.
Читать тут mysql.com
Записан
bob
Гость
« Ответ #7 : Октябрь 31, 2005, 22:45 »

При установлении соединения с БД выполняю

Код:
 query.execute("SET NAMES 1251");


Выводимые символы изменяются, но по прежнему остаются некузявыми.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #8 : Ноябрь 01, 2005, 10:41 »

вот уже лучше

теперь в какой кодировке символы выводятся на экран
наверно в UTF?

сохрани вывод из базы данных в файл и увидишь в какой кодировке они идут в программу
Записан
alexis
Гость
« Ответ #9 : Ноябрь 01, 2005, 11:23 »

Установить локаль нужно правильно Улыбающийся
   
QTextCodec *codec=QTextCodec::codecForName("utf8");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
Записан
bob
Гость
« Ответ #10 : Ноябрь 01, 2005, 13:45 »

Ситуация следующая:
Первые три записи добавлены в ТБД непосредственно из shell MySQL после

команды SET NAMES utf8.

Последняя добавлена из программы написанной на Qt с переданным вБД

параметром SET NAMES utf8.

При установке SET NAMES utf8 в shell MySQL первые три записи

отображаются правильно, последняя отображается нечитабельными

символами (кодировку менял на все которые только поддерживает MySQL).

При просмотре ТБД из программы написанной на Qt ни одна запись не

отображается правильно. В заголовке окна выведен текст для того чтобы

быть уверенным, что локаль установлена в ср1251.

Все вышеописанное запускается под управлением WindowsXP.

Код:
#include "vwdb.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QTextStream>
#include <QTranslator>


ViewDB::ViewDB(QWidget *parent): QWidget(parent)
{
  setupUi(this);

  connectionDB();

  model = new QSqlTableModel(this);
  model->setTable("TestTable");
  model->setEditStrategy(QSqlTableModel::OnManualSubmit);
  model->select();

  model->setHeaderData(0, Qt::Horizontal, tr("Идентификатор"));
  model->setHeaderData(1, Qt::Horizontal, tr("Статус"));

  tvwView->setModel(model);
}


void ViewDB::connectionDB()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("TestDB");
    db.setUserName("root");
    db.setPassword("rootpass");

    db.open();

    QSqlQuery query;
    query.exec("SET NAMES utf8");
    query.exec("SELECT* FROM TestTable");
    query.next();

    codec=QTextCodec::codecForName("utf8");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForTr(codec);

    query.prepare("INSERT INTO person (id, status) "
                  "VALUES (:id, :status)");
    query.bindValue(":id", 40);
    query.bindValue(":status", "Гость");
    query.exec();

    setWindowTitle("Текст в ср1251");
}
Записан
bob
Гость
« Ответ #11 : Ноябрь 01, 2005, 13:53 »

В образце кода указано INSERT INTO person(id, status)  - это опечатка. В оригинале стоит TestTable .
Записан
crocus
Гость
« Ответ #12 : Ноябрь 08, 2005, 04:08 »

А что ничего нового нет в решении проблемы.
Записан
Werewolf1
Гость
« Ответ #13 : Ноябрь 14, 2005, 13:48 »

вместо  
query.bindValue(":status", "Гость");
надо пистать
query.bindValue(":status", tr("Гость"));

так как Qt работает с юникодом
Записан
Werewolf1
Гость
« Ответ #14 : Ноябрь 14, 2005, 13:57 »

Я использоваю Qt3 и MySql 4.1.9 проверял следующим кодом
bool createConnection()  
{  
  QSqlDatabase *db = QSqlDatabase::addDatabase("QMYSQL3");  
  db->setHostName("localhost");  
  db->setDatabaseName("testDB");  
  db->setUserName("root");  
  db->setPassword("rootpass");  
  if (!db->open()) {  
    db->lastError().showMessage();  
    return false;  
  }  
    QSqlQuery query(db);
   query.exec("SET CHARACTER SET utf8");
 return true;  
}
void addRecord()
{
QSqlQuery query;
QSqlDatabase::database()->transaction();

query.prepare("INSERT INTO tb_component (description) "
              "VALUES (:description)");
query.bindValue(":description", QObject::tr("текст в кодировки ср1251"));
query.exec();
QSqlDatabase::database()->commit();


}
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
    QTextCodec::setCodecForTr( QTextCodec::codecForName("utf8") );
   QTextCodec::setCodecForCStrings( QTextCodec::codecForName("utf8") );
  if (!createConnection())  
    return 1;
   addRecord();
    return app.exec();  
}
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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