AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 298499
Accepted
QFirstLast
QFirstLast
Asked: 2021-08-25 10:59:13 +0800 CST2021-08-25 10:59:13 +0800 CST 2021-08-25 10:59:13 +0800 CST

为什么在具有越南语_CI_AI 排序规则的 SQL Server 上比较 'tr' 和 'tR' 失败?

  • 772

越南语整理中的“tR”似乎有一些特别之处。了解它的人是否可以简单地解释一下。这个问题是在我们的产品安装在“越南语”整理的 SQL Server 上时发现的。架构中的一个表的名称中包含“tR”,但存储过程正在引用所有小写“tr”的表。这个参考失败了。

我猜这种情况类似于其他排序规则中的'阝'匹配'ss'。

这是一个复制品:

select  case when 'tr' = 'tR' COLLATE SQL_Latin1_General_CP1_CI_AS   then 'match' else 'no match' end 
select  case when 'tr' = 'tR' COLLATE Vietnamese_CI_AI   then 'match' else 'no match' end 
select  case when 'tr' = 'TR' COLLATE Vietnamese_CI_AI   then 'match' else 'no match' end 

结果:

-----
match


--------
no match


-----
match

第二个 T-SQL 产生不匹配。't' 和 'R' 的其他组合没有。

sql-server collation
  • 1 1 个回答
  • 1087 Views

1 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2021-08-25T11:25:18+08:002021-08-25T11:25:18+08:00

    鉴于此行为存在于该排序规则的较新版本中,并且诸如“fr”和“fR”之类的组合确实匹配(如预期的那样),它只能是该字符组合的特定于文化的语言规则。

    SELECT CASE WHEN 'tr' = 'tR' COLLATE Vietnamese_100_CI_AI THEN 'Y' ELSE 'N' END;
    -- N
    
    SELECT CASE WHEN 'fr' = 'fR' COLLATE Vietnamese_100_CI_AI THEN 'Y' ELSE 'N' END;
    -- Y
    

    我在排序权重文件中找到了规则**。特殊的是“tr”的组合(越南语),而不是“tR”。越南语似乎有某些字母组合组合成一个字符,例如西班牙语中的“CH”和“LL”组合。因此,以下是“T”+“R”组合形成越南语的“字符”的有效组合:

    1. tr
    2. Tr
    3. TR

    “tR”的组合不形成“TR”字符,很可能是因为这是一种不自然的大写,更意味着单词的分离,例如使用 Pascal / Camel 大小写(例如“Cha tR oom”和“cha tR oom”,分别与“ tR ogdor the Burninator ”相对(我有根据的猜测)。

    以下示例显示“tr”组合在“tz”之后排序:

    SELECT *
    FROM   (VALUES (N'Atra'), (N'Atz'), (N'Aua'), (N'Ata'), (N'AtR')) tmp(col)
    ORDER BY tmp.[col] COLLATE Vietnamese_100_CI_AI ASC
    /*
    Ata
    AtR
    Atz
    Atra
    Aua
    */
    

    这些结果是由于“tr”组合形成一个自然排序在“t”之后的单个字符。意思是,排序算法看到以下内容:

     Character #
    1  |  2   | 3
    -------------
    A  |  t   | a
    A  |  t   | R
    A  |  t   | z
    A  |  tr  | a
    A  |  u   | a
    

    越南语还有其他两个字母组合,其工作方式与“TR”相同(即不区分大小写:)tr == Tr == TR <> tR:

    1. 甲烷
    2. 胃肠道
    3. KH
    4. NG
    5. NH
    6. 酸碱度
    7. 曲
    8. TH

    有关使用排序规则/编码/Unicode 的更多信息,请访问我的网站:排序规则信息


    **排序权重文件包含代码点及其各自的权重值,这些权重值分为不同的类别,例如变音符号权重、案例权重等。通常有描述转换的部分,例如将两个代码点组合为单个权重特定的文化/地区(例如越南语)。可以有将预先组合的字符分解为单个字符等的映射。请参阅:访问 Windows 排序权重表。

    注意: Microsoft 提供了多个分类权重文件,因为这些文件多年来随着新版本 Windows 和 Windows Server 的发布而更新。请记住,这些文件都不是 100% 匹配 SQL Server 使用的规则。我们得到的最接近的是Windows Server 2008 Sorting Weight Table.txt文件,它应该与版本 100 排序规则(即_100_名称中带有的排序​​规则)的行为非常匹配。

    • 31

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve