Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Проблема при использовании LIKE с UNICODE в IB/FB


Автор: Паша Меньщиков 16.10.2003, 09:50
Привет!
Есть БД, часть определения которой приведена ниже.
Код
SET SQL DIALECT 3;
SET NAMES UNICODE_FSS;
CREATE DATABASE 'C:\MyProjects\ENG\IBDB\AC011.GDB'
 USER 'SYSDBA' PASSWORD 'masterkey' PAGE_SIZE 8192
 DEFAULT CHARACTER SET UNICODE_FSS;

CREATE DOMAIN CH10 AS VARCHAR(10);
CREATE DOMAIN CH50 AS VARCHAR(50);
/* ... */
CREATE TABLE ROOMS (
 PRJCODE      INTEGER NOT NULL,
 ROOMNO       CH10 NOT NULL,
 NAME         CH50
 /* ... */
);

Возникает проблема при выполнении операторов вида
Код
SELECT * FROM ROOMS WHERE NAME LIKE 'Коридор%'

причем правый символ % может отсутствовать (поведение то же). При выполнении этого оператора сервер подвисает (испробовано на IB6, FB1, FB1.5). Если вместо 'Коридор' написать 'Coridor', запрос выполняется нормально. Запрос выполнялся нормально и тогда, когда DEFAULT CHARACTER SET был WIN1251. Запросы вида
Код
SELECT * FROM ROOMS WHERE UPPER(NAME) LIKE UPPER('КОРИДОР%')

(именно так: UPPER('от_больших_букв') - описано, кажется, в открытых фичах/багах FB1) вываливает все записи, где NAME написано в данном случае кириллицей.

Вопрос: лечится ли это как-то? Если лечится, просьба прояснить, как. Если нет, просьба кинуть идею, какой конструкцией можно заменить указанные операторы.

Автор: Akella 16.9.2004, 17:21
у меня такая же проблема с частичным поиском.

Кусок из метаданных

Код

SET SQL DIALECT 1;

/* CREATE DATABASE 'C:\Program Files\Borland\Delphi7\Projects\BASE.GDB' PAGE_SIZE 4096

DEFAULT CHARACTER SET  */

/*  External Function declarations */



кажется кодовая страница не определена.

Автор: <Spawn> 18.9.2004, 12:38
Ответ в http://forum.vingrad.ru/index.php?showtopic=29772 теме

Автор: gray_k 20.9.2004, 07:52
Проблема скорее всего в том, что большинство клиентов с юникодом работать не умеет. В частности для очень популярного IBExpert поддержку юникода добавили меньше месяца назад, и как оно работает я ещё не смотрел, так что могу только посоветовать сменить кодировку или не пользоваться русским шрифтом.

Автор: Гость_Владимир 11.10.2004, 02:47
Проще всего использовать кодировку NONE. Оно проще. А большие/маленькие буквы - хестко забить в программе.

Автор: Akella 11.10.2004, 08:52
я делал по другому
1. Копировал таблицу в Paradox
или
2. Присваивал значение поля переменной а затем проверял сходство

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