Подтвердить что ты не робот

Как использовать UTF-8 Collation в базе данных SQL Server?

Я перенес базу данных с mysql на SQL Server (политика), оригинальную базу данных mysql, используя UTF8.

Теперь я читаю https://dba.stackexchange.com/info/7346/sql-server-2005-2008-utf-8-collation-charset, что SQL Server 2008 не поддерживает utf8, это шутка?

SQL Server содержит несколько баз данных, в основном в латинском коде. Поскольку перенесенная база данных предназначена для публикации в Интернете, я хочу сохранить кодировку utf8. Я что-то пропустил или мне нужно кодировать /dec на уровне приложения?

4b9b3361

Ответ 1

Нет! Это не шутка.

Посмотрите здесь: http://msdn.microsoft.com/en-us/library/ms186939.aspx

Типы персональных данных, которые являются либо фиксированными, либо nchar, либо данные переменной длины, nvarchar, Unicode и использовать UNICODE UCS-2 набор символов.

А также здесь: http://en.wikipedia.org/wiki/UTF-16

Более старый UCS-2 (2-байтовый универсальный набор символов) аналогичен кодировка символов, которая была заменена UTF-16 в версии 2.0 Стандарт Юникода в июле 1996 года.

Ответ 2

UTF-8 не является набором символов, это кодировка. Набор символов для UTF-8 - Unicode. Если вы хотите сохранить текст Unicode, вы используете тип данных nvarchar.

Если база данных будет использовать UTF-8 для хранения текста, вы все равно не получите текст в виде кодированных данных UTF-8, вы получите его как декодированный текст.

Вы можете легко хранить кодированный текст UTF-8 в базе данных, но затем вы не храните его как текст, вы храните его как двоичные данные (varbinary).

Ответ 3

Похоже, это будет наконец поддерживаться в SQL Server 2019! SQL Server 2019 - что нового?

От BOL:

Поддержка UTF-8

Полная поддержка широко используемой кодировки символов UTF-8 в качестве кодировки импорта или экспорта или в качестве сопоставления на уровне базы данных или столбца для текстовых данных. UTF-8 допускается в VARCHAR данных CHAR и VARCHAR и включается при создании или изменении параметров сопоставления объектов для сопоставления с суффиксом UTF8.

Например, от LATIN1_GENERAL_100_CI_AS_SC до LATIN1_GENERAL_100_CI_AS_SC_UTF8. UTF-8 доступен только для сопоставлений Windows, которые поддерживают дополнительные символы, как представлено в SQL Server 2012. NCHAR и NVARCHAR допускают только кодировку UTF-16 и остаются неизменными.

Эта функция может обеспечить значительную экономию памяти в зависимости от используемого набора символов. Например, изменение существующего типа данных столбца со строками ASCII с NCHAR(10) на CHAR(10) с использованием сортировки с поддержкой UTF-8 приводит к почти 50% снижению требований к хранилищу. Это сокращение вызвано NCHAR(10) что NCHAR(10) требует 22 байта для хранения, тогда как CHAR(10) требует 12 байтов для той же строки Unicode.

2019-05-14 обновление:

Кажется, что документация теперь обновляется и объясняет наши опции, начиная с MSSQL 2019, в разделе " Поддержка сортировки и Unicode ".

2019-07-24 обновление:

Статья Педро Лопеса - старшего менеджера программ @Microsoft о введении поддержки UTF-8 для базы данных SQL Azure

Ответ 4

Обратите внимание, что с Microsoft SQL Server 2016 UTF-8 поддерживается bcp, BULK_INSERT и OPENROWSET.

Добавление 2016-12-21: SQL Server 2016 SP1 теперь включает сжатие Unicode (и большинство других ранее доступных для предприятия функций) для всех версий MS SQL, включая Standard и Express. Это не то же самое, что поддержка UTF-8, но это дает аналогичную выгоду, если целью является сокращение дискового пространства для западных алфавитов.

Ответ 5

Два UDF для работы с UTF-8 в T-SQL:

CREATE Function UcsToUtf8(@src nvarchar(MAX)) returns varchar(MAX) as
begin
    declare @res varchar(MAX)='', @pi char(8)='%[^'+char(0)+'-'+char(127)+']%', @i int, @j int
    select @i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0
    begin
        select @j=unicode(substring(@src,@i,1))
        if @j<0x800     select @[email protected]+left(@src,@i-1)+char((@j&1984)/64+192)+char((@j&63)+128)
        else            select @[email protected]+left(@src,@i-1)+char((@j&61440)/4096+224)+char((@j&4032)/64+128)+char((@j&63)+128)
        select @src=substring(@src,@i+1,datalength(@src)-1), @i=patindex(@pi,@src collate Latin1_General_BIN)
    end
    select @[email protected][email protected]
    return @res
end

CREATE Function Utf8ToUcs(@src varchar(MAX)) returns nvarchar(MAX) as
begin
    declare @i int, @res nvarchar(MAX)[email protected], @pi varchar(18)
    select @pi='%[à-ï][€-¿][€-¿]%',@i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0 select @res=stuff(@res,@i,3,nchar(((ascii(substring(@src,@i,1))&31)*4096)+((ascii(substring(@src,@i+1,1))&63)*64)+(ascii(substring(@src,@i+2,1))&63))), @src=stuff(@src,@i,3,'.'), @i=patindex(@pi,@src collate Latin1_General_BIN)
    select @pi='%[Â-ß][€-¿]%',@i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0 select @res=stuff(@res,@i,2,nchar(((ascii(substring(@src,@i,1))&31)*64)+(ascii(substring(@src,@i+1,1))&63))), @src=stuff(@src,@i,2,'.'),@i=patindex(@pi,@src collate Latin1_General_BIN)
    return @res
end