2017-06-06 11 views
0

私は本当に理解できない奇妙な照合問題に直面しています。私は2つまたは3つの列に "£"のようなアクセント付きの文字を含むテーブルを持っています。この文字の出現により、utf8_unicode_520_ciが私の目的に最も適しています。私はPHPページでこの問題に直面しています。 WebserverはApache 2.4、PHP 7.1.0、MySQL 5.7を実行しています。MYSQL:クエリで不正な照合が選択されました

データベースに接続した後、私はこの方法文字セットと照合を設定しています:

$connection->set_charset("utf8"); 
$connection->query("SET NAMES utf8 COLLATE utf8_unicode_520_ci;"); 

その後私は、フォーマット形式リターンで情報を以下SHOW VARIABLES LIKE '%collat%';SHOW VARIABLES LIKE '%char%';を使用してダブルチェックし、実際の文字セットと照合しています:

collation_connection->utf8_unicode_520_ci 
collation_database->utf8_unicode_520_ci 
collation_server->binary 
character_set_client->utf8 
character_set_connection->utf8 
character_set_database->utf8 
character_set_filesystem->binary 
character_set_results->utf8 
character_set_server->binary 
character_set_system->utf8 
character_sets_dir->/usr/share/mysql/charsets/ 

これまではすべてが矛盾しているようです。

次の結果retrun
SELECT birthPlace FROM persons ORDER BY birthPlace DESC LIMIT 5; 

Łapsze Wyżne 
Łapsze Wyżne 
Zvolenská Slatina 
Župčany 
Župčany 

エントリ「ŁapszeWyżneは」utf8_unicode_520_ci照合あたりとして最後として記載されているべきではありませんが、私は以下のクエリを実行していたとき、私は発注問題に直面していますは、通常の "L"文字で始まるエントリとともにリストされる必要があります。ですから、それはutf8_unicode_520_ciという別の照合順序を選んでいることは明らかです。utf8_general_ci照合が使用されていると思います(結果の順序から推測する)。テーブルと列 "birthPlace"の照合はutf8_unicode_520_ciです。私は照合の優先順位がそれぞれデフォルトの列、テーブル、データベースになると期待しています。

phpMyAdminとMySQL Workbenchが期待どおりにエントリを並べ替えます。しかし、私のスクリプトは期待どおりにソートされていません。

私の質問は、クエリで明示的に設定されていない場合はどのような照合が実際に使用され、可能な場合はクエリを変更せずに解決する方法です。

EDIT:質問自体は、私がすでに知っているように適切な照合を選択することではなく、私が制御できるすべての場所で自分の目的に合った照合を定義しました。問合せは、SELECT問合せで明示的に定義されていない場合に使用されます。接続、列、表、データベース、またはサーバーの照合ですか?または、使用されている文字セットのデフォルトの照合です(私の場合、uth8のcharsetのutf8_general_ciですか?これはドキュメントからわかりません)utf8_unicode_520_ciで結果を並べ替えるには、将来実行するすべてのクエリで定義せずにします。それは可能ですか?

答えて

0

この質問は、「PHPのための最高の」約ポーランドの照合についての詳細をであるように思われるので、私はそれを再度開く。

utf8_unicode_520_ci扱いL=l=Ĺ=ĺ=Ļ=ļ=Ł=łを。事実上、他のすべてのutf8照合順序がL=l=Ĺ=ĺ=Ļ=ļ < Ł=łを扱う。具体的には、Ł事実上、Lの前で、Mの前の手紙です。

ポーランド語がデータベースの主な内容ならば、utf8_polish_ciと考えることをお勧めします。 C、N、O、S、Zの重大なアクセントは、この照合であなたが望むように扱われる(またはそうでないかもしれない)ことに注意してください。

MySQLのさまざまなutf8照合での文字の順序付けについては、を参照してください。

Łの扱いに対する「責任」は、バージョン5.20のUnicodeになります。 Unicode 9.0も同じように動作します。

"best for PHP"(または他の一般的なアプリケーション)は、からMySQL 5.7です。 MySQL 8.0では、utf8mb4_0900_ai_ciが「ベスト」と考えられています。

(注:CHARACTER SET UTF8は、ほとんどの言語には十分であるutf8mb4は絵文字で、スーパーセットであると中国の残りの部分を追加。。)

関連する問題