powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB 2.5.5 проблема со столбцами UTF8
25 сообщений из 61, страница 1 из 3
FB 2.5.5 проблема со столбцами UTF8
    #39988870
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Есть база данных, созданая с чарсетом ISO8859_1. В новой версии развитие нашей программы был сделан переход на UTF8. Поэтому в программе установки запускается специальный скрипт, который с помощью команды alter ссоздает временный столбец, в него копирует данные из столбца с кодировкой ISO8859_1, удаляет старый столбец, создает новый, копирует данные из временного столбца и удаляет временный столбец.
Таким образом обрабатывается не одна таблица, а довольно много.

В чем возникла проблема: обнаружилось, что у некоторых таблиц такие обновления проходят не так гладко. Например если в конвертируемом столбце есть многобайтные символы типа 'µ', национальных символов каждой страны и есть подозрения на символ '%'.
Вместимость столбца 100 байт (VARCHAR(100) CHARACTER SET UTF8)
Строка содержит допустим 40 байт и спецсимвол. Если же сделать select прямо из таблицы, то получим Arithmetic exception. Иногда прямой селект проходит нормально, но вот в связанной view выкидывает Arithmetic exception.
При попытке сделать insert или update с такими данными получаем Arithmetic exception.

Самое непонятное в этом то, что в одних таблицах все нормально с этим, в других постоянно проблема. Приходится после апдейта проводить подобную конвертацию руками повторно. Что посоветуете делать?

Используется FB 2.5.5 как SuperServer, под Win7 или Win10.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988876
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svd,

Временно увеличьте "Вместимость столбца" в 4 раза. А после конвертации можете вернуть обратно размер поля. Проверено и не раз.
Удачи!
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988878
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
varchar(100) это байты и "паспортная" вместимость такого столбца - 25 юникодных символов .
Ну и 2.5. 5 - странно, как минимум.
Суперсервер - тоже странно, но, может быть, у вас тот редкий сценарий когда это осмысленно.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988883
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AltHasp,

Так и делается. временный столбец содержит 1000 байт. изначально на тестах я и основной столбец увеличил как и временный - для программы это не критично тем, что внутри используются форматированные данные фиксированной длинны (записи типа record). Но вот шеф настоял, что бы все вернулось в порядок. Пришлось в скрипт при обратном копировании добавить substring.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988890
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

все бы хорошо, но несходится с логикой: при вмстимости столбца 100 символов, 39 символов идут как однобайтные и 'µ' идет в двухбайтной кодировке.

по поводу смены версии сервера вопрос трудный. Для этого нужны веские основания. Вероятно так и произойдет, если мне удастся доказать, что новая версия как раз и исправляет подобные проблемы. Используется то, что длительное время тестировалось.
Клиентов около тысячи, обновления проводим не мы, а лучше сказать "другая фирма", которую невозможно заставить просто так обновить сервера базы данных у клиентов. Поэтому этим занимается программа установки, которую мого раз тестируют, пока она попадет в отдел поддержки.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988892
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
varchar(100) это байты и "паспортная" вместимость такого столбца - 25 юникодных символов .


С чего это вдруг? varchar(100) - это 100 символов, RDB$FIELD_LENGTH у такого поля будет 400.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988908
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svd
по поводу смены версии сервера вопрос трудный.
Версии??? С каких пор "выпуск (обновлений)" стал "сменой версии"?

P.S.
Про "требуется бэкап-рестор" - в курсе, но сколько их на все выпуски?
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988910
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

это в теории. На практике, проводя конвертацию, я создавал временные столбцы сначала той же длины, что и оригинал. В результате получал при update исключение arithmetic exception. потом tmp увеличил вдвое, но нашлись пользователи у которых и 200 не прокатывало. Тогда уже задал для tmp 1000 и все пошло более менее нормально, пока у французов не нашлись данные, где помогло только 3000 и времени на решение было 5 минут. Естественно уже 1000 была в официальном пакете обновлений, а этих французов пометили как особых личностей.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988911
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AltHasp
svd,

Временно увеличьте "Вместимость столбца" в 4 раза. А после конвертации можете вернуть обратно размер поля. Проверено и не раз.
Удачи!


как вы это делаете? команду можете указать, чтоб внести ее в скрипт?
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988916
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svd
В чем возникла проблема: обнаружилось, что у некоторых таблиц такие обновления проходят не так гладко. Например если в конвертируемом столбце есть многобайтные символы типа 'µ', национальных символов каждой страны и есть подозрения на символ '%'.
В ISO8859_1 нет и быть не может никаких многобайтных символов.

