SQL 服务器 : impact of column collation on T-SQL instructions

标签 sql sql-server tsql collation case-sensitive

我今天发现(*),根据服务器的不同,我的 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/

相关文章:

mysql - 减少查询 Yii2

sql-server - AFTER INSERT 触发器可以在 SQL Server 的同一个表中包含插入语句吗?

sql-server - 将 Azure blob 附加到 SQL 数据库

mysql - 在 sql 中执行 SCD 的通用过程

mysql - 我尝试获取一些按日期、编号排序的数据,并获取每件商品的最后价格

c# - 我当前的架构/语法和编码存在大问题

sql - 唯一标识符与身份

sql - 使用起始值设置 Identity_insert ON

mysql - 组前选择顺序

sql - 我想了解以下字符串如何介于其他 2 个字符串之间