SQL Server:列排序规则对T-SQL指令的影响

Phi*_*ier 3 sql t-sql sql-server collation case-sensitive

我今天发现(*),根据服务器的不同,我的TSQL命令区分大小写,这意味着,当一个表的列被命名时tableId,以下指令可能不会成功:

SELECT TableId FROM myTable
Run Code Online (Sandbox Code Playgroud)

取决于列的排序规则.SQL_Latin1_blablabla似乎不区分大小写,何时Latin1_blablabla是.

所以我的第一个问题是为什么!

第二个是:更新数据库中所有相关列的所有排序规则的最快技巧(sp?)是什么?

编辑:使事情非常清楚:

SELECT tableId FROM myTable
Run Code Online (Sandbox Code Playgroud)

适用于所有服务器

SELECT TableId FROM myTable
Run Code Online (Sandbox Code Playgroud)

仅在具有SQL_Latin_blablabla排序规则的服务器上有效.注意2个字符串之间的区别.我们不是在谈论数据整理,而是关于这种整理对我们编写代码的方式的影响!

(*)我可以在这里使用一些额外的和特定的词来限定我在'发现'后的心态,但所有这些都是成人评价的...

mar*_*c_s 5

这称为排序规则,它控制SQL Server是否将您的字符串视为区分大小写和/或区分重音(例如,如果它将识别ééà等,或者将它们视为与ea相同,等等)

这是一个功能 - 不是错误!

您可以使用以下命令找到当前的排序规则:

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Run Code Online (Sandbox Code Playgroud)

你会得到类似的东西:

Latin1_General_CI_AS
Run Code Online (Sandbox Code Playgroud)

"CI"表示:不区分大小写 - CS表示区分大小写

"AS"表示:重音敏感(和AI会不区分​​重音)

您可以在安装SQL Server时为其定义标准排序规则,并且可以为您创建的每个数据库重写该标准排序规则.

您还可以轻松创建表和列,并为每个VARCHAR字段指定特定的排序规则.

要更改数据库的排序规则,可以使用以下命令:

ALTER DATABASE MyDatabase COLLATE <desired collation>
Run Code Online (Sandbox Code Playgroud)

不幸的是,有很多原因可能导致此命令失败....任何"架构绑定"都会阻止整理更改.在这种情况下,你只能放弃或禁用所有这些"障碍",然后再试一次 - 这是一次严酷的考验!

如果选择"Latin1_General_CI_AS",则不应再具有区分大小写的表和列名称.

如果要更改数据表中单个列的排序规则,请使用以下命令:

ALTER TABLE Table1
  ALTER COLUMN Column1 VARCHAR(20)
    COLLATE Latin1_General_CS_AS  -- or whatever collation you want
Run Code Online (Sandbox Code Playgroud)