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

29

起初,我在本地计算机上创建了我的SQL Server数据库。我将其排序规则设置为Latin1_General_CI_AI,一切运行良好。当我把完成的工作移到Web托管的SQL Server时,遇到了问题:它们使用不同的数据库排序规则。那么现在该怎么办呢?

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

当我尝试更改数据库的排序规则时,服务器报错说我没有用户权限来执行此操作。我试图联系支持中心,但没有成功。我能自己解决吗?

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

2个回答

38

要更改数据库的排序规则

ALTER DATABASE MyDataBase COLLATE [NewCollation]
改变列的排序规则
ALTER TABLE MyTable ALTER COLUMN Column1 [TYPE] COLLATE [NewCollation]
但是在某些情况下,你是有更多操作空间的,尤其是当该列未被用于任何索引时。
在SSMS中,你可以做更多的事情。
语法文档列出了限制:

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

4

我尝试了这段代码,它对我有效:

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

参考文献:https://learn.microsoft.com/en-us/sql/relational-databases/collations/set-or-change-the-column-collation?view=sql-server-ver15 这篇文章介绍了如何在 Microsoft SQL Server 数据库中设置或更改列排序规则(Collation)。通过更改排序规则,可以使数据库支持特定语言或区域性的数据排序和比较。具体步骤包括:确定需要更改排序规则的列和表格,使用 ALTER TABLE 语句更改排序规则并验证更改是否成功。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接