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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Просьба по Qt + MySQL  (Прочитано 10429 раз)
L.Marvell
Гость
« : Июль 28, 2006, 13:37 »

Перечитал топики по отображению кирилицы в связке Qt + MySQL, но разобраться не совсем удалось. Заработало только, когда перевожу перед записью в базу строки в utf8 (toUtf8()) и обратное преобразование fromUtf8(). Но тогда приходится для отображения использовать QSqlQuery, проходить по каждому значеню, преобразовывать его fromUtf8(), записывать в QStringList, и в QListWidgetItem. (К тому же, когда вывожу сообщение об ошибке query.lastError().text(), то соответственно вводимое значение выводится кракозябрами, т.к. уже преобразовано в utf).
Может ли кто написать небольшую инструкцию как настроить MySQL и какие действия произвести в программе дабы нормально отображалась кирилица через QSqlQueryModel?
Записан
alexis
Гость
« Ответ #1 : Июль 28, 2006, 14:22 »

В какой кодировке база mysql?
Какая локаль используется?
Записан
L.Marvell
Гость
« Ответ #2 : Июль 28, 2006, 14:39 »

MySQl крутится под линуксом с локалью KOI8-U и чтобы иметь возможность просматривать данные в консоли (на начальной стадии думаю пригодится), я так подозреваю, база также должна быть koi8u.
На счет кодировки не совсем понял....
Записан
alexis
Гость
« Ответ #3 : Июль 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();
}
Записан
L.Marvell
Гость
« Ответ #4 : Июль 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. Пока будет так.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #5 : Июль 28, 2006, 17:46 »

на PHP проблемы такого рода решаются так
сразу после коннекта клиент сообщает серверу кодировку общения

делается это запросом

SET NAMES koi8r;

началось это все с 4.1 версии MYSQL
Записан
alexis
Гость
« Ответ #6 : Июль 28, 2006, 18:26 »

ну и какого хера windows-1251 если у тебя koi8-u в базе?Непонимающий
Записан
L.Marvell
Гость
« Ответ #7 : Июль 29, 2006, 11:56 »

Линукс с локалью koi8-u. Базу пробовал настроить так, как Вы указывали, т.е. с настройками по-умолчанию и результат я привел выше.
З.Ы. Ругань не лучший способ указать человеку на его ошибки. Я описал метод с которым у меня работает, хотя может и не лучший вариант. Если подскажете как сделать лучше, буду благодарен.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #8 : Июль 29, 2006, 13:07 »

твой способ пойдет для собственного сервака
а если доступ к конфигурации сервака запрещен
то клинтской программе надо сообщать на какой кодировке она общается с сервером
Записан
simulacrum
Гость
« Ответ #9 : Ноябрь 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();
}


Подскажите, как можно исправить...
Записан
crocus
Гость
« Ответ #10 : Ноябрь 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,  а под Виндой так работает.
Записан
simulacrum
Гость
« Ответ #11 : Ноябрь 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();
}


единственное, на что влиялет вообще /в обоих случаях/
Код:
QTextCodec
, так это на представлиние
Код:
   table.addColumn( "sitename", "Название сайта" );
    table.addColumn( "siteowner", "Владелец сайта" );
А это вроде само по себе указывать в коде есть неправильно /если я правильно понял, я новичок/. С qtextcodec просто эти русские надписи выводятся правильно, а на данные из базы это не шибко влияет

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

 Откомпилировал проект под Windows

Буквы из базы выводятся правильно

Однако: при попытке обнобления символами, отличными от английского алфавита, либо ничего не происходит, либо выдаются сообщения... ругань на ошибки в sql запросах.

Английские символы вводятся без проблем...

Помогите, плиз, справиться с проблемой
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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