Delphi dbExpress и Interbase: этапы миграции UTF8 и риски? - PullRequest
4 голосов
/ 20 февраля 2010

В настоящее время наша база данных использует 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". Я интенсивно использую хранимые процедуры с формами и они не работают.

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

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

Другие записи о КК:

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

Ответы [ 8 ]

1 голос
/ 18 мая 2010

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

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

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

1 голос
/ 21 февраля 2010

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

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

- Йерун

0 голосов
/ 19 мая 2010

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

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

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

0 голосов
/ 19 мая 2010

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

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

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

0 голосов
/ 19 мая 2010

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

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

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

0 голосов
/ 19 мая 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 в объявлении.

0 голосов
/ 18 мая 2010

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

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

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

0 голосов
/ 18 мая 2010

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

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

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

...