PHPのMySQLI拡張機能を使用してデータベースに接続する場合、 MySQLI :: set_charsetメソッドを使用してキャラクターセットを設定する開発者が表示されることがよくあります。それでは、 MySqli :: Set_charsetによってセットされた文字セットは、データベース自体のデフォルトの文字セットと関係があるのでしょうか?それらの間に対立はありますか?この記事では、2つのプラクティスとベストプラクティスの関係について詳しく説明します。
データベースのデフォルト文字セットは、データベースサーバーまたはデータベースインスタンス(スキーマ)によって構成されたデフォルトの文字セットを指します。たとえば、MySQLデータベースを作成する場合、デフォルトの文字セットがあります。一般的な文字セットはUTF8MB4またはLATIN1です。テーブルまたはフィールドを作成するときに文字セットを指定しない場合、データベースのデフォルトの文字セットが継承されます。
SQLステートメントを介して現在のデータベースデフォルト文字を表示できます。
SHOW VARIABLES LIKE 'character_set_database';
サーバーのデフォルトの文字セットを表示することもできます。
SHOW VARIABLES LIKE 'character_set_server';
mysqli :: set_charsetは、現在接続されている文字セットを設定するために使用されるPHP mysqliクラスの方法です。この設定は、データベースサーバーに、クライアントが送信したデータを解析するために使用される文字エンコードと、クエリ結果が返されたときに使用されるエンコードを示します。
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->set_charset('utf8mb4');
上記のコードでは、 set_charset( 'utf8mb4')とは、クライアントが送信および受信したデータがutf8mb4でエンコードされていることをmysqlサーバーに伝えることを意味します。
異なるアクション範囲
データベースのデフォルトの文字セットは、データベースレベルに影響します。これは、主にデフォルトでデータを保存するエンコードを制御します。
mysqli :: set_charsetは、クライアントとデータベース間のエンコード形式の通信形式に影響します。
データ段階は異なる影響します
データベースのデフォルト文字セットは、データベース内のデータのストレージ形式を決定します。
mysqli :: set_charsetは、クライアントとサーバー間のデータ交換のエンコード形式を決定し、両当事者が一貫していることを確認します。
優先順位とマッチ
データベースに接続すると、 mysqli :: set_charsetが明示的に設定されていない場合、クライアントとサーバーの間の通信は、サーバーのデフォルト文字セット(通常は構成が変更されない限りLATIN1 )を使用します。これにより、データベースのデフォルトの文字セットがUTF8MB4であり、クライアント通信エンコードがラテン語である場合、データはデータを引き起こします。
したがって、データベーステーブルがUTF8MB4である場合でも、サーバーがSET_CHARSETを使用してサーバーに同じエンコードを使用してデータを送信するように指示しない場合、クエリ結果またはデータがエンコードエラーを引き起こす可能性があります。
クライアントとサーバーの間の一貫性のない文字セットのために文字化けしたコードを回避するために、ベストプラクティスは、データベースに接続した直後にそれを呼び出すことです。
$mysqli->set_charset('utf8mb4');
これは保証されます:
送信されたデータエンコーディングは、データベースエンコーディングと一致しています
クエリの結果は正しくエンコードされています
不一致をエンコードすることによって引き起こされる例外の文字問題を避けてください
データベースのデフォルト文字セットは、データのストレージエンコードを決定します。
mysqli :: set_charsetは、クライアントがサーバーと通信するためのエンコード形式を決定します。
2つは、データが正しく送信され、保存されるようにするために一貫している必要があります。
データベースのデフォルト文字セットがUTF8MB4である場合でも、 SET_CHARSEを使用してPHPコードで接続エンコードを明示的に設定する必要があります。
$mysqli = new mysqli('gitbox.net', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('接続に失敗しました:' . $mysqli->connect_error);
}
// クライアント接続文字をに設定します utf8mb4
$mysqli->set_charset('utf8mb4');
$sql = "SELECT * FROM users";
$result = $mysqli->query($sql);
while ($row = $result->fetch_assoc()) {
echo $row['username'] . "<br>";
}
$mysqli->close();
これにより、データベースから取得された中国語または特殊キャラクターが文字化けしないようになります。