svd
Вместимость столбца 100 байт (VARCHAR(100) CHARACTER SET UTF8)
Это 100 символов, не 100 байт.

svd
На практике, проводя конвертацию, я создавал временные столбцы сначала той же длины, что и оригинал. В результате получал при update исключение arithmetic exception. потом tmp увеличил вдвое, но нашлись пользователи у которых и 200 не прокатывало. Тогда уже задал для tmp 1000 и все пошло более менее нормально, пока у французов не нашлись данные, где помогло только 3000 и времени на решение было 5 минут.
Звучит как ужас-ужас. Кто-то где-то что-то делал не так.

Воспроизводимый пример поможет разобраться в этом безобразии.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988952
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Версии??? С каких пор "выпуск (обновлений)" стал "сменой версии"?

P.S.
Про "требуется бэкап-рестор" - в курсе, но сколько их на все выпуски?


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

ПС: Обновление - довольно сложный процесс. И базы данных (их две)- только некоторая часть из этого. С базами делается следущие манипуляции: удаление всех зависимостей (триггеров, процедур, функций), изменение для utf8, сравнение базы со скриптом на изменение метаданных, исполнение всяких вспомогательных скриптов, меняющие данные в таблицах, Бэкап - рестор баз данных.
И только в конце, опционально, идет смена сервиса базы данных, и то, если человек это кликнул - по умолчанию это не активно.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988981
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot hvlad#22181328]
svd
Звучит как ужас-ужас. Кто-то где-то что-то делал не так.

Воспроизводимый пример поможет разобраться в этом безобразии.


Выглядит это так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
       ...
        execute statement 'alter table ARTIKEL add tmp_utf varchar(10) CHARACTER SET UTF8';
        COMMIT;
        update ARTIKEL set tmp_utf = DFORM where 1=1;
        COMMIT;
        execute statement 'alter table ARTIKEL drop DFORM';
        COMMIT;
        execute statement 'alter table ARTIKEL add DFORM char(3)  CHARACTER SET UTF8';
        COMMIT;
        execute statement 'alter table ARTIKEL alter DFORM position 3';
        COMMIT;
        update ARTIKEL set DFORM=substring(tmp_utf from 1 for 3) where 1=1;
        COMMIT;
        execute statement 'alter table ARTIKEL drop tmp_utf';
        COMMIT;

        execute statement 'alter table ARTIKEL add tmp_utf varchar(20) CHARACTER SET UTF8';
        COMMIT;
        update ARTIKEL set tmp_utf = PEINHEIT where 1=1;
        COMMIT;
        execute statement 'alter table ARTIKEL drop PEINHEIT';
        COMMIT;
        execute statement 'alter table ARTIKEL add PEINHEIT varchar(10)  CHARACTER SET UTF8';
        COMMIT;
        execute statement 'alter table ARTIKEL alter PEINHEIT position 4';
        COMMIT;
        update ARTIKEL set PEINHEIT=substring(tmp_utf from 1 for 10) where 1=1;
        COMMIT;
        execute statement 'alter table ARTIKEL drop tmp_utf';
        COMMIT;

        for select 'DROP INDEX '||trim(i.rdb$index_name) from rdb$indices i  LEFT JOIN rdb$index_segments isg ON (isg.rdb$index_name = i.rdb$index_name)  WHERE (i.rdb$relation_name = 'ASB_FAIL')and(rdb$field_name = 'NAME')   into :SQL do begin ibec_Progress(SQL); execute statement :SQL;  end
        execute statement 'alter table ASB_FAIL add tmp_utf varchar(200) CHARACTER SET UTF8';
        COMMIT;
        update ASB_FAIL set tmp_utf = NAME where 1=1;
        COMMIT;
        execute statement 'alter table ASB_FAIL drop NAME';
        COMMIT;
        execute statement 'alter table ASB_FAIL add NAME varchar(50)  CHARACTER SET UTF8';
        COMMIT;
        execute statement 'alter table ASB_FAIL alter NAME position 2';
        COMMIT;
        update ASB_FAIL set NAME=substring(tmp_utf from 1 for 50) where 1=1;
        COMMIT;
        execute statement 'alter table ASB_FAIL drop tmp_utf';
        COMMIT;

  ....





К сожалению, последнюю таблицу, которая виновата была, пока я был в коллеги выкинули из списка и просто ее дропают. В ней данные, которые частично востанавливаются из скрипта, если они нужны. В данный момент это помогло, но сама практика не очень хорошая.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39988987
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svdЕсть база данных, созданая с чарсетом ISO8859_1.

svdесть многобайтные символы типа 'µ', национальных символов каждой страны

svdСамое непонятное в этом то, что в одних таблицах все нормально с этим, в других постоянно
проблема.

