我今天发现(*),根据服务器的不同,我的 TSQL 命令区分大小写,这意味着,当一个表的列命名为 tableId
时,以下指令可能不会成功:
SELECT TableId FROM myTable
取决于列的排序规则。 SQL_Latin1_blablabla
似乎不区分大小写,而 Latin1_blablabla
是。
所以我的第一个问题是为什么!!!
第二个是:更改数据库中所有相关列的所有排序规则的最快技巧(sp?)是什么?
编辑:让事情变得非常清楚:
SELECT tableId FROM myTable
同时在所有服务器上工作
SELECT TableId FROM myTable
仅适用于具有 SQL_Latin_blablabla
排序规则的服务器。注意 2 个字符串之间的区别。我们在这里讨论的不是数据整理,而是这种整理对我们编写代码方式的影响!
(*) 我可以在这里使用一些额外的和特定的词来限定我在这个“发现”之后的心态,但它们都是成人级别的......
最佳答案
这称为排序规则,它控制 SQL Server 是否将您的字符串视为区分大小写和/或区分重音(例如,它是否会识别 è é à 等等,或者将它们视为 e a 等等)
这是一个功能 - 不是错误!
你可以用这个命令找到你当前的排序规则:
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
你会得到类似的东西:
Latin1_General_CI_AS
“CI”表示:不区分大小写 - CS 表示区分大小写
“AS”的意思是:口音敏感(AI 对口音不敏感)
您可以在安装 SQL Server 时为其定义标准排序规则,并且可以为您创建的每个数据库覆盖它。
您还可以轻松地创建表和列,并为每个 VARCHAR 字段指定特定的排序规则。
要更改数据库的排序规则,您可以使用以下命令:
ALTER DATABASE MyDatabase COLLATE <desired collation>
不幸的是,此命令可能失败的原因有很多......任何“模式绑定(bind)”的东西都会阻止排序规则的更改。在这种情况下,您只能放弃或禁用所有这些“障碍”,然后重试 - 真是一场考验!
如果您选择例如“Latin1_General_CI_AS”,您不应再有区分大小写的表名和列名。
如果要更改数据表中单个列的排序规则,请使用以下命令:
ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(20)
COLLATE Latin1_General_CS_AS -- or whatever collation you want
马克
关于SQL 服务器 : impact of column collation on T-SQL instructions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1589023/