数据库、表、列排序规则的区别

Posted

技术标签:

【中文标题】数据库、表、列排序规则的区别【英文标题】:Difference between database, table, column collation 【发布时间】:2014-08-12 21:54:27 【问题描述】:

我了解排序规则是一组用于对字符集进行比较的规则。 mysql / MariaDB 除了列排序规则外,还有表和数据库排序规则。我想知道这三个(数据库、表和列)的排序规则有什么区别。

谢谢。

【问题讨论】:

SELECT 'e' = 'é' 应该返回什么?没有可参考的表格,就必须有一些“更高”的排序规则,对吧? 不要忘记服务器排序规则,它在服务器和客户端之间的连接握手期间设置(或使用默认值)。 【参考方案1】:

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

优先顺序,最高为最低优先:

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

服务器排序规则由服务器设置,该设置可以在my.cnf 内部设置,也可以在从源代码构建服务器时设置。默认情况下,这通常是 latin1utf8,具体取决于您的平台。

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

数据库排序规则是在数据库创建期间设置的,或者稍后通过手动更新来设置。如果您不指定,它将使用下一个更高级别的排序规则,它可以是特定于连接的排序规则,也可以是服务器排序规则。

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

column collat​​ion 使用表的 collat​​ion 作为其默认值,如果没有设置 collat​​ion,它会沿着链查找要使用的 collat​​ion,如果所有的 collat​​ion 都停止在服务器上其他没有设置。

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

另请参阅手册页Character Set Support。

【讨论】:

【参考方案2】:

简而言之。当您设置服务器排序规则时。转为 UTF-8。创建的所有未定义排序规则的数据库都将从服务器继承它。

column iherits from table
table inherits from database
database inherits from server

但是,您可以在其中一个点覆盖默认服务器。那么一切都会继承自它。

【讨论】:

您的回答也很好,谢谢,但我标记了另一个,因为它提供了我认为有用的更多信息。谢谢! 如果我更改表的排序规则,它会更新所有列排序规则(如果未指定)吗? 不。继承仅在创建时应用。如果您修改表,那么新列将获得新的排序规则,但旧列将保持原样。

以上是关于数据库、表、列排序规则的区别的主要内容,如果未能解决你的问题,请参考以下文章

更改列排序规则

与临时表中的列进行比较时发生 SQL 排序规则冲突

SQL Server 2005 排序规则问题

拉丁表中外语字段的查询排序规则

如何将排序规则更改为数据库的所有列?

字符串的排序规则和数据类型不兼容