【发布时间】:2018-01-07 06:22:38
【问题描述】:
我有一些 VARCHAR 类型的 MySQL 记录,排序规则是 utf8mb4_unicode_ci:
Tiếng Việt Nam
Tiếng Hoa Kỳ
Tiếng Anh
Tiếng Nhật
Tiếng Hàn Quốc
Tiếng Thái Lan
然后,我使用 PHP 按字母顺序对它们进行排序:
$languages = [
'Tiếng Việt Nam',
'Tiếng Hoa Kỳ',
'Tiếng Anh',
'Tiếng Nhật',
'Tiếng Hàn Quốc',
'Tiếng Thái Lan',
];
setlocale(LC_COLLATE, 'vi');
sort($languages, SORT_LOCALE_STRING);
这样调用var_dump($languages)时的结果:
array (size=6)
0 => string 'Tiếng Anh' (length=11)
1 => string 'Tiếng Hoa Kỳ' (length=16)
2 => string 'Tiếng Nhật' (length=14)
3 => string 'Tiếng Thái Lan' (length=17)
4 => string 'Tiếng Việt Nam' (length=18)
5 => string 'Tiếng Hàn Quốc' (length=22)
'Tiếng Hàn Quốc'的顺序有问题,结果应该是这样的:
array (size=6)
0 => string 'Tiếng Anh' (length=11)
1 => string 'Tiếng Hàn Quốc' (length=19)
2 => string 'Tiếng Hoa Kỳ' (length=16)
3 => string 'Tiếng Nhật' (length=14)
4 => string 'Tiếng Thái Lan' (length=17)
5 => string 'Tiếng Việt Nam' (length=18)
然后,我通过直接输入 MySQL(使用 HeidiSQL)将现有的 'Tiếng Hàn Quốc' 替换为另一个(也是 'Tiếng Hàn Quốc')。最后,我得到了预期的结果。
我觉得这里不一样:
string 'Tiếng Hàn Quốc'(length=22)
string 'Tiếng Hàn Quốc'(length=19)
问题是: 这里的问题根源是什么? 如何在 MySql 或 PHP 代码中解决此问题以获得预期结果,而无需查找和替换 MySQL 中所有不正确的值?
谢谢。
【问题讨论】:
-
我建议通过 ord() 函数逐个符号解析问题字符串,并与普通字符串进行比较。如果代码不匹配,请将其替换为正确的符号
-
差异通常是由于某些字符,例如
à无论是单个 unicode 字符还是带有重音符号的组合字符,在视觉上都是相同的。Tiếng Việt Nam降到最后的事实可能表明问题在于ế在这种情况下被视为不同的字符。 -
@A.Mikhailov 感谢您的建议,但我认为这种方式很难做到,或者我不理解您的想法。你能用一些示例代码更具体一些吗?
-
@apokryfos:谢谢。我明白你所说的。有没有办法将字符从一种类型解析为另一种类型? 单个 unicode 字符到带重音的组合字符,反之亦然。