【问题标题】:How to correctly handle dakuten and handakuten Japanese characters in mysql?如何正确处理mysql中的dakuten和handakuten日文字符?
【发布时间】:2016-12-12 17:59:02
【问题描述】:

免责声明:

  1. 数据库是ut8mb4_unicode_520_ci
  2. 表格字段为ut8mb4_unicode_520_ci

如何正确查询包含 dakuten 或 handakuten 日文字符的表字段? Dakuten.

目前,似乎返回了基本字符,即使在为tenten 版本运行查询时也是如此。

示例数据

给定 。 还有ID: 199, post_title: 'へ';一行

场景 1

运行:

SELECT 'へ' = 'ぺ'; 

-- Returns 0. Correct

场景 2

运行:

SELECT ID, post_title 
FROM wp_posts 
WHERE post_title = 'へ';

-- Returns row 199. Correct

场景 3

但是,由于某种原因,当我运行此查询时,它仍然返回记录 199,注意不同的标题值。

运行:

SELECT ID, post_title 
FROM wp_posts 
WHERE post_title = 'ぺ';

-- Returns row 199. Incorrect

示例图片

一张图片会更好地解释(我只是使用联合来更好地在一个屏幕截图中显示所有内容):

是否有可靠的方法来处理这些角色?所有其他日文字符似乎都可以正常工作,只是 dakuten 版本仅在查询中被视为它们的基础。

【问题讨论】:

  • 您是否使用了正确的排序规则?
  • 我现在正在阅读。似乎 utf general 区分大小写,而 utf unicode 对日文字符不区分大小写。现在运行测试以查看交换是否有效
  • 我认为某些 unicode 排序规则有些时髦:bugs.mysql.com/bug.php?id=79977
  • HEX('へぺ')E381B8 E381BA;那是你的吗?
  • 我可以确认将其从 520 交换到 utf8_general_ci 可以恢复预期的行为。但我不觉得这是一个很好的解决方案..

标签: mysql unicode utf-8 nscharacterset


【解决方案1】:

这是因为您使用的排序规则(utf8mb4_unicode_ci、utf8mb4_unicode_520_ci 和 utf8mb4_0900_ai_ci)只比较字符的基本字母。例如,'ぺ' = 'へ' + U+309A ◌゚,'へ'是'ぺ'的基础字母。因此,对于您的情况,所有 3 个字符的基本字母都是相同的,“へ”。因此,这些归类返回“1”是正确的结果。

MySQL 团队正在为 utf8mb4 字符集开发新的日语排序规则。它将这些 dakuten 字符与基本字符区分开来。它很快就会到来。

【讨论】:

  • 感谢@Xing Zhang。有这方面的文件吗?还是参考资料?
  • 谢谢。我假设“即将推出”是指 8.0.x 而不是 5.7.xx?
  • @Chris。请参阅link 中的 A.11.13 部分。它解释了这些排序规则如何比较日文字符 KA 和 GA。我想这和你的问题一样。
  • @RickJames。我想它是 8.0.1+。
  • @XingZhang A.11.13 正是答案。我不知道mysql中的termprimary weight。所以看起来我有两个选择 - 恢复为 _bin 或 _general(非 UCA)或以十六进制包装查询 - 例如:SELECT HEX('へ') = HEX('ぺ') COLLATE utf8mb4_unicode_520_ci;
【解决方案2】:
SELECT 'へ' = 'ぺ' COLLATE utf8mb4_unicode_ci; --> 0  (ditto for general_ci)
SELECT 'へ' = 'ぺ' COLLATE utf8mb4_unicode_520_ci; --> 1

后者是一个较新的 Unicode 标准,因此理论上更正确。

但你到底在做什么?可能将一列与另一列进行比较?他们都是utf8mb4_unicode_520_ci吗? (数据库和连接无关紧要。)

或者= 的一侧是一列,另一侧是文字?

连接时是否建立排序规则?

附录

在 8.0.0 版本中,所有这些都给出1

utf8mb4_unicode_ci  -- a change from 0 in 5.6.12, but 1 in 5.7.15?
utf8mb4_unicode_520_ci
utf8mb4_0900_ai_ci

【讨论】:

  • 我在更新日志中没有看到关于这个问题的任何内容。如果您想要更多满意,请转到bugs.mysql.com
  • 是的,我看到所有 3 个都返回 1。感谢您花时间回答。要回答您的一些问题 - 上下文是 WHERE 子句,针对字符串文字的列。是的,我在连接时设置排序规则。就“更满意”而言 - 你的意思是这个问题真的不适合 SO 吗?应该移到 bugs.mysql.com 吗?换句话说,您是否倾向于这是一个错误(除非它真的是一个错误,否则我总是不愿在错误跟踪器上产生噪音)。再次感谢
  • 第二次澄清:我在mysql上v.5.7.16
  • 如果 MySQL 正确地遵循 Unicode 规范(我无法验证),那么这个 bug 可能是针对 Unicode(我没有研究过)而不是 MySQL。
猜你喜欢
  • 2010-12-16
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2016-10-31
  • 1970-01-01
  • 2010-09-17
  • 2016-04-24
相关资源
最近更新 更多