首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有“SORT_LOCALE_STRING”的排序函数返回不正确的结果

带有“SORT_LOCALE_STRING”的排序函数返回不正确的结果
EN

Stack Overflow用户
提问于 2017-07-31 15:33:35
回答 1查看 373关注 0票数 1

我有一些MySQL记录,类型是VARCHAR,排序规则是

代码语言:javascript
复制
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按字母顺序对它们进行排序:

代码语言:javascript
复制
$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)时的结果:

代码语言:javascript
复制
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‘的顺序不正确,结果应该如下:

代码语言:javascript
复制
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)。最后,我得到了预期的结果。

我认为这里的不同之处是:

代码语言:javascript
复制
string 'Tiếng Hàn Quốc'(length=22)
string 'Tiếng Hàn Quốc'(length=19)

问题是:这里问题的根源是什么?如何在MySQL或MySql代码中解决这个问题,在不查找和替换MySQL中的所有不正确值的情况下获得预期的结果?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-13 17:56:09

简短的回答:你需要这个校对:utf8mb4_vietnamese_ci

长答案:字符串有不同的UTF-8十六进制表示:

代码语言:javascript
复制
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

然而,有一个潜在的问题:

代码语言:javascript
复制
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)是相等的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45419951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档