我已经使用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托管多个数据库,主要是拉丁文编码的.由于迁移的数据库用于Web发布,我想保留utf8编码.我是否遗漏了某些内容或者我是否需要在应用程序级别进行加/减?
Guf*_*ffa 21
UTF-8不是字符集,它是一种编码.UTF-8的字符集是Unicode.如果要存储Unicode文本,请使用nvarchar数据类型.
如果数据库使用UTF-8存储文本,您仍然不会将文本作为编码的UTF-8数据输出,您可以将其作为解码文本获取.
您可以轻松地将UTF-8编码的文本存储在数据库中,但是您不将其存储为文本,而是将其存储为二进制数据(varbinary).
edz*_*dze 19
没有!这可不是说笑.
看看这里: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取代.
Bar*_*z X 15
看起来这将最终在SQL Server 2019中得到支持! SQL Server 2019 - 什么是新的?
来自BOL:
UTF-8支持
完全支持广泛使用的UTF-8字符编码作为导入或导出编码,或作为文本数据的数据库级或列级排序规则.在
CHAR和VARCHAR数据类型中允许使用UTF-8 ,并在创建或更改对象的排序规则到具有UTF8后缀的排序规则时启用UTF-8 .例如,
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)需要22个字节用于存储,而CHAR(10)对于相同的Unicode字符串需要12个字节.
小智 5
T-SQL中处理UTF-8的两个UDF:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
165506 次 |
| 最近记录: |