代码之家  ›  专栏  ›  技术社区  ›  Philippe Grondier

SQL Server:列排序规则对T-SQL指令的影响

  •  3
  • Philippe Grondier  · 技术社区  · 15 年前

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

    SELECT TableId FROM myTable
    

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

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

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

    编辑:要使事情非常清楚:

    SELECT tableId FROM myTable
    

    在所有服务器上工作

    从MyTable中选择TableID
    

    仅在服务器上使用 SQL_Latin_blablabla 校对。注意这两个字符串之间的区别。这里我们不是讨论数据排序,而是讨论这种排序对我们编写代码的方式的影响!

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   gbn    15 年前

    Marc_的后续报道

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

        2
  •  5
  •   marc_s    15 年前

    这称为排序规则,它控制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>
    

    不幸的是,有 太多了 这条命令可能失败的原因……任何“模式绑定”都将阻止排序规则更改。在这种情况下,您只能放弃或禁用所有这些“路障”,然后再试一次-相当严峻的考验!

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

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

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

    马克