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个字符串之间的区别.我们不是在谈论数据整理,而是关于这种整理对我们编写代码的方式的影响!
(*)我可以在这里使用一些额外的和特定的词来限定我在'发现'后的心态,但所有这些都是成人评价的...
这称为排序规则,它控制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)
渣