Russian Qt Forum

Qt => Базы данных => Тема начата: Dodge от Июль 15, 2008, 13:47



Название: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Dodge от Июль 15, 2008, 13:47
Довольно простая ситуация, есть таблицы в бд psql, описанные:
Код:
CREATE TABLE my_item_names ( 
  id INT,
  "Имя" TEXT
);
CREATE TABLE my_item_names_2 (
  id INT,
  name TEXT
);

и

CREATE TABLE my_item_view (
  id INT,
  name_id INT
);

Для my_item_names получаю пустую вьюху:
Код:
QTableView * view = new QTableView;
view->setItemDelegate(new QSqlRelationalDelegate(view));

QSqlRelationalTableModel * model = new QSqlRelationalTableModel;
model->setTable( "my_item_view" );
model->setRelation( 1, QSqlRelation( "my_item_names", "id", "Имя" ) );

view->setModel( model );
view->show();



Для my_item_names_2 все ок:
Код:
model->setRelation( 1, QSqlRelation( "my_item_names_2", "id", "name" ) );

Баг?


Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Alex03 от Июль 15, 2008, 15:13
Что сразу баги у других то мерещатся.
Почитайте QTDIR/4.3.2/doc/html/i18n.html

Как один из методов лечения  QTextCodec::setCodecForCStrings().
Как второй tr("name", "Field name in table XXXXX").
Но проще всего не использовать такие поля.


Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Dodge от Июль 15, 2008, 15:20
Что сразу баги у других то мерещатся.
Почитайте QTDIR/4.3.2/doc/html/i18n.html

Как один из методов лечения  QTextCodec::setCodecForCStrings().
Как второй tr("name", "Field name in table XXXXX").
Но проще всего не использовать такие поля.

Ну скажем у меня все в utf-8 ... смысла в tr пока не вижу, ну раз уж про то разговор зашел, положил в tr - не помогло.

З.Ы. мне просто интересно, Alex03 вы просто посмотрели в код и решили что нужен tr или проверели?


Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Zmeishe от Июль 15, 2008, 15:27
Ну скажем у меня все в utf-8 ... смысла в tr пока не вижу, ну раз уж про то разговор зашел, положил в tr - не помогло.

З.Ы. мне просто интересно, Alex03 вы просто посмотрели в код и решили что нужен tr ...

А trUtf8(...) проверяли ?


Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Dodge от Июль 15, 2008, 15:33
А trUtf8(...) проверяли ?
тот же эффект


Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Mikhail от Июль 15, 2008, 21:43
Довольно простая ситуация, есть таблицы в бд psql, описанные:
Код:
CREATE TABLE my_item_names ( 
  id INT,
  "Имя" TEXT
);
CREATE TABLE my_item_names_2 (
  id INT,
  name TEXT
);

и

CREATE TABLE my_item_view (
  id INT,
  name_id INT
);

Для my_item_names получаю пустую вьюху:
Код:
QTableView * view = new QTableView;
view->setItemDelegate(new QSqlRelationalDelegate(view));

QSqlRelationalTableModel * model = new QSqlRelationalTableModel;
model->setTable( "my_item_view" );
model->setRelation( 1, QSqlRelation( "my_item_names", "id", "Имя" ) );

view->setModel( model );
view->show();



Для my_item_names_2 все ок:
Код:
model->setRelation( 1, QSqlRelation( "my_item_names_2", "id", "name" ) );

Баг?

В программе с спользованием MYSQL я поступал так:

QTextCodec * codec;
codec->toUnicode("Наименование");
QString  tabledepartament_name = codec->toUnicode("Наименование");
QSqlRelationalTableModel model->setRelation(3, QSqlRelation(tabledepartament, "ID", tabledepartament_name));

И все отрабатывалось.
Сервер в моем случае MYSQL настроен на CP1251.
Первой командой после соединения с базой было:
SET NAMES cp1251;


Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Dodge от Июль 15, 2008, 21:51
проблему так и не решил, подставил костыль. Залеппил имя столбца латиницей, а после установки параметров реляции задаю имя столбца через setHeaderData. Косяк  :'(


Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Alex03 от Июль 16, 2008, 06:42
Что сразу баги у других то мерещатся.
Почитайте QTDIR/4.3.2/doc/html/i18n.html

Как один из методов лечения  QTextCodec::setCodecForCStrings().
Как второй tr("name", "Field name in table XXXXX").
Но проще всего не использовать такие поля.

Ну скажем у меня все в utf-8 ... смысла в tr пока не вижу, ну раз уж про то разговор зашел, положил в tr - не помогло.

