Страница 1 из 1
Указать верную кодировку для работы клиентского ПО с iBase
Добавлено: 13 сен 2006, 16:14
EvilsInterrupt
Код: Выделить всё
{$REGION 'SETTINGS INTERBASE'}
// Настройка соединения с InterBase
with IBDatabase do
begin
Connected := False;
LoginPrompt := False;
Params.Clear;
DatabaseName := IBserver + ':';
DatabaseName := DatabaseName + IBDbName;
Params.Add('lc_ctype=WIN1251');
Params.Add('user_name='+IBuser);
Params.Add('password='+IBpassword);
mLog.Lines.Add(IBDatabase.Params.Text);
SQLDialect := 3;
end;
У меня вылезает ошибка связанная с кодировкой, вот и убираю я строку Params.Add('lc_ctype=WIN1251'); и запрос проходит на ура!
Но очень хочется задать правильную кодировку базы данных на основе iBase, но как узнать кодировки уже созданной БД пока не знаю.
Подскажить пожалуйста, как можно узнать запросом кодировку уже созданной базы данных на основе InterBase?
Добавлено: 13 сен 2006, 16:28
WildSery
Код: Выделить всё
select rdb$character_set_name from rdb$database
А что за запрос, не select * from rdb$exceptions случайно?
Добавлено: 14 сен 2006, 12:38
EvilsInterrupt
Нет не помогло!
Мне это надо для того, чтобы программно определить кодировку!
Добавить в IBdataBase.Param.add и не знать никаких головных болей с кодировкой!
А таблицу уже создали, более того, отключать добавление данных категорически запрещено, даже на короткий срок!
Прошу откликнуться, если есть знатоки
Добавлено: 14 сен 2006, 12:50
WildSery
Знатоков тут есть. Только ты ничего не спросил. Набор утверждений и предположений вопросом не является.
Добавлено: 14 сен 2006, 13:12
kdv
А таблицу уже создали, более того, отключать добавление данных категорически запрещено, даже на короткий срок!
короче, как всегда, засуетились, и сделали не по человечески.
База создана в какой кодировке? Данные заносились и заносятся в какой кодировке?
www.ibase.ru/devinfo/ibrusfaq.htm
Добавлено: 14 сен 2006, 13:12
EvilsInterrupt
Только ты ничего не спросил
Видишь строку:
уже созданной базы данных на основе InterBase
1)
Это означает, что есть совокупность таблиц составляющая БАзу данных на основе СУБД InterBase!
2)
Params.Add('lc_ctype=WIN1251');
Это говорит о том, что в клиентской программе указывается кодировка!
3)
вот и убираю я строку Params.Add('lc_ctype=WIN1251'); и запрос проходит на ура!
Это говорит о том, что я указывал не верную кодировку в клиентском ПО!
4)
Подскажите пожалуйста, как можно узнать запросом кодировку уже созданной базы данных на основе InterBase?
Это значит надо написать запрос, который можно через компонент IBQuery.SelectSQL.Add(тута_нужный мне запрос) послать СУБД InterBase чтобы узнать кодировку в Базе данных которая работает под управлением этой СУБД, естественно БД это совокупность таблиц, следовательно обращение должно быть к каждой из таблиц.
Скажи это так сложно было понять?
Добавлено: 14 сен 2006, 13:17
WildSery
Судя по всему, ты думаешь, что в базе может быть текст только с одной-единственной кодировкой?
Если я через строку буду коннектиться с другим чарсетом и лепить туда русский, то ты вообще хрен что прочитаешь в такой базе, и ничего тебе не поможет.
Добавлено: 14 сен 2006, 14:12
stix-s
WildSery писал(а):Судя по всему, ты думаешь, что в базе может быть текст только с одной-единственной кодировкой?
Если я через строку буду коннектиться с другим чарсетом и лепить туда русский, то ты вообще хрен что прочитаешь в такой базе, и ничего тебе не поможет.
мммм, а зачем может понадобиться создавать в базе таблицы с разными кодировками? или скажем поля в одной таблице с разными опять-таки кодировками
Добавлено: 14 сен 2006, 14:21
stix-s
EvilsInterrupt писал(а):
Нет не помогло!
а что не помогло-то? запрос-то, указанный
WildSery: select rdb$character_set_name from rdb$database тебе что вернул?
Добавлено: 14 сен 2006, 14:25
WildSery
stix-s писал(а):мммм, а зачем может понадобиться создавать в базе таблицы с разными кодировками? или скажем поля в одной таблице с разными опять-таки кодировками
Из вредности

Хочу получить информацию прямо из строки, с каким же чарсетом туда её запихали, и добавить этот чарсет в настройку соединения (до того как прочитал эту строку). Не помню я, что туда пихал - чё, сервер сам не знает, что хранит, пусть у него голова болит!
Добавлено: 14 сен 2006, 15:16
stix-s
WildSery писал(а):
Из вредности

