とソート機能私は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の不正確な値を見つけて置き換えずに期待した結果を得るにはどうすればよいですか?
ありがとうございます。
ord()関数シンボルで問題の文字列をシンボルで解析し、通常の文字列と比較することをお勧めします。コードが一致しない場合は、それを右の記号に置き換えてください。 –
この矛盾は、通常、例: 'à'は、単一のUnicode文字であるか、アクセント付きの結合文字であるかにかかわらず、視覚的に同一です。 'TiếngViệtNam 'が最後になるという事実は、その問題がその場合に異なる文字としてカウントされることを示すかもしれない。 – apokryfos
@A.Mikhailovあなたの提案に感謝しますが、その方法は難しいと思います。いくつかのサンプルコードでより具体的になりますか? –