2
SELECT c.ci_num, 
      CASE 
           WHEN c.ci_homonym=1 
           THEN concat(ci_name,', ',name_fr) 
           ELSE ci_name 
      END as ci_name 
FROM city as c join fr_department as fr on c.ci_sr=fr.code  
WHERE ci_name LIKE 'bé%'  
LIMIT 5

city_nameとcity_numを選択していますが、特殊文字(bé)文字列がある場合はクエリを実行しませんが、phpmyadminに対してこのクエリを実行すると、このクエリは結果を表示します。mysql_query($ query1)で実行しないのはなぜですか?そしてこれを実行する方法、ありがとう。

4

2 に答える 2

3

この文字はどのようにéエンコードされていますか?(例: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シーケンスを形成した場合、サーバーはシーケンスを想定とは異なるものとして解釈するため、完全に間違った処理を実行します。

于 2012-08-08T11:11:23.643 に答える
0

「bé」がハードコーディングされている場合は、ファイルのエンコードに関係している可能性があります。特に特殊文字の場合、データベースのファイルエンコーディングは常にPHPスクリプトと同じである必要があります。

于 2012-08-08T11:11:46.930 に答える