数据库、表和列的排序规则之间有什么区别?

20
我知道排序规则(collations)是一组用于字符集比较的规则。MySQL/MariaDB除了列排序规则外,还有表和数据库排序规则。我想知道这三种(数据库、表和列)排序规则之间的区别。
谢谢。

3
SELECT 'e' = 'é' 应该返回 0,因为这两个字符不相等。在没有表格作为参考的情况下,必须有一定的“更高级”的排序规则。 - Niet the Dark Absol
不要忘记服务器排序规则,在服务器和客户端之间的连接握手期间设置(或使用默认值)。 - Carl Bennett
2个回答

36

MySQL的字符集和排序规则可以被解释为一个自上而下的优先级列表。最上面的是最低优先级,最下面的是最高优先级。

按照优先级从高到低的顺序如下:

  • 服务器排序规则
  • 连接特定的排序规则
  • 数据库排序规则
  • 表格排序规则
  • 列排序规则
  • 查询排序规则(使用 CASTCONVERT

服务器排序规则 是由服务器设置的,它在 my.cnf 中或者在构建服务器源代码时设置。默认情况下,这通常是 latin1 或者 utf8,具体取决于您使用的平台。

连接特定的排序规则 是由客户端使用类似 SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'; 的查询来设置。大多数客户端不会设置连接特定的排序规则,所以服务器将使用其自己的默认设置,如上所述。

数据库排序规则 在创建数据库时设置,或者稍后手动更新。如果您没有指定排序规则,它将使用更高级别的排序规则,这可能是连接特定的或服务器排序规则。

表格排序规则 与数据库排序规则相同,除非留空,它将使用数据库作为其默认值,然后是连接特定的,最后是服务器的排序规则。

列排序规则 使用表格的排序规则作为其默认值,如果没有设置排序规则,则沿着链条查找要使用的排序规则,直到找到服务器为止。

查询排序规则 是通过使用 CASTCONVERT 在查询中指定的,否则将使用链条中下一个可用的排序规则。除非使用函数,否则无法设置这个。

请同时参考手册页面字符集支持


4
简单来说,当你将服务器校对规则设置为UTF-8时,所有没有定义校对规则的数据库都会从服务器继承它。
column iherits from table
table inherits from database
database inherits from server

然而,在这些点之一,您可以覆盖默认服务器。那么,所有内容都将从它继承。


1
你的回答也很好,谢谢。但是我选择了另一个答案,因为它提供了更多我认为有用的信息。谢谢! - Omar Abdel Bari
如果我更改表的排序规则,它会更新所有列的排序规则吗(如果没有指定)? - maestro
不行。继承只适用于创建时。如果您修改表格,则新列将获得新的排序规则,但旧列将保持原样。 - Grzegorz

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