如何正确处理 mysql 中的日文 dakuten 和 handakuten 字符?

How to correctly handle dakuten and handakuten Japanese characters in mysql?

免责声明:

  1. 数据库是 ut8mb4_unicode_520_ci
  2. Table 字段是 ut8mb4_unicode_520_ci

如何正确查询包含日语日语字符的 table 字段? Dakuten.

目前,似乎返回了基本字符,即使查询是 运行 的 tenten 版本。

示例数据

鉴于 。 还有一行 ID: 199, post_title: 'へ';

场景一

运行:

SELECT 'へ' = 'ぺ'; 

-- Returns 0. Correct

场景二

运行:

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

-- Returns row 199. Correct

场景三

但是,由于某些原因,当我 运行 这个查询时,它仍然 returns 记录 199,注意不同的标题值。

运行:

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

-- Returns row 199. Incorrect

示例图片

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

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

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

这是因为您使用的排序规则(utf8mb4_unicode_ci、utf8mb4_unicode_520_ci 和 utf8mb4_0900_ai_ci)仅比较字符的基本字母。比如'ぺ'='へ'+U+309A◌゚,'へ'是'ぺ'的基字母。所以对于你的情况,所有 3 个字符的基本字母都是相同的,'へ'。因此,这些排序规则 return '1'.

的结果是正确的

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