Хочу получить информацию прямо из строки, с каким же чарсетом туда её запихали, и добавить этот чарсет в настройку соединения (до того как прочитал эту строку). Не помню я, что туда пихал - чё, сервер сам не знает, что хранит, пусть у него голова болит!
Да уж, занятие не для слабонервных - даже зная чарсет, подцепился, проапдейтил поле с нужным чарсетом, отцепился, поменял чарсет, снова подцепился, и т.д. в результате - каша
Добавлено: 14 сен 2006, 15:23
kdv
Видишь строку:
уже созданной базы данных на основе InterBase
1)
Это означает, что есть совокупность таблиц составляющая БАзу данных на основе СУБД InterBase!
2)
хватить буянить.
Params.Add('lc_ctype=WIN1251');
Это говорит о том, что в клиентской программе указывается кодировка!
да, но это не говорит о том, что человек создавал базу в 1251 или записывал данные в 1251.
3)вот и убираю я строку Params.Add('lc_ctype=WIN1251'); и запрос проходит на ура!
Это говорит о том, что я указывал не верную кодировку в клиентском ПО!
ДА! Это говорит о том, что я указал в своем предыдущем письме. Нахреначил данных в какой попало кодировке, а теперь все хочешь видеть в 1251? Не получится. Базу или пересоздавать и копировать.
Добавлено: 14 сен 2006, 15:30
Merlin
stix-s писал(а):
мммм, а зачем может понадобиться создавать в базе таблицы с разными кодировками? или скажем поля в одной таблице с разными опять-таки кодировками
Справочник лекарственных растений, произрастающих на территории бывшей Чехословацкой Республики, с названиями на чешском, словацком, немецком, француском и русском. Это я не придумал, просто вспомнил как Алекс кувыркался именно с энтим делом годов эдак 8 назад. Щас вроде с юникодой нормализовалось, попроще стало, а тогда это была не задача, а монстрик, с многочисленными соединениями и сборкой представлений на клиенте.
Добавлено: 15 сен 2006, 06:29
stix-s
Merlin писал(а):
Справочник лекарственных растений, произрастающих на территории бывшей Чехословацкой Республики, с названиями на чешском, словацком, немецком, француском и русском. Это я не придумал, просто вспомнил как Алекс кувыркался именно с энтим делом годов эдак 8 назад. Щас вроде с юникодой нормализовалось, попроще стало, а тогда это была не задача, а монстрик, с многочисленными соединениями и сборкой представлений на клиенте.
а чарсет базы NONE и при соединении NONE, обработка разных кодировок на клиенте не спасает?
Добавлено: 15 сен 2006, 06:32
stix-s
Merlin писал(а):
Справочник лекарственных растений, произрастающих на территории бывшей Чехословацкой Республики, с названиями на чешском, словацком, немецком, француском и русском. Это я не придумал, просто вспомнил как Алекс кувыркался именно с энтим делом годов эдак 8 назад. Щас вроде с юникодой нормализовалось, попроще стало, а тогда это была не задача, а монстрик, с многочисленными соединениями и сборкой представлений на клиенте.
дааа, о многоязычных спраовчниках я не подумал

а чарсет базы NONE и при соединении NONE, обработка разных кодировок на клиенте не спасает?
Добавлено: 15 сен 2006, 13:34
Merlin
И как ты тудыть всякие там умляуты затолкаешь и потом по ним, скажем, отсортируешь?
Добавлено: 18 сен 2006, 10:41
EvilsInterrupt
stix-s писал(а):EvilsInterrupt писал(а):
Нет не помогло!
а что не помогло-то? запрос-то, указанный
WildSery: select rdb$character_set_name from rdb$database тебе что вернул?
Ничего, только <null>
что я указал в своем предыдущем письме. Нахреначил данных в какой попало кодировке...
База мне досталась в том виде с каким я щас работаю, причем это на Пирамеде(есть такое понятие в средствах Автоматизации промышленности), но это не важно главное узнать, кодировку!
Добавлено: 18 сен 2006, 10:48
kdv
База мне досталась в том виде с каким я щас работаю, причем это на Пирамеде(есть такое понятие в средствах Автоматизации промышленности), но это не важно главное узнать, кодировку!
раз у тебя в чарсете базы null, и даже не
none, то фиг знает, с какой кодировкой были созданы строковые столбцы в таблицах, или с какой кодировкой данные были занесены в базу.
Я тебе ссылку на faq по "русским буквам" дал, там все предельно просто. И оттуда же следует что win1251 тебе при коннекте указывать не нужно. Т.е. резюме такое - в базе с кодировками или уже был устроен бардак, или наоборот, ты его пытаешься устроить.
Добавлено: 18 сен 2006, 11:01
WildSery
EvilsInterrupt писал(а):Ничего, только <null>
Очень интересная ошибка. В обычной базе такого быть не может, там хоть NONE, но стоит.
Добавлено: 18 сен 2006, 14:52
stix-s
Merlin писал(а):И как ты тудыть всякие там умляуты затолкаешь и потом по ним, скажем, отсортируешь?
Вот соберусь, попробую, расскажу

ежели получится