19

MySQLi を使用して MySQL テーブルからアラビア語でデータを取得しています。したがって、私は通常、これを手続き型スタイルで使用します。

mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 

今、私はOOPスタイルを使用しているので、上記以外に設定できるものがあるかどうかを確認しようとしていますか?

これは PHP のマニュアルでしか見つけられなかったので実行したのですが、名前を UTF8 に設定するのはどうでしょうか。

$mysqli->set_charset("utf8");
4

5 に答える 5

26

それは同じだ:

$ mysqli-> query( "SET NAMES'utf8'");

マニュアルから:

これは、文字セットを変更するための推奨される方法です。mysqli :: query()を使用してSETNAMES..を実行することはお勧めしません。

$mysqli->set_charset("utf8");十分です。mysqlidbドライバーに任せてください。

于 2012-05-31T08:24:12.783 に答える
14

使用する必要があります

$mysqli->set_charset("utf8");

MySQLi を使用する場合はSET NAMESorを明示的に使用しないでください。また、ここでの質問者が元々そうであったように、両方を使用しないでください。SET CHARACTER SETこれが悪い考えである理由:

  • 実際にSET CHARACTER SET utf8 afterを呼び出すと、実行た作業の一部が取り消されます。SET NAMES utf8SET NAMES
  • PHP マニュアルでは、 ではなくを使用するよう明示的に警告しています。mysqli_set_charsetSET NAMES

    これは、文字セットを変更するための推奨される方法です。mysqli_query() を使用して設定する (SET NAMES utf8 など) ことはお勧めしません。詳細については、MySQL 文字セットの概念のセクションを参照してください。

  • 内部的には、MySQL C API (またはそれに相当する mysqlnd) の単なるmysqli_set_charsetラッパーです。mysql_set_character_setその関数のドキュメントを見ると、それとの違いがわかりますSET NAMES

    この関数はSET NAMESステートメントのように機能しますが、 の値も設定するため、mysql->charsetで使用される文字セットに影響します。mysql_real_escape_string()

    つまり、$mysqli->set_charset('foo')すべての機能を実行しSET NAMES foo、新しいエンコーディングを確実に尊重しますmysqli_real_escape_string確かに、厳密に ASCII を拡張する Latin 1 や UTF 8 などのエンコーディングのみを使用している場合 (つまり、ASCII でエンコードされるのとまったく同じようにすべての ASCII 文字列をエンコードする場合)、SET NAMES代わりに使用してset_charsetも何も壊れません。ただし、GBK などのより珍しいエンコーディングを使用している場合は、文字列が文字化けしたり、.xmlをバイパスする SQL インジェクションの脆弱性がmysqli_real_escape_string導入されたりする可能性があります。

set_charsetしたがって、 ではなくのみを使用することをお勧めしSET NAMESます。できないSET NAMESことset_charsetはなく、正しく動作しない (または安全でない) 動作set_charsetのリスクを回避します。mysqli_real_escape_string

于 2016-05-02T13:12:07.503 に答える