查看“MySQL 字符集:排序规则问题”的源代码
←
MySQL 字符集:排序规则问题
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:MySQL]] == 在 SQL 语句中使用“COLLATE” == 使用“COLLATE”子句,您可以覆盖默认的默认排序规则以进行比较。'''“COLLATE”可用于 SQL 语句的各个部分。'''这里有些例子: # 使用“ORDER BY”:【对中文排序呢???拼音升降序使用什么排序规则???】 #: '''<syntaxhighlight lang="xml"> SELECT k FROM t1 ORDER BY k COLLATE latin1_german2_ci;''' </syntaxhighlight> # 使用“AS”: #: '''<syntaxhighlight lang="xml"> SELECT k COLLATE latin1_german2_ci AS k1 FROM t1 ORDER BY k1; </syntaxhighlight>''' # 使用“GROUP BY”: #: '''<syntaxhighlight lang="xml"> SELECT k FROM t1 GROUP BY k COLLATE latin1_german2_ci; </syntaxhighlight>''' # 具有聚合功能: #: <syntaxhighlight lang="xml"> SELECT MAX(k COLLATE latin1_german2_ci) FROM t1; </syntaxhighlight> # 使用“DISTINCT”: #: <syntaxhighlight lang="xml"> SELECT DISTINCT k COLLATE latin1_german2_ci FROM t1; </syntaxhighlight> # 使用“WHERE”: #: <syntaxhighlight lang="xml"> SELECT * FROM t1 WHERE _latin1 'Müller' COLLATE latin1_german2_ci = k; </syntaxhighlight> #: <syntaxhighlight lang="xml"> SELECT * FROM t1 WHERE k LIKE _latin1 'Müller' COLLATE latin1_german2_ci; </syntaxhighlight> # 使用“HAVING”: #: <syntaxhighlight lang="xml"> SELECT k FROM t1 GROUP BY k HAVING k = _latin1 'Müller' COLLATE latin1_german2_ci; </syntaxhighlight> == “COLLATE”子句优先级 == COLLATE子句具有较高的优先级('''高于“||”'''),因此以下两个表达式是等效的: <syntaxhighlight lang="xml"> x || y COLLATE z x || (y COLLATE z) </syntaxhighlight> 【???有啥用】 == 字符集和排序规则兼容性 == 每个字符集都有一个或多个排序规则,但是每个排序规则都与一个且只有一个字符集相关联。因此,以下语句会导致错误消息,因为 latin2_bin 排序规则与 latin1 字符集不合法: <syntaxhighlight lang="xml"> mysql> SELECT _latin1 'x' COLLATE latin2_bin; ERROR 1253 (42000): COLLATION 'latin2_bin' is not valid for CHARACTER SET 'latin1' </syntaxhighlight> 【废话……】 == 表达式中的排序规则强制性 == 在绝大多数语句中,MySQL 使用什么排序规则是很明显的。例如,在以下情况下,应该清楚排序规则是 x 列的排序规则: <syntaxhighlight lang="xml"> SELECT x FROM T ORDER BY x; SELECT x FROM T WHERE x = x; SELECT DISTINCT x FROM T; </syntaxhighlight> 但是,对于多个操作数,可能会有歧义。例如,此语句在列 x 和字符串常量 'Y' 之间进行比较: <syntaxhighlight lang="xml"> SELECT x FROM T WHERE x = 'Y'; </syntaxhighlight> 如果x和'Y'具有相同的排序规则,则对于用于比较的排序规则没有歧义。但是,如果它们具有不同的排序规则,则比较应使用 x 还是 'Y' 的排序规则? x 和 'Y' 都有排序规则,那么哪个排序规则优先? 为了解决这些问题,MySQL 检查是否可以将一项的排序规则强制为另一项的排序规则。 MySQL 分配强制性值如下: # 显式的“COLLATE”子句的强制性为 0(根本不可强制)。 # 具有不同排序规则的两个字符串的串联的强制性为 1. # 列或存储的例程参数或局部变量的排序规则的强制性为 2. # “系统常数”(由“USER()”或“VERSION()”之类的函数返回的字符串)的强制性为 3. # 常量的排序规则的强制性为 4. # 数字或时间值的排序规则的强制性为 5. # NULL 或 从NULL派生的表达式的强制性为 6. MySQL 使用强制性值和以下规则来解决歧义: # '''使用具有最低强制性的排序规则。''' # 如果双方具有相同的强制性,则: ## 如果双方都是 Unicode,或者双方都不是 Unicode,则错误。 ## 如果其中一方具有 Unicode 字符集,而另一方具有非 Unicode 字符集,'''则具有 Unicode 字符集的一方获胜''',并且自动字符集转换将应用于非 Unicode 一方。例如,以下语句不返回错误: ##: <syntaxhighlight lang="xml"> SELECT CONCAT(utf8_column, latin1_column) FROM t1; </syntaxhighlight> ##: 它返回一个字符集为 utf8 且排序规则与 utf8_column 相同的结果。串联之前,latin1_column 的值会自动转换为utf8。 # 对于具有相同字符集但混合了“_bin”排序规则和“_ci”或“_cs”排序规则的操作数的操作,将'''使用“_bin”排序规则'''。这类似于将非二进制和二进制字符串混合在一起的操作如何将操作数评估为二进制字符串(应用于排序规则而不是数据类型)。 示例: {| class="wikitable" ! Comparison !! Collation Used |- | column1 = 'A' || 使用排序规则 column1 |- | column1 = 'A' COLLATE x || 使用排序规则 'A' COLLATE x |- | column1 COLLATE x = 'A' COLLATE y || Error |} 要确定字符串表达式的可强制性,请使用“'''COERCIBILITY()'''”函数: <syntaxhighlight lang="xml"> mysql> SELECT COERCIBILITY(_utf8'A' COLLATE utf8_bin); -> 0 mysql> SELECT COERCIBILITY(VERSION()); -> 3 mysql> SELECT COERCIBILITY('A'); -> 4 mysql> SELECT COERCIBILITY(1000); -> 5 mysql> SELECT COERCIBILITY(NULL); -> 6 </syntaxhighlight> * 对于将数值或时间值隐式转换为字符串(例如在表达式“CONCAT(1, 'abc')”中的自变量1发生的情况),结果是一个字符(非二进制)字符串,该字符串具有由“character_set_connection”和“collation_connection”系统变量确定的字符集和排序规则。 == 与_bin 排序规则相比的二进制排序规则 == == 排序规则效果的示例 == == 在“INFORMATION_SCHEMA”搜索中使用排序规则 ==
返回至“
MySQL 字符集:排序规则问题
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息