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) были текстовыми, а не двоичными. Модифицированные формы и модули данных не будут обратно совместимы.