什么 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】:collation 是您最不用担心的,您需要考虑的是列/表/数据库的字符集。排序规则(管理数据如何比较和排序的规则)只是其必然结果。
MySQL 支持多种 Unicode 字符集,utf8
和 utf8mb4
是最有趣的。 utf8
支持 BMP 中的 Unicode 字符,即所有 Unicode 的子集。 utf8mb4
,自 MySQL 5.5.3 起可用,支持所有的 Unicode。
与任何 Unicode 编码一起使用的排序规则很可能是xxx_general_ci
或xxx_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 字符?的主要内容,如果未能解决你的问题,请参考以下文章