А теперь вопрос на засыпку: национальные символы каких стран представлены в ISO8859_1 и
каких стран - занесены в поле?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989014
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svd,

я не знаю, что такое "execute statement" в какой тр-ции\коннекте оно выполняется и зачем оно тут вообще нужно.

Мне кажется подозрительным использование одного и того же имени tmp_utf для всех потребностей.
Кроме того, такой подход не позволяет конвертировать более одного поля на таблицу за один раз и заставляет делать несколько апдейтов вместо одного.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989303
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

А теперь вопрос на засыпку: национальные символы каких стран представлены в ISO8859_1 и
каких стран - занесены в поле?


Изначально были только Европейские (Испанский, Французский, Немецкий, Итальянский, Турецкий, Польский, Португалский, Нидерландский). потом 6 лет назад встал вопрос о китайском и арабском. Потому сделали перевод только необходимых столбцов для этого.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989314
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
svd,

я не знаю, что такое "execute statement" в какой тр-ции\коннекте оно выполняется и зачем оно тут вообще нужно.

Мне кажется подозрительным использование одного и того же имени tmp_utf для всех потребностей.
Кроме того, такой подход не позволяет конвертировать более одного поля на таблицу за один раз и заставляет делать несколько апдейтов вместо одного.


Именно так. Весь перенос делался не за один день, а по мере перевода разных часте программ и Интерфейсов на Юникод (миграция с Дельфи 2007 на ХЕ8). Как только провека работоспособности интерфейсов подтверждалась протоколами и рапортами клиентов, внесенные изменения фиксировались. Я опубликовал только часть скрипта. На самом деле меняются много таблиц. И только пятая часть из списка имеет более одного столбца с utf8.

Разработка ведется разными людьми, сегодня задание на перевод интерфейса может быть у меня, завтра у другого сотрудника. Начальник отдела зставляет все делать по шагам (и я, например, исходя из жизненного опыта, нахожу это правильным). В случае проблемы с одним столбцом придется откатывать все изменения. Кроме того ему не нравится "коренные изменения типа оптимизации кода" - тогда трудно найти "что пошло не так" после очередного внесения изменений. Обновление программ (и структур баз) производим не мы. Гораздо удобней получить рапорт, что именно такой то столбец в такой то таблице не прошел, чем неверны все данные в таблице.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989317
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Еще к тому же мен кажется странным, что клиенты проде из одного региона, у одних такой эффект может проявиться, у других нет. Компьютеры у них у всех одного промышленного типа, различаться могут по процессорам и памятью на борту только. Операционка со всеми программами устанвливается из единого образа - по идее отличий быть не должно в принципе. но происходит.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989323
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svd,

много слов, но ничего полезного для понимания причин исходной проблемы, увы.

Итого: без воспроизводимого примера мне тут сказать больше нечего.
Ну и 2.5.5 давно нужно заменить на 2.5.9 (как минимум).
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989324
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svd,

