6

PHP5.3.3とMySQL5.1.61を使用しています。問題の列はUTF-8エンコーディングを使用しており、PHPファイルはBOMなしでUTF-8でエンコードされています。

WindowsのSQLyogで²文字を使用してMySQLiクエリを実行すると、クエリが正しく実行され、正しい検索結果が表示されます。

PHPでこれとまったく同じクエリを実行すると、実行されますが、0affected_rowsが表示されます。

これが私が試したことです:

  • =の代わりに両方のLIKEを使用する
  • PHPファイルのエンコーディングをANSI、BOMなしのUTF-8、およびUTF-8に変更する
  • クエリを実行する前に「SETNAMESutf-8」および「latin1」を実行する
  • ヘッダー('Content-Type:text / html; charset = UTF-8');を実行しました。PHPで
  • MySQLi::real_escape_stringを使用したエスケープ
  • filter_var($ String、FILTER_SANITIZE_STRING)を実行する
  • MySQListmtバインドを試しました

正しく動作させる唯一の方法は、²を%に交換し、PHPで=をLIKEに変更した場合です。

²を使用しているときにPHPで正しくクエリを取得するにはどうすればよいですか?

4

1 に答える 1

4

次のことを確認することで、クエリを機能させることができるはずです。

UTF-8用のPHPの準備

最初に、これらのクエリを発行するPHPページがUTF-8でエンコードされたページとして提供されていることを確認する必要があります。これにより、データベースからのUTF-8出力が正しく表示されます。Firefoxでは、関心のあるページにアクセスして[ページ情報の表示]メニュー項目を使用することで、これが当てはまるかどうかを確認できます。これを行うと、ページのエンコーディングの値としてUTF-8が表示されます。ページがUTF-8として提供されていない場合は、2つの方法のいずれかで提供できます。次のように、の呼び出しでエンコーディングを設定できます。header()

header('Content-Type: text/html; charset=UTF-8');

または、ページのブロックmetaでタグを使用できます。head

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

MySQLforUTF-8の準備

次に、データベースがUTF-8エンコーディングを使用するように設定されていることを確認する必要があります。これは、サーバー、データベース、テーブル、または列のレベルで設定できます。共有ホストを使用している場合は、階層のテーブルレベルと列レベルしか制御できない可能性があります。サーバーまたはデータベースを制御している場合は、次の2つのコマンドを発行して、それらが使用している文字エンコードを確認できます。

SHOW VARIABLES LIKE 'character_set_system';
SHOW VARIABLES LIKE 'character_set_database';

データベースレベルのエンコーディングの変更は、次のようなコマンドを使用して実行できます。

(CREATE | ALTER) DATABASE ... DEFAULT CHARACTER SET utf8;

テーブルで使用されている文字エンコードを確認するには、次の手順を実行します。

SHOW CREATE TABLE myTable;

同様に、テーブルレベルのエンコーディングを変更する方法は次のとおりです。

(CREATE | ALTER) TABLE ... DEFAULT CHARACTER SET utf8;

階層内で可能な限り高いエンコーディングを設定することをお勧めします。このように、新しいテーブル用に手動で設定することを覚えておく必要はありません。これで、テーブルの文字エンコードがまだUTF-8に設定されていない場合は、次のalterようなステートメントを使用して変換を試みることができます。

ALTER TABLE ... CONVERT TO CHARACTER SET utf8;

このステートメントの使用には十分注意してください。テーブルにすでにUTF-8値がある場合、変換しようとすると破損する可能性があります。ただし、これを回避する方法はいくつかあります。

MySQLiにUTF-8の使用を強制する

最後に、データベースに接続する前に、適切な呼び出しを発行して、UTF-8エンコーディングを使用していることを確認してください。方法は次のとおりです。

$db = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

// Change the character set to UTF-8 (have to do it early)
if(! $db->set_charset("utf8"))
{
    printf("Error loading character set utf8: %sn", $db->error);
}

これを行うと、すべてが期待どおりに機能するはずです。エンコーディングについて心配する必要がある唯一の文字は、HTMLのビッグ5です<, >, ', ", and &これは、 htmlspecialchars()関数を使用して処理できます。

詳細を読みたい(そして追加のリソースへのリンクを取得したい)場合は、このプロセスについて書いた記事を自由にチェックしてください。UnicodeとWeb:パート1、およびUnicodeとWeb:パート2の2つの部分があります。幸運を!

于 2012-09-05T14:11:01.537 に答える