我已经使用UTF8迁移从MySQL到SQL Server数据库(政治),原来的MySQL数据库。
现在我读https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collation-charset的SQL Server 2008不支持UTF8,这是一个笑话?
在SQL Server托管多个数据库,主要是拉丁美洲编码。 由于迁移DB是用于网络发布,我想保持UTF8编码的。 我错过了什么或者我需要ENC / DEC在应用程序级?
没有! 这可不是说笑。
看看这里: 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在Unicode标准的版本2.0在1996年7月取代了类似的字符编码。
UTF-8是不是一个字符集,它是一个编码。 为UTF-8字符集是Unicode。 如果你想存储Unicode文本使用nvarchar
数据类型。
如果数据库将使用UTF-8来存储文本,你仍然不会得到文本出来为UTF-8编码的数据,你会得到它作为解码的文本。
您可以轻松地在数据库中存储UTF-8编码的文本,但你不把它保存为文本,将其存储为二进制数据( varbinary
)。
看起来这将在SQL Server 2019中最后支持! SQL服务器2019 -什么新内容?
从BOL:
UTF-8支持
为广泛使用的UTF-8字符编码作为进口或出口的编码,或作为数据库级别或列级排序规则将文本数据的完全支持。 UTF8是允许在CHAR
和VARCHAR
数据类型,以及创建或更改对象的整理与归类当启用UTF8
后缀。
例如, LATIN1_GENERAL_100_CI_AS_SC
到LATIN1_GENERAL_100_CI_AS_SC_UTF8
。 UTF-8是仅适用于支持增补字符,如SQL Server 2012中引入的Windows排序规则NCHAR
和NVARCHAR
允许UTF-16编码只,并保持不变。
此功能可以提供显著节省存储空间,这取决于所使用的字符集。 例如,更改现有的列数据以ASCII字符串从类型NCHAR(10)
至CHAR(10)
使用UTF-8启用整理,转换成在存储需求减少近50%。 这种降低是因为NCHAR(10)
需要用于存储22个字节,而CHAR(10)
要求对于相同的Unicode字符串12个字节。
请注意,如Microsoft SQL Server 2016,UTF-8是由支持bcp
, BULK_INSERT
和OPENROWSET
。
附录2016年12月21日:SQL服务器2016 SP1现在允许Unicode压缩(和其他大多数企业以前只拥有)的MS SQL的所有版本,包括标准和快速。 这是不一样的UTF-8支持,但它产生类似的好处,如果我们的目标是磁盘西方字母空间减少。
其实,有使用UTF8,通过创建SQLCLR UDF,你可以从微软下载的代码没有问题。 检查此链接: http://technet.microsoft.com/en-us/library/ms160893(v=sql.90).aspx
两个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