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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: MySQL 5 + Qt 4.2 = нет русской кодировки  (Прочитано 10990 раз)
:::XD:::
Гость
« : Январь 26, 2007, 03:21 »

Знаю знаю, писали уже многие об этой проблемы, перепробывал все.

Подскажите что не так. Таблица и колонка в MySQL в utf8

вот код

Код:

#include "qtsql.h"
#include <QtSql>
#include <QMessageBox>
#include <QTextCodec>

QtSQL::QtSQL(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);

//QTextCodec *codec=QTextCodec::codecForName("utf8");
//QTextCodec::setCodecForCStrings(codec);

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

db.setUserName("root");
db.setPassword("root");
db.setHostName("localhost");
db.setDatabaseName("test");

bool opened = db.open();
if (!opened) QMessageBox::information(this, "title", "problem", QMessageBox::Ok);

QSqlQuery q("SET NAMES utf8;");
}

void QtSQL::on_btn_clicked()
{
QSqlQuery q3("DELETE FROM `encoding` WHERE ID = 10;");

QSqlQuery q("INSERT INTO `encoding` SET ID = 10, `Text` = '" + ui.txtRead->text() + "';");
//QSqlQuery q("INSERT INTO `encoding` SET ID = 10, `Text` = 'ывыв';");
}

void QtSQL::on_btn_2_clicked()
{
QTextCodec *codec=QTextCodec::codecForName("utf8");
QTextCodec::setCodecForCStrings(codec);

QSqlQuery q("SELECT * FROM `encoding` WHERE ID = 10;");
q.next();

QSqlRecord rec = q.record();

ui.txt->setText(rec.value("Text").toString());
}


1) При включенном кодеке (вверху) всегда добавляет в таблицу "???"
2) Если беру значение из текстбокса - всегда в таблице "???"
3) Выберая из таблице получаю что-то вроде: uaua (только со значками над буквами)

Заранее спасибо!
Записан
crocus
Гость
« Ответ #1 : Январь 26, 2007, 06:00 »

НЕ
Цитировать
QSqlQuery q("SET NAMES utf8;");

А
Цитировать
("SET NAMES utf8_general_ci;");
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #2 : Январь 26, 2007, 08:38 »

Откуда уверенность что MySql работает в кодировке utf8?

Скорее всего ты не прописал для MySql кодировку utf8 в файле my.ini:

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=utf8

поэтому и получаешь вопросы.

А использование QSqlQuery q("SET NAMES utf8;"); верное.
Записан
_govorilka
Гость
« Ответ #3 : Январь 27, 2007, 06:51 »

Вмеcто utf8, лучще использовать Utf8 (utf8_general_ci).
Записан
:::XD:::
Гость
« Ответ #4 : Январь 27, 2007, 11:07 »

спасибо всем за ответы!!!

To _govorilka:
utf8 и больше места ест, и насколько я помню по нему поиск делается помедленней

To Mikhail:
в my.ini проверил, есть такая строка.

To crocus:
("SET NAMES utf8_general_ci;"); - пишет неверно указана кодировка
Записан
_govorilka
Гость
« Ответ #5 : Январь 31, 2007, 06:16 »

Цитата: ":::XD:::"
спасибо всем за ответы!!!

To _govorilka:
utf8 и больше места ест, и насколько я помню по нему поиск делается помедленней



Только теоритически!!! Вернее на нормальной машине разницы не замечаешь. Строки действительно занимают больше места почти в два раза... Но тот факт, что при Utf8 не нужно бесконечно переходить из одной кодировки в другую сглаживает все недостатки. Кстати ты знаешь, что QString хранит все данные в Unicode... И еще, Utf8 можно использовать только в настройках клиента, а сами данные хранить в какой угодно кодировке.
Записан
crocus
Гость
« Ответ #6 : Январь 31, 2007, 07:03 »

Ну у меня при
Цитировать
QSqlQuery q("SET NAMES utf8;");

русские символы квадратами рисует и независимо что в my.ini  прописано  -latin1 или ср1251, и еще кодеки вроде надо в main прописывать типа так:
Код:
int main(int argc, char *argv[])
{
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
   QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
Записан
_govorilka
Гость
« Ответ #7 : Январь 31, 2007, 12:49 »

Цитата: "crocus"
Ну у меня при
Цитировать
QSqlQuery q("SET NAMES utf8;");

русские символы квадратами рисует и независимо что в my.ini  прописано  -latin1 или ср1251, и еще кодеки вроде надо в main прописывать типа так:
Код:
int main(int argc, char *argv[])
{
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
   QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));


Вот это у меня в mysql.ini написано и все работает:

[mysql]
default-character-set=utf8
character-sets-dir="../charsets/"
Записан
:::XD:::
Гость
« Ответ #8 : Январь 31, 2007, 14:58 »

все пробовал, и bind и просто строкой, высылаю архивчик. очень расчитываю на вашу помощь.

http://www.olegrom.com/QtSQL.zip

Заранее огромное спасибо!
Записан
_govorilka
Гость
« Ответ #9 : Февраль 07, 2007, 10:19 »

Цитата: ":::XD:::"
все пробовал, и bind и просто строкой, высылаю архивчик. очень расчитываю на вашу помощь.

http://www.olegrom.com/QtSQL.zip

Заранее огромное спасибо!


Можно, вопрос. А почему тебе не попробывать вообще без QtSQL работать. В дистрибутиве Mysql есть все необходимые *.h и нормальная, оптимизированная Lib и Dll. Справка по функциям API есть там же в дистрибутиве. Могу и свой исходник скинуть, если надо, конечно.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #10 : Февраль 07, 2007, 11:59 »

писать на mysql либе достаточно затруднительно
но есть кучка враперов под это дело
Записан
_govorilka
Гость
« Ответ #11 : Февраль 07, 2007, 12:39 »

Цитата: "Admin"
писать на mysql либе достаточно затруднительно
но есть кучка враперов под это дело

По какой причине трудно?.. Я пользуюсь mysql.lib уже 2года, и при этом у меня нет проблем с кодировками, подключениями и т.д.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #12 : Февраль 07, 2007, 17:25 »

:::XD:::

все проблемы в файле драйвера qsql_mysql.cpp в следующем коде:


#ifndef QT_NO_TEXTCODEC
static QTextCodec* codec(MYSQL* mysql)
{
#if MYSQL_VERSION_ID >= 32321
    QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql));
    if (heuristicCodec)
        return heuristicCodec;
#endif
    return QTextCodec::codecForLocale();
}
#endif // QT_NO_TEXTCODEC

скорее всего он возвращает latin1 отсюда и вопросы вместо русских букв.

Для решения проблемы необходимо определить MYSQL_VERSION_ID.
либо просто заставить функцию возвращать что то типа
QTextCodec::codecForName("utf8");
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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