この文字はどのようにé
エンコードされていますか?(例:utf-8)mysql_set_charset()
を介して、mysql接続で使用される文字セットを適宜設定します。これは、文字の比較に使用される照合にも影響します。各文字セットには、デフォルトの照合、つまり文字を比較/順序付けするデフォルトの方法があります。ほとんどの文字セットでは、大文字/小文字を無視する場合など、複数の照合を使用できます。
mySQLに関連する文字セット(および照合)を把握するには、以下を読むことをお勧めします。
---編集:例---
このスクリプト(ファイル)を例にとってみましょう
<?php
$startsWith = 'bé';
$mysql = mysql_connect('localhost', 'localonly', 'localonly') or die(mysql_error());
mysql_select_db('test', $mysql) or die(mysql_error());
echo 'version: ', PHP_VERSION, "\n";
echo 'os: ', PHP_OS, "\n";
echo 'mysql_client_encoding: ', mysql_client_encoding($mysql), "\n";
for($i=0; $i<strlen($startsWith); $i++) {
printf('%02X ', ord($startsWith[$i]));
}
私のエディターは、デフォルトでエンコードされたファイルutf-8を保存しますが、私のバージョンのphpには、デフォルトの接続文字セットとしてutf-8を使用するmysqlコネクターが付属しているようです。
したがって、出力は
version: 5.4.1
os: WINNT
mysql_client_encoding: utf8
62 C3 A9
to文字béが3バイト0x620xC30xA9としてどのようにエンコードされているかがわかります。バイトの最後は、éのutf-8表現です。したがって、client-encoding = utf-8があり、入力文字列もutf-8です-> ok
さて、スクリプトファイルのエンコーディングをutf-8からiso-8859-1に変更すると、結果は次のようになります。
version: 5.4.1
os: WINNT
mysql_client_encoding: utf8
62 E9
これで、éは1バイトだけでエンコードされます。それはそのキャラクターのiso-8859-1表現です。このバイトシーケンスがmysqlサーバー(クライアントからutf-8シーケンスを取得することを期待している)に送信された場合、サーバーはそれをどう処理するかを知りません-これは無効なutf-8シーケンスであるためです。さらに悪いことに、iso-8859シーケンスが有効なutf-8シーケンスを形成した場合、サーバーはシーケンスを想定とは異なるものとして解釈するため、完全に間違った処理を実行します。