3

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

SELECT TableId FROM myTable

取决于列的排序规则。SQL_Latin1_blablabla似乎不区分大小写,什么时候Latin1_blablabla是。

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

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

编辑:让事情变得非常清楚:

SELECT tableId FROM myTable

同时在所有服务器上工作

SELECT TableId FROM myTable

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

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

4

2 回答 2

5

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

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

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

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

你会得到类似的东西:

Latin1_General_CI_AS

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

“AS”的意思是:口音敏感(AI 对口音不敏感)

您可以在安装 SQL Server 时为其定义标准排序规则,并且可以为您创建的每个数据库覆盖它。

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

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

ALTER DATABASE MyDatabase COLLATE <desired collation>

不幸的是,这个命令可能失败的原因有很多......任何“模式绑定”的东西都会阻止排序规则的改变。在这种情况下,您只能放弃或禁用所有这些“障碍”,然后再试一次——真是一场考验!

如果您选择例如“Latin1_General_CI_AS”,则不应再有区分大小写的表和列名称。

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

ALTER TABLE Table1
  ALTER COLUMN Column1 VARCHAR(20)
    COLLATE Latin1_General_CS_AS  -- or whatever collation you want

马克

于 2009-10-19T14:38:25.167 回答
4

继 marc_s

sys.objects、sys.columns 等将列名和对象名存储在数据库的排序规则中。因此,二进制排序规则意味着对象名称被视为二进制...

于 2009-10-19T14:43:21.783 回答