【问题标题】:Differentiate ø and ae区分 ø 和 ae
【发布时间】:2018-02-05 07:56:17
【问题描述】:

当我执行 SQL 时,aeæ 被解释为相同(丹麦排序规则):

select * from directories where path='test.dk\kkl$\Faelles'

有没有办法做一个处理 æ 和 ae 唯一的查询?

【问题讨论】:

  • 给我们准确的排序规则。 utf8_general_ci 比较这些字符没有问题。
  • 您的问题标题为“ø and ae”,而您的问题正文为“ae and æ”。什么是正确的?
  • 无法重现:SELECT CASE WHEN 'ae' COLLATE Danish_Greenlandic_100_CI_AI = 'æ' COLLATE Danish_Greenlandic_100_CI_AI THEN 1 ELSE 0 END 产生 0,即使使用 _AI,即不区分重音的排序规则。

标签: sql sql-server


【解决方案1】:

我在这里完全使用了@Heinzi 的代码(他使用了排序规则) 我只是想通过示例展示如何在 WHERE 子句和 ORDER BY 子句中使用它

起初我虽然你需要 NVARCHAR() 数据类型,但我看到 VARCHAR() 也支持丹麦字符没有问题(至少你的示例)

declare @code nvarchar(100) = 'æ'
--declare @code nvarchar(100) = 'ae'

select * 
from Danish
where code = @code COLLATE Danish_Greenlandic_100_CI_AI 
--order by code COLLATE Danish_Greenlandic_100_CI_AI desc

所以您需要在 WHERE 子句或 ORDER BY 中为每个条件或按字段分组设置 Collat​​ion with COLLATE 子句,

@Thomas 发表评论后,我添加了以下查询。 它将为“æ”和“ae”生成单独的行

SELECT
    path COLLATE Danish_Greenlandic_100_CI_AI, 
    migrate, ismigrationroot, 
    COUNT(*) as CNT 
FROM directories 
GROUP BY 
    path COLLATE Danish_Greenlandic_100_CI_AI,
    migrate,
    ismigrationroot 
HAVING 
    COUNT(*) > 1 and 
    ismigrationroot is not null

【讨论】:

  • 我在上面试过了,你会在哪里添加整理:SELECT path,migrate,ismigrationroot, COUNT() as CNT FROM directory GROUP BY path ,migrate,ismigrationroot HAVING COUNT( ) > 1 并且 ismigrationroot 不为空
  • 请查看我的帖子,我在您发表评论后添加了第二个查询。您应该同时将 COLLATE 与 Select 字段和 Group By 字段一起使用
  • 谢谢,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2012-06-16
  • 2017-04-13
相关资源
最近更新 更多