Про кодировку WIN1251

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Про кодировку WIN1251

Сообщение Hadroran » 11 май 2006, 13:24

Имеется база в кодировке WIN1251 COLLATE WIN1251
При запросе типа

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

SELECT * FROM MY_TABLE WHERE T_NAME='таблетка'
появляется сообщение о том что невозможно найти данные символы в этом наборе. Нашел предложение сменить на
WIN1251 COLLATE PXW_CYRL, но только заново перезаписав данные базы.
Попробовал на новой таблице с парой строк - получилось. Однако пытался потом поменять кодировку в доменах, не вышло.
Можно ли обойтись меньшей кровью, не переписывая данные.

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

Сообщение kdv » 11 май 2006, 14:26

www.ibase.ru/devinfo/ibrusfaq.htm
читать раза 3-4, внимательно.
если сам колупал системные таблицы, и уже не помнишь как и где - тогда только пересозданием БД и переливанием данных.

Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Сообщение Hadroran » 12 май 2006, 11:07

Все обошлось малой кровью.
Изменения в системных таблицах не помогли. Я нужные поля отцепил от доменов в систеной таблице для них в RDB$COLLATION_ID установил значение 0 проапдейтил данные и все получилось.
Только одна заковырка осталась. При создании запроса со словами "Масло" и "масло" выдаются разные строки. Как сделать чтобы даже по запросу "МаСлО" выдавались все строки содержащие эти буквы.

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

Сообщение kdv » 12 май 2006, 11:53

я не понял - ты в FAQ про upper читал?
про необходимость обновления данных после смены collate ковырянием в системных таблицах тоже читал?

p.s. после таких колупаний в системных таблицах будь готов, что дальше все может начать глючить еще больше.

Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Сообщение Hadroran » 12 май 2006, 12:16

kdv писал(а):я не понял - ты в FAQ про upper читал?
про необходимость обновления данных после смены collate ковырянием в системных таблицах тоже читал?
Про это все читал. Данные после смены collate обновил так

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

update MyTable
   set MyField=MyField
Но и теперь используя upper выводятся разные строки. :shock:

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

Сообщение kdv » 12 май 2006, 15:13

Но и теперь используя upper выводятся разные строки.
я бы и в третий раз мог повторить про последствия ковыряния таблиц...
в общем, пересоздавай БД заново, заливай имеющиеся данные. IBPump, через скрипт в IBExpert, и т.п.

Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Сообщение Hadroran » 15 май 2006, 15:09

Ну нихрена не получается :shock:
Сделал скрипт

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

SET SQL DIALECT 3;
SET NAMES WIN1251;
CREATE DATABASE 'localhost:C:\proba.gdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251;

CREATE TABLE TESTCHAR( 
ID INTEGER NOT NULL PRIMARY KEY, 
NAME1 VARCHAR(30),
NAME2 VARCHAR(30) COLLATE PXW_CYRL);
Занес данные А,Б,В,а,б,в.
На запрос

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

SELECT * FROM TESTCHAR WHERE UPPER(NAME1 COLLATE PXW_CYRL) = 'А'
Ошибка Cannot transliterate...
Работает если DEFAULT CHARACTER SET NONE, но при этом не реагирует на UPPER.
Что делать:?:

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

Сообщение kdv » 15 май 2006, 15:47

при коннекте (до него) указал win1251?
я ж сказал - читать внимательно.

чем ты с базой работаешь?

Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Сообщение Hadroran » 15 май 2006, 15:49

при коннекте не указал, ща попробую.
Delphi, IBExpert я так понял?

Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Сообщение Hadroran » 15 май 2006, 15:52

Все, все я просто олень.
lc_ctype=WIN1251 при коннекте и все дела.

Ответить