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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Yet another MySQL subject  (Прочитано 3926 раз)
xk
Гость
« : Февраль 24, 2007, 14:10 »

Перечитал топики, но так и не смог сделать  :oops:
Можете пинать, но только помогите !  Улыбающийся

Вообщем проблема в кодировках вместо русских букв всякое лезет... итак, исходные данные:

ОС(и клиент и сервер): Windows XP SP2
Qt: 4.2.0 commerce
MySQL: 4.1
Внутренняя кодировка MySQL: при установке указал из трех вариантов на мульти языковую поддержку. Вот строчка из my.ini:
default-character-set=utf8

Запустил сервер, запустил клиент mysql.exe из поставки, создал database, в ней таблицу с единственным полем типа CHAR(24).
Добавил в таблицу русское слово, затем проверил через SELECT. Слово в консоле отобразилось крякозябрами. Удалил запись, набрал "SET NAMES utf8;", снова добавил ту же запись и проверил - на этот раз всё нормально, русские буквы.
А вот в Qt немогу такого же добиться Грустный.

Вот код:

Код:

в main():
 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));

где-то дальше:

QSqlDatabase db;
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("Test1");
db.setUserName("root");
db.setPassword("phrack");
bool ok = db.open();
if(ok == false)
{
  errorMessage(db.lastError().text());
  qApp->exit(1);
}

QSqlQuery q;
if(q.exec("SET NAMES utf8;") == false)
    errorMessage("SET NAMES utf8 == false");

QSqlTableModel* model = new QSqlTableModel(this, db);
model->setTable("testtable");
model->select();
 
for(int i=0; i<model->rowCount(); ++i)
{
  QString name = model->record(i).value("Name").toString();
}


Пробывал q.exec("SET NAMES utf8_general_ci;"); - возвращает false, база не поддерживает видимо.

Буду благодарен любому совету !
[/code]
Записан
xk
Гость
« Ответ #1 : Февраль 27, 2007, 18:50 »

Проблема так и не решилась  Грустный .

Сменил БД на mysql-5.0.18 - всё то же самое.. спасительный

Код:

q.exec("SET NAMES utf8_general_ci");

возвращает false.

Может кто-нибудь выслать 100% рабочий код, который корректно работает с кириллицей ?

xkurt at inbox dot ru

Спасите !
 Улыбающийся
Записан
alex12
Гость
« Ответ #2 : Февраль 27, 2007, 22:41 »

Привет!
Код:

QSqlQuery query;
if( !query.exec("SET NAMES \'utf8\'") )
{ QMessageBox::critical(0, "Ошибка", "Не могу установить кодировку"
                             + query.lastError().driverText()   );
  done( QDialog::Rejected );
  return;
}


Очевидно дело в \'

Я работаю с SQLyog в качестве отладочного средства. Очень удобно.
А для Qt использую utf8. Никаких проблем с кодировкой.

добавлено спустя 1 минуту:

 При этом в настройках SQLyog'а -- utf8
Записан
xk
Гость
« Ответ #3 : Февраль 28, 2007, 07:07 »

Вообщем решил проблему хаком.. может это кого-нибудь спасет в будущем...

src\sql\drivers\mysql\qsql_mysql.cpp:

// комментим эту строку
// QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql))

// пишем вместо неё эту
QTextCodec* heuristicCodec = QTextCodec::codecForName("Windows-1251");

PS: Qt-4.2.0
Записан
crocus
Гость
« Ответ #4 : Февраль 28, 2007, 09:05 »

Код:
#ifndef CONNECTION_H_
#define CONNECTION_H_
#include <QMessageBox>
#include <QApplication>
#include <QSettings>
class QtSql;
bool createConnection()
{
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "RealtorPlus", "agency");
        QString driver = settings.value("driver").toString();
        QString database = settings.value("database").toString();
        QString host = settings.value("host").toString();
        QString user = settings.value("user").toString();
        QString password = settings.value("password").toString();

    QSqlDatabase db;
db = QSqlDatabase::addDatabase(driver);
    db.setHostName(host);
db.setDatabaseName(database);
db.setUserName(user);
db.setPassword(password);

   if (!db.open()) {
       /* QMessageBox::critical(0, qApp->tr("Cannot open database"),
            qApp->tr("Unable to establish a database connection.\n"
                     "Perhaps Qt was built without database support.\n\n"
                     "Click Cancel to exit."), QMessageBox::Cancel,
                     QMessageBox::NoButton);*/
        return false;
    }
    QSqlQuery query;
    //query.exec("SET NAMES utf8;");//?????????
query.exec("SET NAMES utf8_general_ci;");// нормальная кодировка
    return true;
}
#endif /*CONNECTION_H_*/

вызываю
Код:

#include "connection.h"
MainWindow::MainWindow( QWidget *parent, Qt::WFlags flags ) : QMainWindow( parent, flags )
{
   if ( !createConnection() )
   {
  configOptions();//диалог настройки соединения
  //addParameters();
   }

Цитировать
QSqlTableModel* model = new QSqlTableModel(this, db);
- убери db, если соединение одно устанавливаешь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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