寻找完美的数据库排序方式
问题:如何找到完美的数据库排序规则(Finding the perfect database collation)?
原因:utf8_general_ci比utf8_unicode_ci快,但不够准确。utf8_unicode_ci支持映射、扩展、缩写和可忽略字符等特性,而utf8_general_ci不支持这些特性,只能进行一对一的字符比较。
解决方法:如果没有特殊原因,使用utf8_general_ci排序规则。
utf8_bin排序规则与utf8_general_ci和utf8_unicode_ci不同,它是区分大小写的,因为它比较字符的二进制值。
如果想要了解更详细的解释,可以阅读MySQL论坛上的帖子。使用show collation;
可以查看每个字符集的默认排序规则。
至于utf8_bin排序规则,它是二进制完全匹配的。
关于两种排序规则之间的速度差异,目前没有提供更详细的信息。
找到完美的数据库排序规则的原因是因为不同的排序规则会对字符进行不同的处理,导致在比较和匹配过程中出现不一致的结果。
解决方法是根据具体需求选择适合的排序规则,以下是不同排序规则的特点和推荐使用情况:
- `utf8_bin`:直接比较二进制位,不进行大小写折叠和重音符号处理。
- `utf8_general_ci`:逐个字符比较,进行大小写折叠和重音符号处理,但不进行两个字符的比较。例如,在该排序规则下,`ij`与`ij`不相等。
- `utf8_*_ci`:是一组特定语言的规则,类似于`unicode_ci`,但有一些特殊情况,如`Ç`、`Č`、`ch`、`ll`等。
- `utf8_unicode_ci`:遵循旧的Unicode标准进行比较,`ij`等于`ij`,但`ae`不等于`æ`。
- `utf8_unicode_520_ci`:遵循较新的Unicode标准,`ae`等于`æ`。
如果需要处理超出欧洲字符范围的字符,如Emoji和一些汉字,则需要切换到`utf8mb4`排序规则。
需要注意的是,以上内容同样适用于`utf8mb4`排序规则。推荐使用`utf8mb4`和`utf8mb4_unicode_520_ci`,或者在MySQL 8.0版本中使用`utf8mb4_0900_ai_ci`排序规则。
除了以上排序规则,`utf16`和`utf32`是`utf8`的变体,几乎没有使用场景。而`ucs2`则更接近于“Unicode”,而不是“utf8”,也几乎没有使用场景。
,根据具体需求选择适合的排序规则是解决问题的关键。MySQL 8.0版本的排序规则在性能上也有显著提升,因此推荐使用较新的版本。
在选择数据库排序规则时,我们需要注意一个问题:使用utf8_general_ci时,如果在varchar字段上插入两个值,比如'a'和'á',会导致重复键错误。这是因为utf8_general_ci排序规则将'a'和'á'视为相同的值。
为了避免这个问题,我们可以使用utf8_unicode_ci排序规则。这是最可靠、最安全、最全面的排序规则之一。它能够正确区分类似用户名的情况,比如如果已经存在一个用户名为"jose",我们不希望其他人能够创建一个"josé"用户。
不过,如果我们希望在索引中区分"jose"和"josé"这样的值,我们可以使用utf8_bin排序规则。比如,在记录搜索/替换操作的列中,用户可能决定搜索"josé"并将其替换为"jose"(比如在编写电子表格程序时)。
选择合适的数据库排序规则是非常重要的,它可以避免重复键错误,同时也可以确保正确区分类似的值。