З.Ы. мне просто интересно, Alex03 вы просто посмотрели в код и решили что нужен tr или проверели?
Я не проверял, но в Qt по умолчанию любое QString("Имя") приведёт к тому что в объекте QString не будет юникодного представления указанной строки (всё что не Latin1 обрезается).
Явно задать кодировку строковых констант исходников "неявно" преобразуемых в QString можно с помощью QTextCodec::setCodecForCStrings(кодек_соответствующий_кодировке_исходника).
tr()/trUtf8() в данном случае конечно же не клёво, т.к. имя поля таблицы становится зависимым от файла перевода, хотя если у Вас имена полей в БД всегда локализованы, то это может иметь смысл.
То что у Вас исходники в Utf8 - очень хорошо, пользуйте QString::fromUtf8("Имя") и будет Вам счастье.

Это всё что касается преобразования строковых констант исходников в QString.
Если и после этого у Вас не всё как надо, то тут уж надо ковырять дальше, и вопрос там более обширный.
Какая БД, какая кодировка строк в БД, какие настройки кодировок у клиента БД, умеет ли QT драйвер БД корректно всё это обрабатывать (может ещё его настройки)?
Поэтому естественно я всё это проверить не мог.




Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Dodge от Июль 16, 2008, 11:10
Я не проверял, но в Qt по умолчанию любое QString("Имя") приведёт к тому что в объекте QString не будет юникодного представления указанной строки (всё что не Latin1 обрезается).
Явно задать кодировку строковых констант исходников "неявно" преобразуемых в QString можно с помощью QTextCodec::setCodecForCStrings(кодек_соответствующий_кодировке_исходника).
tr()/trUtf8() в данном случае конечно же не клёво, т.к. имя поля таблицы становится зависимым от файла перевода, хотя если у Вас имена полей в БД всегда локализованы, то это может иметь смысл.
То что у Вас исходники в Utf8 - очень хорошо, пользуйте QString::fromUtf8("Имя") и будет Вам счастье.

Это всё что касается преобразования строковых констант исходников в QString.
Если и после этого у Вас не всё как надо, то тут уж надо ковырять дальше, и вопрос там более обширный.
Какая БД, какая кодировка строк в БД, какие настройки кодировок у клиента БД, умеет ли QT драйвер БД корректно всё это обрабатывать (может ещё его настройки)?
Поэтому естественно я всё это проверить не мог.

Еще раз повторяю, у меня все в utf8! я имею ввиду и данные в бд, и кодировку бд, и кодировка в исходниках, и кодеки для си стр, тр, локали установленны в utf8, и в системе локаль юнокод.
Абстрагируйтесь от юникода, что может быть еще?
субд - psql

З.Ы. спасибо за труды  :)


Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Alex03 от Июль 16, 2008, 12:43
Ну я ж не экстрасенс, чтобы понять что у Вас совсем всё в UTF-8. :)
Абстрагироваться от юникода/кодировок в данном топике ИМХО както не правильно. :)
С psql дел не имел, мож чего отсюда поможет:

Цитировать
QPSQL Unicode Support

The QPSQL driver automatically detects whether the PostgreSQL database you are connecting to supports Unicode or not. Unicode is automatically used if the server supports it. Note that the driver only supports the UTF-8 encoding. If your database uses any other encoding, the server must be compiled with Unicode conversion support.

Unicode support was introduced in PostgreSQL version 7.1 and it will only work if both the server and the client library have been compiled with multibyte support. More information about how to set up a multibyte enabled PostgreSQL server can be found in the PostgreSQL Administrator Guide, Chapter 5.

Данные и метаданные вещи разные, надо чтобы qt-драйвер, клиент и сервер БД позволяли произвольные строки в метаданных.

Кстати почему пустой то список? Как там с lastError()?
Я бы начал с того что посмотрел что возвращает QSqlRelationalTableModel::selectStatement(), и попытался засунуть такой запрос в QSqlQueryModel.
Многие серверы БД требуют "обёртывать" имена метаобъектов которые не в латинице в запросах, как то заключать в кавычки и т.д. Хотя это вроде делается.




Название: Re: [qt4.4.0] Нелатинские символы в именах столбцов для таблиц участвующих в реляции
Отправлено: Tonal от Июль 16, 2008, 13:58
Ежели смотреть в текст драйвера, можно найти такие строки:
Код:
QSqlRecord QPSQLResult::record() const
...
    for (int i = 0; i < count; ++i) {
        QSqlField f;
        if (d->driver->isUtf8)
            f.setName(QString::fromUtf8(PQfname(d->result, i)));
        else
            f.setName(QString::fromLocal8Bit(PQfname(d->result, i)));
...
Смотрим, где выставляется флажёк isUtf8 и находим только:
Код:
class QPSQLDriverPrivate
{
public:
    QPSQLDriverPrivate(): connection(0), isUtf8(false), pro(QPSQLDriver::Version6) {}
...
Правда Qt у меня 4.3.4 может в 4.4.0 что-нибудь отличается...