Russian Qt Forum

Qt => Базы данных => Тема начата: neosapient от Июнь 15, 2010, 12:38



Название: MySQL и cp1251 - помогите настроить русский язык
Отправлено: neosapient от Июнь 15, 2010, 12:38
Здравствуйте.

Пользовался поиском - подобных вопросов нашел много, но не ответа не нашел.

Есть БД со следующими настройками:
Цитировать
character_set_client = cp1251
character_set_connection = cp1251
character_set_database = utf8
character_set_filesystem = binary
character_set_results = cp1251
character_set_server = utf8
character_set_system = utf8

Следующий код выводит вместо русских букв знаки вопроса "? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?", Как это и исправить ?
Код:
#include <QtGui>
#include <QtSql>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));

    QSqlDatabase my_db = QSqlDatabase::addDatabase("QMYSQL", "mysql_db");
    my_db.setHostName("192.168.1.2");
    my_db.setDatabaseName("report");
    my_db.setUserName("1C");
    my_db.setPassword("1C");
    my_db.open();
    my_db.exec("SET NAMES cp1251");
    QSqlQuery query(my_db);
    query.exec("SELECT name,login FROM tbl_users");
    while (query.next()) {
        QString name = query.value(0).toString();
        qDebug() << name;
        char localbuf[256]={0};
        sprintf(localbuf,"%s",name.toAscii().data());
    }
}


Название: Re: MySQL и cp1251 - помогите настроить русский язык
Отправлено: crossly от Июнь 15, 2010, 12:43
зачем тебе cp1251??.... храни в utf-8


Название: Re: MySQL и cp1251 - помогите настроить русский язык
Отправлено: neosapient от Июнь 15, 2010, 12:49
Цитировать
зачем тебе cp1251??.... храни в utf-8
БД - офисная и существеут в данном состоянии уже год.
Изменить её настройки - не имею права.

Как мне правильно считать русские буквы из БД ?


Название: Re: MySQL и cp1251 - помогите настроить русский язык
Отправлено: crossly от Июнь 15, 2010, 12:54
епть.... так у вас и так хранится все в utf-8... смотри внимательно конфиг


Название: Re: MySQL и cp1251 - помогите настроить русский язык
Отправлено: neosapient от Июнь 15, 2010, 13:10
С MySQL полноценно работать не приходилось.

Что следует изменить в коде примера (из первого поста), чтобы правильно считывались данные ?


Название: Re: MySQL и cp1251 - помогите настроить русский язык
Отправлено: lit-uriy от Июнь 15, 2010, 13:47
>>Что следует изменить в коде
изменить строку:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
на:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

убрать строку:
my_db.exec("SET NAMES cp1251");


Название: Re: MySQL и cp1251 - помогите настроить русский язык
Отправлено: neosapient от Июнь 15, 2010, 14:29
Понял. Получилось.  :)

Код:

#include <QtGui>
#include <QtSql>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));

    QSqlDatabase my_db = QSqlDatabase::addDatabase("QMYSQL", "mysql_db");
    my_db.setHostName("192.168.1.2");
    my_db.setDatabaseName("report");
    my_db.setUserName("1C");
    my_db.setPassword("1C");
    my_db.open();
    QSqlQuery query(my_db);
    query.exec("SELECT name,login FROM tbl_users");
    while (query.next()) {
        QString name = query.value(0).toString();
        qDebug() << name;
        char localbuf[256]={0};
        sprintf(localbuf,"%s",name.toLocal8Bit().data());
    }
}


Название: Re: MySQL и cp1251 - помогите настроить русский язык
Отправлено: lit-uriy от Июнь 15, 2010, 16:47
>>QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
а для чего ты кодек локали устанавливаешь? у тебя локаль системы отличается от Windows-1251?