MS SQL 的中文排序

Jar*_*cek 5 t-sql sql-server localization chinese-locale

我在亚洲市场的生产数据库中发现了奇怪的行为。在中文字母的情况下,条件不像人们所期望的那样工作。

create table #Temp  (TextContent nvarchar(20), ChineseType varchar(10))

insert #Temp values (N'?', '??')  --odd
insert #Temp values (N'', '??')  --odd
insert #Temp values (N'?', '??')  --odd
insert #Temp values (N'?', 'prc') --odd
insert #Temp values (N'?', 'prc')
insert #Temp values (N'?', 'prc')
insert #Temp values (N'?', 'prc')
insert #Temp values (N'?', 'prc')
insert #Temp values (N'?', 'taiwan')
insert #Temp values (N'?', 'taiwan')
insert #Temp values (N'?', 'taiwan')
insert #Temp values (N'?', 'taiwan')
insert #Temp values (N'?', 'taiwan')

select * from #Temp where TextContent like ''
select * from #Temp where TextContent like N''
select * from #Temp where TextContent like N'?'
-- all will return
-- |TextContent | ChineseType |
-- |     ?      |     ??      |
-- |           |     ??      |
-- |     ?      |     ??      |
-- |     ?      |     prc     |
Run Code Online (Sandbox Code Playgroud)

首先我发现默认的排序规则是 SQL_Latin1_General_CP1_CI_AS 因此我在谷歌上搜索了一些关于中文字母、排序、排序的理论,然后我尝试了 Chinese_PRC_CI_AS、Chinese_PRC_CI_AI、Chinese_PRC_CI_AS_KS_WS、Chinese_PRC_CS_AS_KS_WS 但没有成功。总是返回相同的结果。

select * from #Temp where TextContent like N'?' COLLATE Chinese_PRC_CI_AS
select * from #Temp where TextContent like N'?' COLLATE Chinese_PRC_CI_AI
-- all will return
-- |TextContent | ChineseType |
-- |     ?      |     ??      |
-- |           |     ??      |
-- |     ?      |     ??      |
-- |     ?      |     prc     |
Run Code Online (Sandbox Code Playgroud)

唯一的“按预期工作”是二进制排序规则,例如。Chinese_PRC_BIN、Chinese_PRC_BIN2、Latin1_General_BIN。

  • 有人解释为什么 Chinese_PRC_CI_AS 不起作用?
  • 什么是Chinese_PRC_BIN排序顺序类型?是中文部首(笔画)吗?

谢谢

Jar*_*cek 5

经过一番调查,我发现标准GB 18030定义了中国软件所需的语言和字符支持。我发现 Microsoft 的 System Center Configuration Manager仅在 db collat​​ion 设置为以下之一的情况下才与此标准兼容

  • Chinese_Simplified_Pinyin_100_CI_AI
  • Chinese_Simplified_Stroke_Order_100_CI_AI

我们的客户更喜欢笔画顺序,所以我尝试了 Chinese_Simplified_Stroke_Order_100_CI_AI 并且效果很好。

即使它没有回答为什么 Chinese_PRC_CI_AS 不起作用或有关 Chinese_PRC_BIN 排序的更多详细信息,它也是适用的解决方案。