如何在SQL Server数据库中使用UTF-8排序规则?

Tes*_*son 72 sql-server utf-8

我已经使用UTF8将数据库从mysql迁移到SQL Server(政治),原始的mysql数据库.

现在我读到https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collat​​ion-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).

  • @ user247245:8到11位之间的字符代码在UTF-8中编码为"110xxxxx 10xxxxxx"(其中"x"表示数据位),因此字符代码"F0"(`00011110000`为11位)编码为` 11000011 10110000`(从第一个字节的字符代码中输入"00011",在第二个字节中输入"110000"),即"C3 B0". (3认同)
  • @ user247245:UTF-8是编码,Unicode是字符集.UTF-8是一种保存Unicode的方法.您用来表示Unicode的是字符串文字中使用的转义码,通常不会将Unicode表示为文件.UTF-32将是从Uncode直接转换为文件格式的最接近的转换,其中每个字符代码保存为32位数字. (2认同)

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取代.

  • 嗨再次,抱歉延迟,但感谢代表,使用sqlsrv_connect(,数组("CharacterSet"=>"UTF-8")..在连接字符串工作正常.PDO出来了,对吗? (2认同)

Bar*_*z X 15

看起来这将最终在SQL Server 2019中得到支持! SQL Server 2019 - 什么是新的?

来自BOL:

UTF-8支持

完全支持广泛使用的UTF-8字符编码作为导入或导出编码,或作为文本数据的数据库级或列级排序规则.在CHARVARCHAR数据类型中允许使用UTF-8 ,并在创建或更改对象的排序规则到具有UTF8后缀的排序规则时启用UTF-8 .

例如,LATIN1_GENERAL_100_CI_AS_SCLATIN1_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)