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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: SET CLIENT_ENCODING TO 'UNICODE'  (Прочитано 7928 раз)
OlMi
Гость
« : Август 23, 2005, 11:39 »

При коннекте к Постгресу выдается сабж.
Как это убрать или чтоб было кои8-р?
С текстовыми строками все понятно, а вот
настроить драйвер БД или коннект не могу найти где -
может кто подскажет, чтоб исходный код не перетрахивать?

Qt-3.3.4, FreeBSD 4.11, PostgreSQL 7.4.8
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Август 23, 2005, 12:47 »

во первых надо определить кто хочет общатся в unicode

posgress или qt

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

я не знаток posgress но возможно там таже схема
Записан
OlMi
Гость
« Ответ #2 : Август 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 запросы

Какие будут предложения?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #3 : Август 23, 2005, 15:17 »

Варианты:
1. Копать драйвер, что бы koi8-r к примеру выставлял

2. Unicode - это случаем не utf8? Тогда можно было бы самому кодировку делать! Конечно затраты на перекодировку!
Записан
OlMi
Гость
« Ответ #4 : Август 24, 2005, 04:16 »

См. внимательно вопрос. Я, конечно и сам могу это место в исходниках найти.
Но, полагал, что спросить у знающих людей быстрее, при условии, конечно, что они есть.
Должен быть, в принципе, красивый вариант, типа "драйвер_или_плагин::МЕТОД_ВЫСТАВЛЕНИЯ_КОДИРОВКИ_ПРИ_КОННЕКТЕ(кодировка)".
Или это где-нить при наследовании можно дополнительно дообъявить (перенести из приватки в паблик). Мысль такая - это скорее всего делает экземпляр объекта плагина драйвера или базы при коннекте.
UNICODE имеется в качестве фичи в перечислении абстрактного драйвера.
А мне нужно, чтобы практически эту енкодировку менять при коннекте. Кое-что я уже нашел в исходниках, но пока только строки кода, а мне нужно НАЗВАНИЕ_МЕТОДА.
Записан
OlMi
Гость
« Ответ #5 : Август 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;
}
Записан
OlMi
Гость
« Ответ #6 : Август 26, 2005, 05:52 »

Маленькое дополнение.

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

Пока все.
Записан
Rainbow
Гость
« Ответ #7 : Август 26, 2005, 12:28 »

Немогу понять зачем вся эта траханина? Не проще ли БД сразу сделать с поддержкой юникода?
Лично я всегда так делаю.
Записан
OlMi
Гость
« Ответ #8 : Август 27, 2005, 10:13 »

В СУБД POSTGRES поддержка UNICODE и так имеется.

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

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


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