2010-02-20 1 views
4

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

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

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

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

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

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

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

Прочие связанные записи КК:

QC#94455 SQL Unicode Char Тип Failure (InterBase XE)

ответ

1

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

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

--jeroen

0

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

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

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

1

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

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

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

0

Проблема: постоянные строковые поля требуют размер, свойство, которое является логическим размер поля, умноженное на четыре (см также: Is it possible to tweak TStringField to work like TWideStringField in Delphi?)

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

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

0

Задача: 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

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

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

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

0

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

Симптом: сообщение об ошибке 'Ожидаемый результат: WideString найдено: строка'

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

0

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

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

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