Как использовать 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 на уровне приложения?
Ответы
Ответ 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
Ответ 6
На самом деле нет проблем с использованием UTF8, создавая SQLCLR UDF, и вы можете загрузить из Microsoft код. проверьте эту ссылку: http://technet.microsoft.com/en-us/library/ms160893(v=sql.90).aspx
Ответ 7
https://cloudblogs.microsoft.com/sqlserver/2018/12/18/introduction-utf-8-support-in-sql-server-2019-preview/в настоящее время Uft-8 поддерживается в mssql 2019.