я бы посоветовал 2.5.5 обновить до 2.5.9, или по крайней мере посмотреть release notes, были-ли какие-то баги исправлены между этими версиями в отношении юникода. По крайней мере в 2.5.1 однозначно были баги с сортировкой
(см. раздел "Регистронезависимый поиск" в http://www.ibase.ru/unicode_faq/ , там красным выделено, и указаны 3 бага).

Насчет "ошибок после переноса столбцов" - у вас там точно это через дисконнект-коннект делается? Вдруг висел какой-то коннект, который не давал обновить метаданные в памяти. У суперсервера 2.5 кэш метаданных общий.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989329
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svdЕще к тому же мен кажется странным, что клиенты проде из одного региона, у одних такой
эффект может проявиться, у других нет.

Ничего странного. У одних в базе есть буквы, не укладывающиеся в ISO 8859-1, у других - нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989337
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
svd,

я бы посоветовал 2.5.5 обновить до 2.5.9, или по крайней мере посмотреть release notes, были-ли какие-то баги исправлены между этими версиями в отношении юникода. По крайней мере в 2.5.1 однозначно были баги с сортировкой
(см. раздел "Регистронезависимый поиск" в http://www.ibase.ru/unicode_faq/ , там красным выделено, и указаны 3 бага).


Вроде смотрел, но не все: с версии 2.5.5 и выше - вроде бы ничего подобного не нашел, хотя нашел в бэг-треккере одиин рапорт о проблемах имен хранимых процедур при utf8. (версия 2.5.7) Но вроде как не подтвердилась, после перехода на другую версию.

kdv

Насчет "ошибок после переноса столбцов" - у вас там точно это через дисконнект-коннект делается? Вдруг висел какой-то коннект, который не давал обновить метаданные в памяти. У суперсервера 2.5 кэш метаданных общий.


Обновление производится специальной программой на копиях баз данных - копируются в локально доступные папки, перед каждым шагом сервис стартует, после выполнения шага сервис останавливается. Правда выполнение скриптов производится в одном шаге запуска сервиса, а вот выполнение каждого скрипта в отдельной конекции. После операции бэкап-рестор подготовленные базы копируются вместе с другими файлами на свое рабочее место(этот шаг выполняется в не контекста обновления баз и если базы не обновились, то и опреация не производится, и обновление не применяется на рабочей машине). То есть в период обновления у программы обновления единичный(но не монопольный) доступ к базам.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989341
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Ничего странного. У одних в базе есть буквы, не укладывающиеся в ISO 8859-1, у других - нет.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
MACH4_CTRL 16.05.20 22:34:01,221 U_Table_PackDetails_Qpriv.InsertQuery:
Arithmetic overflow or division by zero has occurred.SQL error state =22001
Arithmetic exception, numeric overflow, or string truncation.
String right truncation.
START EXCEPTION
QPRIV{
SELECT:
select * from PackDetails  where (FAID=-1) and (PackungsID=664212)
INSERT:
insert into PackDetails
(FAID,PackungsID,Artikelcode,PackungsArt,Breite,Hoehe,Tiefe,Bmess,Hmess,Tmess,Gewicht,FPMenge,IstMenge,Nmittel,N,DatumsFall,AktivesDatum,EinlagDatum,WaWiDatum,VerfallDatum,AuslagDatum,UmlagDatum,Name,Barcode,KartonID,LieferantID,LieferscheinID,Seriennummer,Charge,DM_Code)
  Values ( -1,664212,'00274097',3,44.1,43.4,78.1,-1.0,-1.0,-1.0,0.000,0,0,0,0,2,'1.11.2020 0:0:0.0','16.5.2020 22:34:1.23','1.1.1980 0:0:0.0','1.11.2020 0:0:0.0','1.1.1980 0:0:0.0','1.1.1980 0:0:0.0','Clarithromycin i.v. 500 mg DsF 1ST','',-1,1,70,'','','')



Я вот как то не нашел в данном инсерте ни одного многобайтного символа.
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989345
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Ничего странного. У одних в базе есть буквы, не укладывающиеся в ISO 8859-1, у других - нет.


Дополнение: Причем столбец Name имеет UTF8 кодировку. Остальные ISO
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989354
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svdПричем столбец Name имеет UTF8 кодировку.

А вот тут-то и грабельки: в него вполне могли запихать больше букв, чем разрешено,
поскольку Firebird в старых версиях проверяет только лимит в байтах, а в новых - ещё и в
буквах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB 2.5.5 проблема со столбцами UTF8
    #39989368
svd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

В столбце объявлено 100 символов utf8, в запросе заносится 36. Столбец Artikelcode имеет размер 20 ISO8859_1. там 8 цифер всего. Остьльные строковые значения пустые. Где внесены даты и время - используются соотвественные столбцы

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE TABLE PACKDETAILS (
    FAID            INTEGER NOT NULL,
    PACKUNGSID      INTEGER NOT NULL,
    ARTIKELCODE     VARCHAR(20) NOT NULL,
    PACKUNGSART     INTEGER,
    BREITE          FLOAT,
    HOEHE           FLOAT,
    TIEFE           FLOAT,
    BMESS           FLOAT,
    HMESS           FLOAT,
    TMESS           FLOAT,
    GEWICHT         FLOAT,
    FPMENGE         INTEGER DEFAULT 0,
    ISTMENGE        INTEGER DEFAULT 0,
    NMITTEL         INTEGER,
    N               INTEGER,
    DATUMSFALL      INTEGER,
    AKTIVESDATUM    TIMESTAMP,
    EINLAGDATUM     TIMESTAMP,
    VERFALLDATUM    TIMESTAMP,
    WAWIDATUM       TIMESTAMP,
    AUSLAGDATUM     TIMESTAMP,
    UMLAGDATUM      TIMESTAMP,
    NAME            VARCHAR(100) CHARACTER SET UTF8,
    BARCODE         VARCHAR(20),
    KARTONID        INTEGER,
    LIEFERANTID     INTEGER,
    LIEFERSCHEINID  INTEGER,
    SERIENNUMMER    VARCHAR(30),
    CHARGE          VARCHAR(20),
    DM_CODE         VARCHAR(255),
    R$ID            BIGINT
);
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB 2.5.5 проблема со столбцами UTF8
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]