sql >> データベース >  >> RDS >> Mysql

セット名とmysqli_set_charset— mysqli_escape_stringに影響を与える以外に、それらは同一ですか?

    SET NAMESの呼び出し 接続でset_charsetを呼び出すのと同じです 、どちらのget_charsetも呼び出さない場合 また、mysql_real_escape_string (および友達)。

    set_charsetを呼び出すとき 、PHPは2つのことを行います。まず、SET NAMESを呼び出します 接続に。次に、設定した文字セットを記憶しています。その状態情報は、後でget_charsetでのみ使用されます およびmysql_real_escape_string (そして友達)機能。したがって、これらの関数を使用しない場合は、2つの同等の機能を検討することができます。

    ソースを見てみましょう:

    1. ユーザーランド関数mysql_set_charset およびmysqli_set_charset 電話...
    2. エンジン関数mysql_set_character_set 電話...
    3. エンジンマクロmysqlnd_set_character_set 、これは次のように定義されます:

      #define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))

      に展開します...

    4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) に含まれるもの 次のコード(説明のために番号が付けられています。これらは実際のソース行番号ではありません):
     1   if (PASS == conn->m->local_tx_start(conn, this_func)) {
     2      char * query;
     3      size_t query_len = mnd_sprintf(&query, 0, "SET NAMES %s", csname);
     4 
     5      if (FAIL == (ret = conn->m->query(conn, query, query_len))) {
     6          php_error_docref(NULL, E_WARNING, "Error executing query");
     7      } else if (conn->error_info->error_no) {
     8          ret = FAIL;
     9      } else {
    10           conn->charset = charset;
    11      }
    12      mnd_sprintf_free(query);
    13 
    14      conn->m->local_tx_end(conn, this_func, ret);
    15   }
    

    ご覧のとおり、PHPはSET NAMESを呼び出します 接続自体(3行目)。 PHPは、設定されたばかりの文字セットも追跡します(10行目)。コメントでは、conn->charsetで何が起こるかについてさらに説明しています。 、ただし、最終的にはget_charsetにのみ存在することになります。 およびmysql_real_escape_string (そして友達)

    したがって、この状態を気にせず、どちらもget_charsetを使用しないことに同意する場合 また、mysql_real_escape_string 、次にSET NAMESを呼び出すことができます 接続自体に悪影響はありません。

    余談ですが、私はこれを行ったことがありませんが、-DPHP_DEBUG=1を使用してPHPをコンパイルしているようです。 さまざまなDBGによる実質的なデバッグが可能になります マクロ。これは、コードがこのブロックをどのように通過しているかを確認するのに役立つ場合があります。



    1. MAXおよびGROUPBYを使用して対応するすべてのフィールドを選択する

    2. OracleSQLでデュアルから10,000の一意のIDのリストを選択する方法

    3. 大きなテーブルでのSQLServerクエリのパフォーマンスを向上させる

    4. innodb_lock_wait_timeoutタイムアウトを増やす