什么 MySQL 排序规则最适合接受所有 unicode 字符?

Posted

技术标签:

【中文标题】什么 MySQL 排序规则最适合接受所有 unicode 字符?【英文标题】:What MySQL collation is best for accepting all unicode characters? 【发布时间】:2012-12-29 01:18:29 【问题描述】:

我们的专栏目前被整理到latin1_swedish_ci 并且特殊的 unicode 字符显然被删除了。我们希望能够接受U+272A ✪U+2764 ❤、(参见this wikipedia article)等字符。我倾向于utf8_unicode_ci,这个排序规则会处理这些字符和其他字符吗?我不在乎速度,因为此列不是索引。

mysql 版本:5.5.28-1

【问题讨论】:

Mathias 在这里发帖,但我恰好在这里,并把它加入书签:mathiasbynens.be/notes/mysql-utf8mb4 【参考方案1】:

collat​​ion 是您最不用担心的,您需要考虑的是列/表/数据库的字符集。排序规则(管理数据如何比较排序的规则)只是其必然结果。

MySQL 支持多种 Unicode 字符集,utf8utf8mb4 是最有趣的。 utf8 支持 BMP 中的 Unicode 字符,即所有 Unicode 的子集。 utf8mb4,自 MySQL 5.5.3 起可用,支持所有的 Unicode。

与任何 Unicode 编码一起使用的排序规则很可能是xxx_general_cixxx_unicode_ci。前者是一种独立于语言的通用排序和比较算法,后者是一种更完整语言独立的算法,支持更多的 Unicode 特性(例如将“ß”和“ss”视为等价),但因此也比较慢。

见https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-sets.html

【讨论】:

我运行了这个查询:ALTER TABLE mydb.mytable CHANGE mycolumn mycolumn VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;,但我仍然没有得到正确的值,我是否还必须设置表和数据库字符集? 不,只有列有字符集,如果没有为每列指定,表和数据库字符集只是默认设置。那是什么意思,“你没有得到正确的值”?您如何尝试获得正确的值?您需要从前到后设置正确的连接字符集,包括客户端连接也需要设置为utf8mb4。有关详细说明,请参阅 this article。 一个 Java 应用程序正在更新数据库,而不是特殊的 unicode 字符,我只是在它们的位置看到了 ?。我不开发Java应用程序,我猜它一定是在转义字符本身。 这非常模糊。 :) 正如前面链接的文章中所述,编码必须从前到后正确处理以正确保留字符。问题可能出在链 (web?) Java DB 驱动程序 DB 中的任何地方。如果您不负责 Java 应用程序,只需确保数据库以正确的编码保存和返回数据。 我会将此转发给 Java 开发人员,看看是否能解决问题。不过我会给你赏金(在 4 小时内,我可以奖励它),谢谢你的帮助!

以上是关于什么 MySQL 排序规则最适合接受所有 unicode 字符?的主要内容,如果未能解决你的问题,请参考以下文章

排序规则对mysql有用[重复]

MySQL - 最佳排序规则?

什么样的女人最容易接受潜规则?

MySQL数据类型

MySQL 的 INSTR 和排序规则

Mysql中的UTF-8字符集与字符集排序规则的选择