Delphi dbExpress и Interbase: шаги и риски миграции UTF8?

В настоящее время наша база данных использует Win1252 как единственную кодировку символов. Вскоре нам придется поддерживать Unicode в таблицах базы данных, а это значит, что мы должны выполнить эту миграцию для четырех баз данных и около 80 приложений Delphi, которые работают внутри компании в среде 24/7. Есть ли рекомендации по миграции базы данных на UTF-8 (или UNICODE_FSS) для приложений Delphi? Некоторые вопросы перечислены ниже. Заранее большое спасибо за ваши ответы!

  • есть ли инструменты, которые помогают с переносом существующих баз данных (размером от 250 МБ до 2 ГБ, без полей Blob), путем сброса данных, воссоздания базы данных с помощью UNICODE_FSS или UTF-8 и загрузки данные обратно?
  • есть ли известные проблемы с Delphi 2009, dbExpress и Interbase 7.5, связанные с наборами символов Unicode?
  • Вы бы порекомендовали сначала обновить базы данных до Interbase 2009? (Это обновление запланировано, но не имеет высокого приоритета)
  • можем ли мы просто перенести базу данных, и Delphi будет обрабатывать наборы символов Unicode автоматически, или нам также придется изменить все типы символьных полей в каждом модуле Datamodule (dfm и исходный код)?
  • Какую стратегию вы бы порекомендовали для работы над миграцией параллельно с обычной разработкой и обслуживанием существующего приложения? Приложение работает внутри компании, поэтому разработка и администрирование базы данных выполняются внутри компании.

Обновление: из ветки форума обсуждения InterBase: Базы данных Unicode в InterBase - правда? ( это не моя тема, но она показывает, что некоторые проблемы все еще существуют в InterBase XE).

Вот несколько отчетов, которые я отправил: QC # 92867 - Строковые поля из представлений пусты, только если представление включает объединение и при использовании ClientDataSet. Это было обнаружено как отсутствующие данные в нескольких моих отчетах, которые больше не работают.

QC # 91494 - IB Данные столбца символов Символьные поля (например: Char (1)) дополняются пробелами при извлечении через хранимую процедуру. Тесты не пройдены - например: Если Active = "Y". Я активно использую хранимые процедуры с формами, и они не работают.

QC # 91355 - IBSqlMonitor не работает. Вывод IBSqlMonitor несколько искажен, что делает этот инструмент бесполезным. (Значит, даже лопата сломана!)

Не сообщается - постоянные поля в TClientDataSet не работают для TWideString.

Другие связанные записи QC:

QC # 94455 Ошибка типа символа Unicode в SQL (InterBase XE)


person Community    schedule 20.02.2010    source источник


Ответы (8)


И Database Workbench, и IBExpert может выполнить перенос данных за вас.

Я вернусь к вам по другим вопросам, когда буду в Entwickler Tage.

- Джерун

person Jeroen Wiert Pluimers    schedule 21.02.2010

Проблема: UPDATE в пустом строковом поле больше не находит запись. Если символьное поле UTF8 пусто, DataSetProvider генерирует неправильный SELECT для действия обновления.

Симптом: сообщение "запись не найдена или не редактировалась другим пользователем"

Решение: обновитесь до Delphi 2010 Update 4 или воспользуйтесь обходным путем, описанным в разделе контроля качества.

person mjn    schedule 18.05.2010

Проблема: поля CHAR больше не работают, и их необходимо заменить на VARCHAR.

Симптом: запросы SELECT для столбца, который теперь использует UTF8 и импортирован из WIN1252 со значениями ASCII, больше не возвращает никакого значения. Возможно, это ошибка, о которой я должен сообщить в QC.

Решение: замените все вхождения CHAR( в DDL-скрипте метаданных базы данных на VARCHAR(

person mjn    schedule 18.05.2010

Проблема: для постоянных строковых полей требуется свойство Size, которое представляет собой логический размер поля, умноженный на четыре (см. также: Is можно ли настроить TStringField для работы как TWideStringField в Delphi?)

Симптом: нарушение доступа

Решение: удалите постоянное поле и добавьте его снова, чтобы обновить свойство Size. (побочный эффект: DisplayWidth также увеличит размер, что приведет к проблемам с пользовательским интерфейсом)

person mjn    schedule 18.05.2010

Проблема: UDF (пользовательские функции) со строковыми параметрами могут не работать из-за ограничений размера.

Симптом:

Dynamic SQL Error.
SQL error code = -204.
Data type unknown.
Implementation limit exceeded.
COLUMN DSQL internal.

для этого UDF:

DECLARE EXTERNAL FUNCTION STRLEN
    CSTRING(32767)
    RETURNS INTEGER BY VALUE
    ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf';

Решение: исправить параметры UDF в объявлении.

person mjn    schedule 19.05.2010

Проблема: dbExpress использует WideString как тип данных внутри, поэтому все существующие .AsString вызовы для чтения / настройки поля и параметра больше не будут работать

Симптом: специальные символы не будут правильно сохраняться / считываться

Решение: замените все вхождения .AsString на .AsWideString, но будьте осторожны, чтобы не изменить место, где метод AsString не вызывается для поля или параметра.

person mjn    schedule 19.05.2010

Проблема: dbExpress нужны объекты TStringField для полей WIN1252. Для полей базы данных UTF8 dbExpress нужны объекты TWideStringField.

Симптом: сообщение об ошибке «Ожидается: WideString found: string»

Решение: замените все вхождения TStringField на TWideStringField. Для этого необходимо, чтобы все файлы форм (dfm) были текстовыми, а не двоичными. Измененные формы и модули данных не будут обратно совместимы.

person mjn    schedule 19.05.2010

Проблема: при экспорте метаданных и табличных данных для базы данных WIN1252 будет создан файл в кодировке CP1252, но для импорта требуется файл UTF8 (проверено с помощью IBExpert)

Симптом: ошибки при импорте скрипта в InterBase

Решение: используйте iconv для преобразования файла сценария в UTF8.

person mjn    schedule 19.05.2010