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, или нам придется изменять все типы символьных полей в каждом модуле данных (dfm и исходный код)?
  • Какую стратегию вы бы порекомендовали работать над миграцией параллельно с обычной разработкой и обслуживанием существующего приложения? Приложение работает внутри компании, поэтому разработка и администрирование базы данных осуществляется внутри компании.

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

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

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

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

Unreported - постоянные поля в TClientDataSet завершаются с ошибкой для TWideString.

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

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

8 ответов

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

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

Решение: обновить до Delphi 2010 Update 4 или использовать обходной путь, описанный в QC

Как Database Workbench, так и IBExpert могут выполнить миграцию данных за вас.

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

--jeroen

Проблема: 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 в объявлении.

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

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

Решение: заменить все случаи CHAR( в базе данных метаданных DDL скрипт с VARCHAR(

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

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

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

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

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

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

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

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

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

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

Симптом: сообщение об ошибке "ожидается: WideString найдено: строка"

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

Другие вопросы по тегам