Название: Просьба по Qt + MySQL
Отправлено: L.Marvell от Июль 28, 2006, 13:37
Перечитал топики по отображению кирилицы в связке Qt + MySQL, но разобраться не совсем удалось. Заработало только, когда перевожу перед записью в базу строки в utf8 (toUtf8()) и обратное преобразование fromUtf8(). Но тогда приходится для отображения использовать QSqlQuery, проходить по каждому значеню, преобразовывать его fromUtf8(), записывать в QStringList, и в QListWidgetItem. (К тому же, когда вывожу сообщение об ошибке query.lastError().text(), то соответственно вводимое значение выводится кракозябрами, т.к. уже преобразовано в utf). Может ли кто написать небольшую инструкцию как настроить MySQL и какие действия произвести в программе дабы нормально отображалась кирилица через QSqlQueryModel?
Название: Просьба по Qt + MySQL
Отправлено: alexis от Июль 28, 2006, 14:22
В какой кодировке база mysql? Какая локаль используется?
Название: Просьба по Qt + MySQL
Отправлено: L.Marvell от Июль 28, 2006, 14:39
MySQl крутится под линуксом с локалью KOI8-U и чтобы иметь возможность просматривать данные в консоли (на начальной стадии думаю пригодится), я так подозреваю, база также должна быть koi8u. На счет кодировки не совсем понял....
Название: Просьба по Qt + MySQL
Отправлено: alexis от Июль 28, 2006, 15:56
нижеследующий код дает нормальное отображение русский символов. системная локаль: utf-8 mysql: 4.1.13 - "из коробки" без доп. настроек mysql> SHOW VARIABLES LIKE 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
2) qt-4.1.4 #include <stdlib.h>
#include <QApplication> #include <QTextCodec> #include <QPlastiqueStyle> #include <QTableWidget> #include <QTableWidgetItem> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError>
int main(int argc, char *argv[]) { QTextCodec *codec=QTextCodec::codecForName("utf8"); // QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec);
QApplication app(argc, argv); app.setStyle( new QPlastiqueStyle );
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setDatabaseName("test"); db.setUserName("test"); if ( !db.open() ) qDebug("DB NOT OPEN: %s", qPrintable(db.lastError().text() ) );
QTableWidget *t = new QTableWidget(0, 1); t->show();
int rows = 0; QTableWidgetItem *item = 0;
QSqlQuery query(db); if ( !query.exec("SELECT data FROM test_table") ) qDebug("QUERY ERROR: %s", qPrintable( query.lastError().text() ) ); else { while( query.next() ) { t->insertRow(rows); item = new QTableWidgetItem( query.value(0).toString() ); t->setItem(rows, 0, item); rows++; } } return app.exec(); }
Название: Просьба по Qt + MySQL
Отправлено: L.Marvell от Июль 28, 2006, 17:38
Вернул на место настройки MySQL, создал в test таблицу test_table CREATE TABLE test_table(data VARCHAR(80));
Добавил одну запись в таблицу: INSERT INTO test_table VALUES ('перевірка');
скопировал код, немного подправив (добавил хостнейм, qDebug поменял на QMessageBoxEx поскольку Qt у меня собрана без debug). Запускаю и в итоге имеем: ÐÅÒÅצÒËÁ :( добавлено спустя 45 минут: Вобщем временно сделано так: my.cnf [client] default-character-set=koi8u [mysqld] character-set-server=koi8u
В приложении создан кодек codec = QTextCodec::codecForName("Windows-1251");
При записи в базу codec->fromUnicode(data);
При считывании while (query.next()){ listWidget->addItem(codec->toUnicode(query.value(0).toByteArray())); }
Отображение нормальное и в приложении, и если просматривать данные в линуксе через mysql. Пока будет так.
Название: Просьба по Qt + MySQL
Отправлено: Admin от Июль 28, 2006, 17:46
на PHP проблемы такого рода решаются так сразу после коннекта клиент сообщает серверу кодировку общения
делается это запросом
SET NAMES koi8r;
началось это все с 4.1 версии MYSQL
Название: Просьба по Qt + MySQL
Отправлено: alexis от Июль 28, 2006, 18:26
ну и какого хера windows-1251 если у тебя koi8-u в базе????
Название: Просьба по Qt + MySQL
Отправлено: L.Marvell от Июль 29, 2006, 11:56
Линукс с локалью koi8-u. Базу пробовал настроить так, как Вы указывали, т.е. с настройками по-умолчанию и результат я привел выше. З.Ы. Ругань не лучший способ указать человеку на его ошибки. Я описал метод с которым у меня работает, хотя может и не лучший вариант. Если подскажете как сделать лучше, буду благодарен.
Название: Просьба по Qt + MySQL
Отправлено: Admin от Июль 29, 2006, 13:07
твой способ пойдет для собственного сервака а если доступ к конфигурации сервака запрещен то клинтской программе надо сообщать на какой кодировке она общается с сервером
Название: Просьба по Qt + MySQL
Отправлено: simulacrum от Ноябрь 22, 2006, 04:27
Я совсем новичок, так что прошу не пинать ногами. QT-3.3.7 под Fedora 6 MySQL 5.027 база данных в кодировке utf8 (это важно, поскольку используются два языка одновременно) Программу использую переделанную из примера: http://doc.trolltech.com/3.3/sqltable-example.html то есть еще только осваиваю... Проблема в том, что выводится из базы вместо букв ?????? /**************************************************************************** ** ** Copyright (C) 1992-2005 Trolltech AS. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/
#include <qapplication.h> #include <qsqldatabase.h> #include <qdatatable.h> #include <qsqlcursor.h> #include <qmessagebox.h> #include <qtextcodec.h>
/* Modify the following to match your environment */ #define DRIVER "QMYSQL3" /* see the Qt SQL documentation for a list of available drivers */ #define DATABASE "survey" /* the name of your database */ #define USER "root" /* user name with appropriate rights */ #define PASSWORD "l" /* password for USER */ #define HOST "" /* host on which the database is running */
int main( int argc, char** argv ) { QApplication app( argc, argv );
QTextCodec *codec=QTextCodec::codecForName("utf8"); // QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec);
QSqlDatabase * db = QSqlDatabase::addDatabase( DRIVER ); db->setDatabaseName( DATABASE ); db->setUserName( USER ); db->setPassword( PASSWORD ); db->setHostName( HOST );
if( !db->open() ){ db->lastError().showMessage( "An error occured. Please read the README file in the sqltable" "dir for more information.\n\n" ); return 1; }
QSqlCursor sqlCursor("sitepassport"); QDataTable table( &sqlCursor ); /* data table uses our cursor */
table.addColumn( "sitename", "Название сайта" ); table.addColumn( "siteowner", "Владелец сайта" ); table.setSorting( TRUE );
app.setMainWidget( &table ); table.refresh(); /* load data */ table.show(); /* show widget */
return app.exec(); }
Подскажите, как можно исправить...
Название: Просьба по Qt + MySQL
Отправлено: crocus от Ноябрь 22, 2006, 06:26
int main(int argc, char *argv[]) { QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
//QTextCodec *qt1lCodecOEM866 = QTextCodec::codecForName("IBM 866"); //QTextCodec::setCodecForCStrings(qt1lCodecutf8);
QApplication app(argc, argv); Q_INIT_RESOURCE(realtorplus);
MainWindow mainWin; mainWin.show(); return app.exec(); } #include <QSqlDatabase> #include <QtSql/QSqlQuery> #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_general_ci;"); return true; } #endif /*CONNECTION_H_*/ Самое главное "SET NAMES utf8_general_ci;" если добавить "SET NAMES utf8;" будут кракозябры. Проверено со стандартной libmysql.dll. .......................... А.. пардон не сразу увидел что под Linux`om, а под Виндой так работает.
Название: Просьба по Qt + MySQL
Отправлено: simulacrum от Ноябрь 22, 2006, 20:13
короче, переделал, как тут сказано, после query.exec убрал return true; поскольку иначе дальше программа уже не работала /ничено не выводилось/ Результат всё равно тот же, что и в предыдущем случае...: знаки вопроса вместо букв выводятся #include <qapplication.h> #include <qsqldatabase.h> #include <qdatatable.h> #include <qsqlcursor.h> #include <qmessagebox.h> #include <qtextcodec.h>
/* Modify the following to match your environment */ #define DRIVER "QMYSQL3" /* see the Qt SQL documentation for a list of available drivers */ #define DATABASE "survey" /* the name of your database */ #define USER "root" /* user name with appropriate rights */ #define PASSWORD "" /* password for USER */ #define HOST "" /* host on which the database is running */
int main( int argc, char** argv ) { QApplication app( argc, argv );
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));
// QTextCodec *codec=QTextCodec::codecForName("utf8"); // QTextCodec::setCodecForLocale(codec); // QTextCodec::setCodecForCStrings(codec);
QSqlDatabase * db = QSqlDatabase::addDatabase( DRIVER ); db->setDatabaseName( DATABASE ); db->setUserName( USER ); db->setPassword( PASSWORD ); db->setHostName( HOST );
if( !db->open() ){ db->lastError().showMessage( "An error occured. Please read the README file in the sqltable" "dir for more information.\n\n" ); return 1; }
QSqlQuery query; query.exec("SET NAMES utf8_general_ci;"); QSqlCursor sqlCursor("sitepassport"); QDataTable table( &sqlCursor ); /* data table uses our cursor */
table.addColumn( "sitename", "Название сайта" ); table.addColumn( "siteowner", "Владелец сайта" ); table.setSorting( TRUE );
app.setMainWidget( &table ); table.refresh(); /* load data */ table.show(); /* show widget */
return app.exec(); }
единственное, на что влиялет вообще /в обоих случаях/ , так это на представлиние table.addColumn( "sitename", "Название сайта" ); table.addColumn( "siteowner", "Владелец сайта" ); А это вроде само по себе указывать в коде есть неправильно /если я правильно понял, я новичок/. С qtextcodec просто эти русские надписи выводятся правильно, а на данные из базы это не шибко влияет добавлено спустя 6 часов 47 минут: Откомпилировал проект под Windows Буквы из базы выводятся правильно Однако: при попытке обнобления символами, отличными от английского алфавита, либо ничего не происходит, либо выдаются сообщения... ругань на ошибки в sql запросах. Английские символы вводятся без проблем... Помогите, плиз, справиться с проблемой
|