首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在SQL Server数据库中使用UTF-8排序规则?

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

Stack Overflow用户
提问于 2012-09-20 20:35:35
回答 3查看 232.1K关注 0票数 91

我已经将一个数据库从mysql迁移到SQL Server (politics),原始的mysql数据库使用UTF8。

现在我在https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collation-charset上看到SQL Server2008不支持utf8,这是在开玩笑吗?

SQL Server托管多个数据库,其中大部分是拉丁语编码的数据库。由于迁移的数据库是用于web发布的,所以我想保留UTF8编码。我是否遗漏了什么,或者我是否需要在应用程序级别进行enc/dec?

EN

回答 3

Stack Overflow用户

发布于 2015-08-21 05:23:28

UTF-8不是一个字符集,它是一种编码。UTF-8的字符集是Unicode。如果要存储Unicode文本,则使用nvarchar数据类型。

如果数据库使用UTF-8存储文本,您仍然不会将文本作为编码的UTF-8数据提取出来,而是将其作为解码的文本提取出来。

您可以很容易地将UTF8编码的文本存储在数据库中,但是您不会将其存储为文本,而是将其存储为二进制数据(varbinary)。

票数 36
EN

Stack Overflow用户

发布于 2018-11-24 22:33:07

在T-SQL中处理UTF-8的两个UDF:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2016-07-20 05:57:32

请注意,从Microsoft SQL Server 2016开始,bcpBULK_INSERTOPENROWSET都支持UTF-8。

附录2016-12-21: SQL Server 2016 SP1现在为所有版本的MS SQL启用统一码压缩(以及其他大多数以前仅供企业使用的功能),包括标准版和快捷版。这与UTF-8支持不同,但如果目标是减少西方字母表的磁盘空间,则会产生类似的好处。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12512687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档