Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Работает-ли IB с русскими буквами?


Автор: Alex 13.11.2004, 15:24
Да, как с кодировкой 866 так и с 1251, как из Delphi 1.0, так и из Delphi 2.0. Для того, чтобы в БД в строковых полях использовались русские буквы, необходимо при создании БД указать в качестве дополнительного параметра фразу: 

Код

DEFAULT CHARACTER SET WIN1251
  

А в BDECFG32 в драйвере IB и его псевдонимах (aliases) указать языковый драйвер Pdox ANSI Cyrillic. Такие установки обеспечат нормальную работу с кодировкой 1251. (в TDatabase.Params этот языковый драйвер указывается как LANGDRIVER=ancyrr). 

Для компонент прямого доступа необходимо в параметрах соответствующего компонента XXDatabase дописать 
Код

lc_ctype=WIN1251 


Дополнительно, если вы предполагаете использовать выражение UPPER в SQL запросах, то Вам потребуется при создании таблиц IB использовать уточнение COLLATION SEQUENCE для строковых полей. 

К сожалению, установить COLLATE PXW_CYRL по умолчанию для базы данных невозможно (такой параметр отсутствует). Поэтому таблицы IB, созданные при помощи Database Desktop или компонента TTable не будут иметь правильного COLLATE для работы с функцией SQL UPPER. (Эта проблема, необходимо отметить, не относится к работе с регистром русских букв внутри Delphi, поскольку для этого внутри VCL используются функции Windows, правильно переводящие буквы кодировки 1251 в верхний регистр и обратно.) 

Например, если возможен запрос такого типа: 

Код

SELECT * FROM CUSTOMERS  
WHERE UPPER(NAME) = 'ИВАНОВ' 
 

То таблицу CUSTOMERS придется создавать при помощи текста 

Код

CREATE TABLE CUSTOMERS (  
ID INTEGER NOT NULL,  
NAME CHAR(30) COLLATE PXW_CYRL,  
PRIMARY KEY (ID))
  

фраза COLLATE PXW_CYRL заставляет IB использовать таблицу трансляции символов PXW_CYRL вместо WIN1251 (которая устанавливается по умолчанию для DEFAULT CHARACTER SET WIN1251). 

Однако можно использовать указание порядка сортировки "на ходу", без указания порядка сортировки в описании таблицы - при помощи того-же спецификатора COLLATE. В этом случае запросы могут выглядеть следующим образом: 

Код

SELECT * FROM CUSTOMERS  
WHERE UPPER(NAME COLLATE PXW_CYRL) = 'ИВАНОВ'
  

Учтите, что если Вы используете ORDER BY NAME, то порядок записей у полей с COLLATE PXW_CYRL будет отличаться от имеющих только CHARACTER SET WIN1251. В этом случае необходимо и в ORDER BY указывать COLLATE. Например 

Код

SELECT * FROM CUSTOMERS  
WHERE UPPER(NAME COLLATE PXW_CYRL) = 'ИВАНОВ'  
ORDER BY NAME COLLATE PXW_CYRL
  

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

Код

INSERT INTO MYTABLE VALUES (1, _win1251 'Привет!') 


К сожалению, такой способ приводит к тому, что со стандартными компонентами TTable и TQuery можно работать только используя дополнительный компонент UpdateSQL (который позволяет переопределить запросы выдаваемые этими компонентами при INSERT, UPDATE, DELETE, и кроме этого присутствует только в Delphi 2.0). 

ODBC-драйвер, поставляемый в дистрибутиве IB 5.5 позволяет указать кодировку win1251 для алиаса, при этом никаких манипуляций с _win1251 не требуется. 

Подробнее см. документ http:/www.ibase.ru/devinfo/0109.htm 


Borland Interbase / Firebird FAQ 
Borland Interbase / Firebird Q&A, версия 2.02 от 31 мая 1999 
последняя редакция от 17 ноября 1999 года. 
Часто задаваемые вопросы и ответы по Borland Interbase / Firebird 
Материал подготовлен в Демо-центре клиент-серверных технологий. (Epsylon Technologies) 
Материал не является официальной информацией компании Borland. 
E-mail mailto:[email protected] 
www: http://www.ibase.ru/ 
Телефоны: 953-13-34 
источники: Borland International, Борланд АО, релиз Interbase 4.0, 4.1, 4.2, 5.0, 5.1, 5.5, 5.6, различные источники на WWW-серверах, текущая переписка, московский семинар по Delphi и конференции, листсервер ESUNIX1, листсервер mers.com. 
Cоставитель: Дмитрий Кузьменко 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)