数据库、表、列排序规则的区别
Posted
技术标签:
【中文标题】数据库、表、列排序规则的区别【英文标题】:Difference between database, table, column collation 【发布时间】:2014-08-12 21:54:27 【问题描述】:我了解排序规则是一组用于对字符集进行比较的规则。 mysql / MariaDB 除了列排序规则外,还有表和数据库排序规则。我想知道这三个(数据库、表和列)的排序规则有什么区别。
谢谢。
【问题讨论】:
SELECT 'e' = 'é'
应该返回什么?没有可参考的表格,就必须有一些“更高”的排序规则,对吧?
不要忘记服务器排序规则,它在服务器和客户端之间的连接握手期间设置(或使用默认值)。
【参考方案1】:
MySQL 的字符集和排序规则可以解释为自上而下的优先项列表。最高优先级最低,最低优先级最高。
优先顺序,最高为最低优先:
服务器排序规则 特定于连接的排序规则 数据库排序规则 表格排序规则 列排序规则 查询排序规则(使用CAST
或CONVERT
)
服务器排序规则由服务器设置,该设置可以在my.cnf
内部设置,也可以在从源代码构建服务器时设置。默认情况下,这通常是 latin1
或 utf8
,具体取决于您的平台。
特定于连接的排序规则由客户端使用SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';
之类的查询设置。大多数客户端不设置特定于连接的排序规则,因此服务器将使用自己的默认值,如上所述。
数据库排序规则是在数据库创建期间设置的,或者稍后通过手动更新来设置。如果您不指定,它将使用下一个更高级别的排序规则,它可以是特定于连接的排序规则,也可以是服务器排序规则。
表排序规则与数据库排序规则相同,但如果留空,它将使用数据库作为其默认值,然后是特定于连接,最后是服务器的排序规则。
column collation 使用表的 collation 作为其默认值,如果没有设置 collation,它会沿着链查找要使用的 collation,如果所有的 collation 都停止在服务器上其他没有设置。
查询排序规则在查询中使用CAST
或CONVERT
指定,否则将使用链中的下一个可用排序规则。除非您使用函数,否则无法设置它。
另请参阅手册页Character Set Support。
【讨论】:
【参考方案2】:简而言之。当您设置服务器排序规则时。转为 UTF-8。创建的所有未定义排序规则的数据库都将从服务器继承它。
column iherits from table
table inherits from database
database inherits from server
但是,您可以在其中一个点覆盖默认服务器。那么一切都会继承自它。
【讨论】:
您的回答也很好,谢谢,但我标记了另一个,因为它提供了我认为有用的更多信息。谢谢! 如果我更改表的排序规则,它会更新所有列排序规则(如果未指定)吗? 不。继承仅在创建时应用。如果您修改表,那么新列将获得新的排序规则,但旧列将保持原样。以上是关于数据库、表、列排序规则的区别的主要内容,如果未能解决你的问题,请参考以下文章