Хранение данных Unicode в базе данных - PullRequest
0 голосов
/ 10 января 2012

В настоящее время мы осуществляем миграцию с Delphi 2007 на Delphi XE2 для поддержки Unicode.Мы храним большие данные XML в виде блобов в базе данных.Чтобы вставить значение BLOB-объекта в поле базы данных, мы используем код ниже

Param.DataType := ftBlob;
Param.AsBlob := Value;

Но теперь, чтобы поддерживать Unicode, мы преобразовали все поля BLOB-объектов в базе данных в nvarchar (max).Мы изменили приведенный выше код на

Param.DataType := ftwideString;
Param.AsString := Value;

. Правильно ли это делать, или его нужно обрабатывать по-другому, чтобы хранить данные Unicode в базе данных.

Ответы [ 2 ]

3 голосов
/ 10 января 2012

BLOB-ы будут хранить все, что вы на них бросаете, не делая никаких выводов об этом.Хотя они могут иметь мало возможностей для манипулирования, они никогда не изменят данные.С другой стороны, поле на основе символов (даже CLOB) будет иметь связанный набор символов.Таким образом, данные, хранящиеся там, будут конвертированы назад и вперед из исходного набора символов и целевого набора.Например, если ваш XML-файл имеет кодировку UTF-8, а поле имеет формат UTF-16, он будет преобразован при записи и чтении.Конечно, если оба кодирования одинаковы, преобразование не выполняется.Если в вашей базе данных отсутствует тип XML, я бы сохранил их в двоичных объектах, если они могут быть в разных кодировках, и для них не требуется никаких операций (кроме записи / чтения).Если они всегда находятся в одной и той же кодировке, то с лобби символов будет легче работать.Использование символьного поля с большим XML-файлом может привести к ошибкам из-за максимального размера поля.

1 голос
/ 10 января 2012

Хотя ваше решение должно работать, я бы предложил сохранить формат поля BLOB-объектов, использовать UTF8 в качестве кодировки по умолчанию для базы данных (пример Firebird):

CREATE DATABASE 'localhost:c:\Data\MyDatabase.FDB' user 'SYSDBA' password 'masterkey'
  DEFAULT CHARACTER SET UTF8;

и преобразовать строку XML в кодировку UTF8 перед сохранениемэто как капля.

...