越南语校对中的“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
Run Code Online (Sandbox Code Playgroud)
结果:
-----
match
--------
no match
-----
match
Run Code Online (Sandbox Code Playgroud)
第二个 T-SQL 产生不匹配。't' 和 'R' 的其他组合则不然。
List of databases
Name | Owner | Encoding | Collate | Ctype |
-------------------------+----------+----------+----------------------------+----------------------------|
MyDatabase | postgres | UTF8 | English_United States.1252 | English_United States.1252 |
Run Code Online (Sandbox Code Playgroud)
有人能解释一下编码、整理和 Ctype 是如何相互关联的吗?
我知道编码会影响信息的实际存储方式(即“A”需要一个字节还是多个字节,以及这些字节的值取决于编码)。
有人告诉我 collate 指定比较字符的规则。如果要对一堆字符串进行排序,则整理类型将决定顺序。
我一直在努力寻找 Ctype 是什么;可能与大写和小写等概念有关(假设 'a' 知道 'A' 是大写形式?)。
我不明白(如在我的示例中)我如何拥有一个 UTF8 编码的数据库并使用英语 1252 的校对值。UTF8 有很多 win1252 没有的字符;如果我尝试对它们进行排序或比较会发生什么?我当前的设置是荒谬的......似乎我总是希望编码/整理/Ctype 同意?
我有这些整理:
postgres=# select * from pg_collation; 姓名 | collnamespace | 领主| collencoding | 整理 | 类型 ------------+--------------+-----------+--------- -----+-------------+------------ 默认 | 11 | 10 | -1 | | C | 11 | 10 | -1 | C | C POSIX | 11 | 10 | -1 | POSIX | POSIX zh_CN | 11 | 10 | 6 | en_US.utf8 | en_US.utf8 en_US.utf8 | 11 | 10 | 6 | en_US.utf8 | en_US.utf8 ucs_basic | 11 | 10 | 6 | C …
我有一个使用French_CI_AS
排序规则的 SQL Server 法语安装。出于遗留原因,表列将数据存储VARCHAR
为稍后转换为正确类型的数据,类似于 C++ 中的变体。
此列中的两行数据如下:
2020-10-12 22:54:40
2020-10-13 04:42:10
Run Code Online (Sandbox Code Playgroud)
DATETIME
使用默认选项转换为时,第二个日期失败。该应用程序使用 ODBC 转义序列。SQL 等COLMVALUE >= {ts'2020-01-01 00:00:00'}
失败并显示错误:
La Conversion d'un type de données nvarchar en type de données datetime a créé une valeur hors limites
我做了一个DBCC useroptions
,服务器的日期格式设置为dmy
. 为什么第 2 行失败?看起来它试图将“13”解释为月份。如果格式是dmy
,两个日期不应该都失败吗?
此外,有趣的是,在此服务器上,以下失败:
2020-10-12 22:54:40
2020-10-13 04:42:10
Run Code Online (Sandbox Code Playgroud)
但这有效:
DECLARE @datevar DATETIME = '2020-10-13 04:42:10';
SELECT @datevar;
Run Code Online (Sandbox Code Playgroud)
我知道这DATETIME2
比DATETIME
. 但是,这里的两者似乎连解析都不一样。
collation type-conversion datetime localization sql-server-2016