我有一些MySQL记录,类型是VARCHAR,排序规则是
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 Qú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)然后,将'Tiếng Hàn Quốc'替换为另一个( 'Tiếng Hàn Quốc'),直接键入MySQL (使用HeidiSQL)。最后,我得到了预期的结果。
我认为这里的不同之处是:
string 'Tiếng Hàn Quốc'(length=22)
string 'Tiếng Hàn Quốc'(length=19)问题是:这里问题的根源是什么?如何在MySQL或MySql代码中解决这个问题,在不查找和替换MySQL中的所有不正确值的情况下获得预期的结果?
谢谢。
发布于 2017-08-13 17:56:09
简短的回答:你需要这个校对:utf8mb4_vietnamese_ci。
长答案:字符串有不同的UTF-8十六进制表示:
Tiếng Hàn Quốc (length=20) 54 69 C3AA CC81 6E 67 48 61 CC80 6E 51 75 C3B4 CC81 63
Tiếng Hàn Quốc (length=17) 54 69 E1BABF 6E 67 48 C3A0 6E 51 75 E1BB91 63然而,有一个潜在的问题:
C3AA 234=x00EA [ê] L LATIN SMALL LETTER E WITH CIRCUMFLEX
CC81 769=x0301 [́] NSM COMBINING ACUTE ACCENT
6E 110=x006E [n] L LATIN SMALL LETTER N
E1BABF 7871=x1EBF [ế] L LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
6E 110=x006E [n] L LATIN SMALL LETTER N在第一个字符串中,pair通过单个utf8字符(十六进制C3AA)呈现,而acute则通过一对utf8字符呈现--非间距重音和字母n。
在第一个字符串中,尖锐的重音是字母e的一部分。我对utf8中的越南语编码一无所知,但这听起来是“错误的”,如果急性应该真的出现在字母n上。
但是,无论如何,这两个字符串与排序规则utf8mb4_vietnamese_ci (或utf8_vietnamese_ci)是相等的。
https://stackoverflow.com/questions/45419951
复制相似问题