如何正确处理 mysql 中的日文 dakuten 和 handakuten 字符?
How to correctly handle dakuten and handakuten Japanese characters in mysql?
免责声明:
- 数据库是
ut8mb4_unicode_520_ci
- 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 字符与基本字符区分开来。很快就到了。
免责声明:
- 数据库是
ut8mb4_unicode_520_ci
- 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 字符与基本字符区分开来。很快就到了。