我已经将数据库从mysql迁移到使用UTF8的原始mysql数据库SQL Server(政治)。
现在我读到/dba/7346/sql-server-2005-2008-utf-8-collation-charset SQL Server 2008不支持utf8,这是在开玩笑吗?
SQL Server承载多个数据库,大多数数据库都是拉丁编码的。由于迁移的数据库是用于Web发布的,因此我想保持utf8编码。我错过了什么吗?还是需要在应用程序级别进行编码/拒绝?
我已经将数据库从mysql迁移到使用UTF8的原始mysql数据库SQL Server(政治)。
现在我读到/dba/7346/sql-server-2005-2008-utf-8-collation-charset SQL Server 2008不支持utf8,这是在开玩笑吗?
SQL Server承载多个数据库,大多数数据库都是拉丁编码的。由于迁移的数据库是用于Web发布的,因此我想保持utf8编码。我错过了什么吗?还是需要在应用程序级别进行编码/拒绝?
Answers:
没有!这可不是说笑。
在这里看看: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字节通用字符集)是一种类似的字符编码,在1996年7月被Unicode标准的2.0版中的UTF-16取代。
mssql-client
可以是一切。Java,.NET,C,PHP等...客户端的含义是什么?
UTF-8不是字符集,而是一种编码。UTF-8的字符集是Unicode。如果要存储Unicode文本,请使用nvarchar
数据类型。
如果数据库将使用UTF-8来存储文本,那么您仍然不会将文本作为编码的UTF-8数据输出,而是将其作为解码的文本输出。
您可以轻松地将UTF-8编码的文本存储在数据库中,但是随后您就不会将其存储为文本,而是将其存储为二进制数据(varbinary
)。
110xxxxx 10xxxxxx
UTF-8(其中x
表示数据位)进行编码,因此,字符代码F0
(00011110000
如11位)被编码为11000011 10110000
(00011
从第一个字节和110000
第二个字节中的字符代码输入))是C3 B0
。
看起来最终将在SQL Server 2019中支持此功能! SQL Server 2019-新增功能
从BOL:
UTF-8支持
完全支持广泛使用的UTF-8字符编码作为导入或导出编码,或作为文本数据的数据库级或列级排序规则。
CHAR
和VARCHAR
数据类型中允许使用UTF-8 ,并且在创建对象的归类或将其归类为带UTF8
后缀的归类时启用。例如,
LATIN1_GENERAL_100_CI_AS_SC
以LATIN1_GENERAL_100_CI_AS_SC_UTF8
。正如SQL Server 2012中引入的那样,UTF-8仅适用于支持补充字符的Windows归类,NCHAR
并且NVARCHAR
仅允许UTF-16编码,并且保持不变。根据使用的字符集,此功能可以节省大量存储空间。例如,将具有ASCII字符串的现有列数据类型从
NCHAR(10)
更改为CHAR(10)
使用启用了UTF-8的排序规则,可以将存储需求减少近50%。减少的原因是NCHAR(10)
,存储需要22个字节,而CHAR(10)
同一Unicode字符串则需要12个字节。
2019-05-14更新:
文档似乎现在已更新,并在“排序规则和Unicode支持”部分中解释了在MSSQL 2019中启动的选项。
2019-07-24更新:
Pedro Lopes-高级项目经理@ Microsoft的文章,介绍对Azure SQL数据库的UTF-8支持
请注意,如Microsoft SQL Server 2016,UTF-8是支持bcp
,BULK_INSERT
和OPENROWSET
。
附录2016-12-21:SQL Server 2016 SP1现在为所有版本的MS SQL(包括Standard和Express)启用Unicode压缩(以及大多数其他以前仅限企业使用的功能)。这与UTF-8支持不同,但是如果目标是减少西方字母的磁盘空间,则可以产生类似的好处。
两个UDF在T-SQL中处理UTF-8:
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 @res=@res+left(@src,@i-1)+char((@j&1984)/64+192)+char((@j&63)+128)
else select @res=@res+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 @res=@res+@src
return @res
end
CREATE Function Utf8ToUcs(@src varchar(MAX)) returns nvarchar(MAX) as
begin
declare @i int, @res nvarchar(MAX)=@src, @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