2017-07-31 11 views
0


とソート機能私はVARCHARタイプにいくつかのMySQLのレコードを持って、照合はutf8mb4_unicode_ciですオーダー:そのようなvar_dump($languages)を呼び出すPHPのSORT_LOCALE_STRING "リターン誤った結果

$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); 

結果:

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ハンコック'の順と間違って何か、結果はそうのようにする必要があります:

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ハンコック'他の1(もとを存在していました'TiếngHànQuốc')をMySQLに直接入力します(HeidiSQLを使用)。最後に、私は期待される結果を得た。

私は、ここでは異なる事を考える:

string 'Tiếng Hàn Quốc'(length=22) 
string 'Tiếng Hàn Quốc'(length=19) 

質問は次のとおりです。 問題の根はここで何ですか? MySqlまたはPHPコードでこの問題を解決して、MySQLの不正確な値を見つけて置き換えずに期待した結果を得るにはどうすればよいですか?

ありがとうございます。

+0

ord()関数シンボルで問題の文字列をシンボルで解析し、通常の文字列と比較することをお勧めします。コードが一致しない場合は、それを右の記号に置き換えてください。 –

+0

この矛盾は、通常、例: 'à'は、単一のUnicode文字であるか、アクセント付きの結合文字であるかにかかわらず、視覚的に同一です。 'TiếngViệtNam 'が最後になるという事実は、その問題がその場合に異なる文字としてカウントされることを示すかもしれない。 – apokryfos

+0

@A.Mikhailovあなたの提案に感謝しますが、その方法は難しいと思います。いくつかのサンプルコードでより具体的になりますか? –

答えて

0

短い回答:この照合が必要です:utf8mb4_vietnamese_ci

長い答え:、しかし、潜在的な問題がある

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 

は、Eを経由してレンダリングされる文字列が異なるUTF-8進表現を持ちます単一のutf8文字(hex C3AA)とacute-nは、utf8文字のペア(非スペーシングアクセントと文字n)によってレンダリングされます。

最初の文字列では、鋭いアクセントはeの一部です。私はutf8でベトナムのエンコーディングについて何も知らないが、急性が実際に文字nにあるべきならば、これは「間違っている」と思う。

しかし、いずれの場合も、これら2つの文字列は、照合順序utf8mb4_vietnamese_ci(またはutf8_vietnamese_ci)と同等です。