Указать верную кодировку для работы клиентского ПО с iBase

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Указать верную кодировку для работы клиентского ПО с iBase

Сообщение EvilsInterrupt » 13 сен 2006, 16:14

Код: Выделить всё

{$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?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 сен 2006, 16:28

Код: Выделить всё

select rdb$character_set_name from rdb$database
А что за запрос, не select * from rdb$exceptions случайно?

EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Сообщение EvilsInterrupt » 14 сен 2006, 12:38

Нет не помогло! :(

Мне это надо для того, чтобы программно определить кодировку!
Добавить в IBdataBase.Param.add и не знать никаких головных болей с кодировкой!

А таблицу уже создали, более того, отключать добавление данных категорически запрещено, даже на короткий срок!

Прошу откликнуться, если есть знатоки

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 сен 2006, 12:50

Знатоков тут есть. Только ты ничего не спросил. Набор утверждений и предположений вопросом не является.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 сен 2006, 13:12

А таблицу уже создали, более того, отключать добавление данных категорически запрещено, даже на короткий срок!
короче, как всегда, засуетились, и сделали не по человечески.
База создана в какой кодировке? Данные заносились и заносятся в какой кодировке?

www.ibase.ru/devinfo/ibrusfaq.htm

EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Сообщение EvilsInterrupt » 14 сен 2006, 13:12

Только ты ничего не спросил
Видишь строку:
уже созданной базы данных на основе InterBase

1)
Это означает, что есть совокупность таблиц составляющая БАзу данных на основе СУБД InterBase!

2)
Params.Add('lc_ctype=WIN1251');

Это говорит о том, что в клиентской программе указывается кодировка!

3)
вот и убираю я строку Params.Add('lc_ctype=WIN1251'); и запрос проходит на ура!

Это говорит о том, что я указывал не верную кодировку в клиентском ПО!

4)
Подскажите пожалуйста, как можно узнать запросом кодировку уже созданной базы данных на основе InterBase?

Это значит надо написать запрос, который можно через компонент IBQuery.SelectSQL.Add(тута_нужный мне запрос) послать СУБД InterBase чтобы узнать кодировку в Базе данных которая работает под управлением этой СУБД, естественно БД это совокупность таблиц, следовательно обращение должно быть к каждой из таблиц.

Скажи это так сложно было понять?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 сен 2006, 13:17

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 14 сен 2006, 14:12

WildSery писал(а):Судя по всему, ты думаешь, что в базе может быть текст только с одной-единственной кодировкой?
Если я через строку буду коннектиться с другим чарсетом и лепить туда русский, то ты вообще хрен что прочитаешь в такой базе, и ничего тебе не поможет.
мммм, а зачем может понадобиться создавать в базе таблицы с разными кодировками? или скажем поля в одной таблице с разными опять-таки кодировками

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 14 сен 2006, 14:21

EvilsInterrupt писал(а): Нет не помогло! :(
а что не помогло-то? запрос-то, указанный WildSery: select rdb$character_set_name from rdb$database тебе что вернул?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 сен 2006, 14:25

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 14 сен 2006, 15:16

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 сен 2006, 15:23

Видишь строку:
уже созданной базы данных на основе InterBase
1)
Это означает, что есть совокупность таблиц составляющая БАзу данных на основе СУБД InterBase!
2)
хватить буянить.
Params.Add('lc_ctype=WIN1251');
Это говорит о том, что в клиентской программе указывается кодировка!
да, но это не говорит о том, что человек создавал базу в 1251 или записывал данные в 1251.
3)вот и убираю я строку Params.Add('lc_ctype=WIN1251'); и запрос проходит на ура!

Это говорит о том, что я указывал не верную кодировку в клиентском ПО!
ДА! Это говорит о том, что я указал в своем предыдущем письме. Нахреначил данных в какой попало кодировке, а теперь все хочешь видеть в 1251? Не получится. Базу или пересоздавать и копировать.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 сен 2006, 15:30

stix-s писал(а): мммм, а зачем может понадобиться создавать в базе таблицы с разными кодировками? или скажем поля в одной таблице с разными опять-таки кодировками
Справочник лекарственных растений, произрастающих на территории бывшей Чехословацкой Республики, с названиями на чешском, словацком, немецком, француском и русском. Это я не придумал, просто вспомнил как Алекс кувыркался именно с энтим делом годов эдак 8 назад. Щас вроде с юникодой нормализовалось, попроще стало, а тогда это была не задача, а монстрик, с многочисленными соединениями и сборкой представлений на клиенте.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 15 сен 2006, 06:29

Merlin писал(а): Справочник лекарственных растений, произрастающих на территории бывшей Чехословацкой Республики, с названиями на чешском, словацком, немецком, француском и русском. Это я не придумал, просто вспомнил как Алекс кувыркался именно с энтим делом годов эдак 8 назад. Щас вроде с юникодой нормализовалось, попроще стало, а тогда это была не задача, а монстрик, с многочисленными соединениями и сборкой представлений на клиенте.
а чарсет базы NONE и при соединении NONE, обработка разных кодировок на клиенте не спасает?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 15 сен 2006, 06:32

Merlin писал(а): Справочник лекарственных растений, произрастающих на территории бывшей Чехословацкой Республики, с названиями на чешском, словацком, немецком, француском и русском. Это я не придумал, просто вспомнил как Алекс кувыркался именно с энтим делом годов эдак 8 назад. Щас вроде с юникодой нормализовалось, попроще стало, а тогда это была не задача, а монстрик, с многочисленными соединениями и сборкой представлений на клиенте.
дааа, о многоязычных спраовчниках я не подумал :(
а чарсет базы NONE и при соединении NONE, обработка разных кодировок на клиенте не спасает?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 сен 2006, 13:34

И как ты тудыть всякие там умляуты затолкаешь и потом по ним, скажем, отсортируешь?

EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Сообщение EvilsInterrupt » 18 сен 2006, 10:41

stix-s писал(а):
EvilsInterrupt писал(а): Нет не помогло! :(
а что не помогло-то? запрос-то, указанный WildSery: select rdb$character_set_name from rdb$database тебе что вернул?
Ничего, только <null>
что я указал в своем предыдущем письме. Нахреначил данных в какой попало кодировке...
База мне досталась в том виде с каким я щас работаю, причем это на Пирамеде(есть такое понятие в средствах Автоматизации промышленности), но это не важно главное узнать, кодировку!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 сен 2006, 10:48

База мне досталась в том виде с каким я щас работаю, причем это на Пирамеде(есть такое понятие в средствах Автоматизации промышленности), но это не важно главное узнать, кодировку!
раз у тебя в чарсете базы null, и даже не none, то фиг знает, с какой кодировкой были созданы строковые столбцы в таблицах, или с какой кодировкой данные были занесены в базу.

Я тебе ссылку на faq по "русским буквам" дал, там все предельно просто. И оттуда же следует что win1251 тебе при коннекте указывать не нужно. Т.е. резюме такое - в базе с кодировками или уже был устроен бардак, или наоборот, ты его пытаешься устроить.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 18 сен 2006, 11:01

EvilsInterrupt писал(а):Ничего, только <null>
Очень интересная ошибка. В обычной базе такого быть не может, там хоть NONE, но стоит.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 18 сен 2006, 14:52

Merlin писал(а):И как ты тудыть всякие там умляуты затолкаешь и потом по ним, скажем, отсортируешь?
Вот соберусь, попробую, расскажу :) ежели получится

Ответить