私は本当に理解できない奇妙な照合問題に直面しています。私は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/
これまではすべてが矛盾しているようです。
次の結果retrunSELECT 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で結果を並べ替えるには、将来実行するすべてのクエリで定義せずにします。それは可能ですか?