Russian Qt Forum

Qt => Базы данных => Тема начата: OlMi от Август 23, 2005, 11:39



Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: OlMi от Август 23, 2005, 11:39
При коннекте к Постгресу выдается сабж.
Как это убрать или чтоб было кои8-р?
С текстовыми строками все понятно, а вот
настроить драйвер БД или коннект не могу найти где -
может кто подскажет, чтоб исходный код не перетрахивать?

Qt-3.3.4, FreeBSD 4.11, PostgreSQL 7.4.8


Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: Admin от Август 23, 2005, 12:47
во первых надо определить кто хочет общатся в unicode

posgress или qt

похожая тема тут уже была но про mysql

я не знаток posgress но возможно там таже схема


Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: OlMi от Август 23, 2005, 12:59
Думаю, что драйвер. Он сначала запрашивает версию, как и положено, а потом идет эта команда:

2005-08-22 17:31:17 LOG:  команда: select version()
2005-08-22 17:31:17 LOG:  длительность: 76.911 мс
2005-08-22 17:31:17 LOG:  команда: SET CLIENT_ENCODING TO 'UNICODE'
2005-08-22 17:31:17 LOG:  длительность: 11.364 мс
2005-08-22 17:31:17 LOG:  команда: SET DATESTYLE TO 'ISO'
2005-08-22 17:31:17 LOG:  длительность: 0.499 мс

а дальше пошли мои  SQL запросы

Какие будут предложения?


Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: Admin от Август 23, 2005, 15:17
Варианты:
1. Копать драйвер, что бы koi8-r к примеру выставлял

2. Unicode - это случаем не utf8? Тогда можно было бы самому кодировку делать! Конечно затраты на перекодировку!


Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: OlMi от Август 24, 2005, 04:16
См. внимательно вопрос. Я, конечно и сам могу это место в исходниках найти.
Но, полагал, что спросить у знающих людей быстрее, при условии, конечно, что они есть.
Должен быть, в принципе, красивый вариант, типа "драйвер_или_плагин::МЕТОД_ВЫСТАВЛЕНИЯ_КОДИРОВКИ_ПРИ_КОННЕКТЕ(кодировка)".
Или это где-нить при наследовании можно дополнительно дообъявить (перенести из приватки в паблик). Мысль такая - это скорее всего делает экземпляр объекта плагина драйвера или базы при коннекте.
UNICODE имеется в качестве фичи в перечислении абстрактного драйвера.
А мне нужно, чтобы практически эту енкодировку менять при коннекте. Кое-что я уже нашел в исходниках, но пока только строки кода, а мне нужно НАЗВАНИЕ_МЕТОДА.


Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: OlMi от Август 24, 2005, 04:35
Уже нашел (см. ниже). Проблема теперь в том, что теперь точно известно, что рабочего метода, меняющего кодировку при коннекте не существует. Придется метод open переобъявлять или приспосабливаться как-то.

По дурному, конечно, сделано - жестко зашитая кодировка. И это-то в Си++!

bool QPSQLDriver::open( const QString & db,
                        const QString & user,
                        const QString & password,
                        const QString & host,
                        int port,
                        const QString& connOpts )
{

.... skipped

    pro = getPSQLVersion( d->connection );
    d->isUtf8 = setEncodingUtf8( d->connection );
    setDatestyle( d->connection );

    setOpen( TRUE );
    setOpenError( FALSE );
    return TRUE;
}


Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: OlMi от Август 26, 2005, 05:52
Маленькое дополнение.

Поскольку, как выяснилось, все в Qt сделано по стандарту UNICODE, ничего в драйверах менять не надо при коннекте. Наоборот, необходимо следить за тем, чтобы отдавая текст на русском языке, СУБД правильно осуществляла перекодировку из своей локальной в UNICODE. Иначе точно придется дописывать перекодировщик.

Пока все.


Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: Rainbow от Август 26, 2005, 12:28
Немогу понять зачем вся эта траханина? Не проще ли БД сразу сделать с поддержкой юникода?
Лично я всегда так делаю.


Название: SET CLIENT_ENCODING TO 'UNICODE'
Отправлено: OlMi от Август 27, 2005, 10:13
В СУБД POSTGRES поддержка UNICODE и так имеется.

Для работы с данными, хранящимися в СУБД, других клиентов, в том числе консольных, из разных ОС с разной локальной кодировкой необходимо осуществлять перекодировку "на лету". Как выяснилось, данная перекодировка выполняется корректно только при правильно указанной ENCODING для БД при ее создании (не путать с инициализацией СУБД). Что, в общем-то, закономерно, но было упущено первоначально из виду.

Что касается Вас, то, видимо, у Вас нет того клиентского многообразия кодировок, т.е. она у Вас всего одна, поэтому и проблемы, собственно такой у Вас нет.