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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt MySQL и русские символы  (Прочитано 20335 раз)
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   Вверх
  Печать  
 
Перейти в:  


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