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 / 问题 / 294387
Accepted
Eng.Fouad
Eng.Fouad
Asked: 2021-06-17 07:35:55 +0800 CST2021-06-17 07:35:55 +0800 CST 2021-06-17 07:35:55 +0800 CST

Arabic_100_CS_AS_KS_WS_SC_UTF8 和 Latin1_General_100_CS_AS_KS_WS_SC_UTF8 有什么区别?

  • 772

从 SQL Server 2019 开始,它支持 UTF-8 作为排序规则。但是,根据以下查询:

SELECT COLLATIONPROPERTY('Arabic_100_CS_AS_KS_WS_SC_UTF8', 'CodePage')
SELECT COLLATIONPROPERTY('Latin1_General_100_CS_AS_KS_WS_SC_UTF8', 'CodePage');

65001两者都返回Windows 中的 Unicode代码页。此外,所有新的_UTF8排序规则都使用代码页65001:

SELECT * FROM sys.fn_helpcollations() WHERE name LIKE '%_UTF8';

Arabic_100_CS_AS_KS_WS_SC_UTF8using和Latin1_General_100_CS_AS_KS_WS_SC_UTF8as collat​​ion之间有什么区别吗?

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

1 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2021-06-17T08:04:24+08:002021-06-17T08:04:24+08:00

    是的,所有_UTF8排序规则都使用代码页 65001,因为这是UTF-8 的代码页。您甚至可以通过以下方式在 DOS / 命令窗口中使用 65001:

    chcp 65001
    

    尽管并非所有程序和字体都可以与它无缝协作。

    对于_UTF8排序规则,代码页不受文化(即Latin1_Generalvs Arabic)的控制,_UTF8因为代码页指示用于VARCHAR数据的特定 8 位编码(即 8 位字符数据)。对于非 Unicode 8 位编码,文化通常与作为字符集的代码页相关联(例如,Latin1 是代码页 Windows-1252,它在 128-255 范围内的字符与作为代码的 Windows-1255 不同希伯来语页面)。但是对于 UTF-8,它是8 位编码,用于单数、无所不包的字符集,即 Unicode。

    至于Arabic_100_CS_AS_KS_WS_SC_UTF8和Latin1_General_100_CS_AS_KS_WS_SC_UTF8去之间的差异,它实际上只是对各种字符进行排序和比较的特定文化规则。当然,这两种语言并没有真正共享任何字符,但是在某些代码点的处理方式上仍然存在差异。

    查看“Windows Server 2008 排序权重表”文件(据我所知,这是版本_100_排序规则的主要依据),我找不到这两个排序规则之间的任何排序/比较差异。因此,就行为而言,它们可能是相同的。但是,它们是不同的,因为它们仍然具有不同的 LCID(区域设置/文化标识符),因此将它们的值转换为非 UTF8VARCHAR可能会导致数据丢失/损坏,以及查看排序规则的任何进程/功能确定某些其他行为可能表现不同。


    话虽如此,我确实找到了一个使用乌尔都语排序规则时阿拉伯字符行为差异的示例,因为这些排序规则确实对默认排序权重进行了一些修改(9 在“Windows Server 2008 排序权重表”文件中注册) .

    查看“Teh Marbuta”字符(U+0629),它在默认表(即用于美国英语/Latin1 的表)中的权重为 29,其排序权重低于“Peheh”字符(U +06A6),默认权重为 137。41 表示字符在哪个“脚本”中,这两个都是阿拉伯字符。但是,乌尔都语排序规则将“Teh Marbuta”(U+0629)的排序权重修改为 183,然后其排序权重高于“Peheh”(U+06A6),仍然为 137。

    -- Default
    0x0629  41  29  2   2   ;Arabic Teh Marbuta -- ة
    0x06a6  41  137 2   2   ;Arabic Peheh       -- ڦ
    
    -- Urdu modifications
    0x0629  41  183 2   2   ;Teh Marbuta        -- ة
    

    如果我们使用Latin1_General_100_CS_AS_KS_WS_SC_UTF8or对这两个字符进行排序Arabic_100_CS_AS_KS_WS_SC_UTF8,我们应该得到默认行为。而且,即使我们使用Yakut排序规则,它使用西里尔字母并且对默认排序权重有自己的修改,它不会修改这些阿拉伯字符中的任何一个,因此它们的行为应该与使用Latin1_General或Arabic排序规则时相同:

    SELECT *
    FROM   (VALUES (1, NCHAR(0x0629)), (2, NCHAR(0x06a6))) tmp(ID, TheChar)
    ORDER BY tmp.[TheChar] COLLATE Latin1_General_100_CS_AS_KS_WS_SC_UTF8 ASC
    
    SELECT *
    FROM   (VALUES (1, NCHAR(0x0629)), (2, NCHAR(0x06a6))) tmp(ID, TheChar)
    ORDER BY tmp.[TheChar] COLLATE Arabic_100_CS_AS_KS_WS_SC_UTF8 ASC
    
    
    SELECT *
    FROM   (VALUES (1, NCHAR(0x0629)), (2, NCHAR(0x06a6))) tmp(ID, TheChar)
    ORDER BY tmp.[TheChar] COLLATE Yakut_100_CS_AS_KS_WS_SC_UTF8 ASC
    

    上面显示的所有三个查询都返回以下结果:

    ID    TheChar
    1     ة
    2     ڦ
    

    但是,当我们切换到Urdu排序规则时,这两个字符的顺序确实发生了变化:

    SELECT *
    FROM   (VALUES (1, NCHAR(0x0629)), (2, NCHAR(0x06a6))) tmp(ID, TheChar)
    ORDER BY tmp.[TheChar] COLLATE Urdu_100_CS_AS_SC_UTF8 ASC
    

    返回:

    ID    TheChar
    2     ڦ
    1     ة
    

    最后,请记住,虽然很少遇到这种情况,但排序规则也会影响大写/小写映射。我相信这仅限于Azeri_*和Turkish排序规则,并且仅限于字母“i”和“I”(这些文化有一个带点的大写“I”和一个不带点的小写“i”),但仍然最好注意潜在的:

    SELECT UPPER(N'i' COLLATE Arabic_100_CS_AS_KS_WS_SC_UTF8) AS [Arabic],
       UPPER(N'i' COLLATE Turkish_100_CS_AS_KS_WS_SC_UTF8) AS [Turkish],
       UPPER(N'i' COLLATE Azeri_Cyrillic_100_CS_AS_KS_WS_SC_UTF8) AS [Azeri_Cyrillic],
       UPPER(N'i' COLLATE Azeri_Latin_100_CS_AS_KS_WS_SC_UTF8) AS [Azeri_Latin];
    

    返回:

    Arabic   Turkish   Azeri_Cyrillic   Azeri_Latin
    I        İ         İ                İ
    
    • 11

相关问题

  • 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