如何使用 SQL 设置列的排序规则?

Posted

技术标签:

【中文标题】如何使用 SQL 设置列的排序规则?【英文标题】:How to set collation of a column with SQL? 【发布时间】:2012-08-25 17:06:41 【问题描述】:

最初,我在本地计算机上创建了我的 SQL Server 数据库。我将其排序规则设置为Latin1_General_CI_AI,一切正常。当我将完成的工作移到托管 SQL Server 的 Web 上时,我遇到了问题:他们使用不同的数据库排序规则。那我现在能做什么?

更具体地说,我需要Latin1_General_CI_AI,但他们有Czech_CI_AS。在比较捷克语中的字符串时,这两者有很大不同(令人惊讶的是,我需要 latin1 通用而不是捷克语才能获得正确的结果。)

当我尝试更改数据库的排序规则时,服务器抱怨说我没有执行此操作的用户权限。我试图联系支持台,但没有成功。我可以帮助自己吗?

我知道可能每个单独的表列都可以有自己的排序规则,所以也许我应该将所有字符串列设置为Latin1_CI_AI。但我不知道该怎么做。我对数据库只有 SQL 访问权限(遗憾的是没有 SQL Server Management Studio)。

【问题讨论】:

【参考方案1】:

更改数据库的排序规则

ALTER DATABASE MyDataBase COLLATE [NewCollation]

更改列的排序规则

ALTER TABLE MyTable ALTER COLUMN Column1 [TYPE] COLLATE [NewCollation]

但是对于何时可以执行此操作有许多限制,特别是如果在任何索引中使用该列,则此操作将被拒绝。 在某些情况下,您可以在 SSMS 中做更多事情。 语法文档列出了限制:

https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql?view=sql-server-2017 https://docs.microsoft.com/en-us/sql/t-sql/statements/collations?view=sql-server-2017

【讨论】:

也许这些命令是正确的,但它们对我不起作用。第一个说我没有权限这样做,第二个说该列上有一个依赖对象 CK_something,因此无法更改排序规则。 (这对我来说没有意义 - 我不明白那个依赖对象是什么,以及为什么它会阻止排序规则。) 最后,什么对我有用:我在 SQL Management Studio 中创建了“CREATE TABLE”脚本,然后在记事本中打开它并手动添加了COLLATE Latin1_General_CI_AI' to each NVARCHAR' 列定义。然后我在虚拟主机服务器上的一个新的空数据库中执行了这个脚本。 我认为 CK_something 可能是集群键,任何类型的键都被视为数据库中的对象,如果要删除或更改具有键的列,则必须删除如果需要,请先添加密钥(在 SQLMS 中,您可以创建脚本来创建和删除密钥)。 如果列参与任何索引,我们不能使用 t-sql ALTER TABLE 更改排序规则似乎是正确的。它可以在 SSMS 中完成 - 也许它会默默地重建索引。 (我相信有一个设置允许这样做)【参考方案2】:

我试过这段代码,它对我有用:

ALTER TABLE dbo.MyTable 
ALTER COLUMN CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8

参考:https://docs.microsoft.com/en-us/sql/relational-databases/collations/set-or-change-the-column-collation?view=sql-server-ver15

【讨论】:

以上是关于如何使用 SQL 设置列的排序规则?的主要内容,如果未能解决你的问题,请参考以下文章

发现 MySQL 列的排序规则

如何选择 SQL Server 数据库的排序规则

SQL Server 中索引的排序规则

SQL Server 不区分大小写的排序规则

SQL Server 案例/排序规则问题

使用 SC 排序规则的 SQL Server Unicode 查询