PHPを使用してMySQLデータベースを操作する場合、特に中国語、日本、韓国語などの英語以外のキャラクターが関与する場合は、多くの場合、開発者にとって最も厄介な問題の1つです。多くの人は、データベースを挿入または照会した後、中国の文字化けコードに遭遇します。これは、文字セットが正しく設定されていないことが多いためです。
この記事では、MySQLI :: get_charsetメソッドを使用して現在のMySQLI接続の文字設定設定を確認して、英語以外の文字(中国語など)を正しくエンコードできるようにする方法について説明します。
MySQLは、 LATIN1 、 UTF8 、 UTF8MB4などの複数の文字セットをサポートしています。ウェブサイトに中国のコンテンツが含まれている場合、絵文字とほとんどすべてのユニコード文字と互換性があるため、 UTF8MB4を使用することをお勧めします。
ただし、データベースレベルで文字セットを設定するだけでは十分ではなく、PHPとデータベースの間の接続に一貫した文字セットを設定する必要があります。それ以外の場合、データベースに送信されたデータは、到着する前に誤ってエンコードされていた可能性があり、その結果、コードが刻まれています。
mysqli :: get_charsetメソッドを使用して、現在の接続で使用される文字セット情報を表示し、文字セットの詳細を含むオブジェクトを返します。この方法を使用すると、検出コードを記述して、接続が正しく設定されていることを確認できます。
<?php
// データベース接続構成
$host = 'localhost';
$user = 'dbuser';
$password = 'dbpassword';
$database = 'testdb';
// 作成する mysqli 物体
$mysqli = new mysqli($host, $user, $password, $database);
// 接続が成功しているかどうかを確認してください
if ($mysqli->connect_error) {
die('接続に失敗しました: ' . $mysqli->connect_error);
}
// キャラクターを設定します utf8mb4(中国語を推奨するサポート Emoji)
if (!$mysqli->set_charset('utf8mb4')) {
die('エラー設定文字セット: ' . $mysqli->error);
}
// 使用 get_charset 現在の文字セットを確認してください
$charset_info = $mysqli->get_charset();
echo "現在の文字セット: " . $charset_info->charset . "<br>";
echo "文字セットの説明: " . $charset_info->comment . "<br>";
echo "文字セットディレクトリ: " . $charset_info->dir . "<br>";
echo "最大バイト長: " . $charset_info->max_length . "<br>";
// テスト中国のデータを挿入します
$sql = "INSERT INTO test_table (content) VALUES ('漢字をテストします')";
if ($mysqli->query($sql)) {
echo "中国のデータを正常に挿入しました。<br>";
} else {
echo "挿入障害: " . $mysqli->error . "<br>";
}
// データベースから読み取りデータをテストします
$result = $mysqli->query("SELECT content FROM test_table ORDER BY id DESC LIMIT 1");
if ($result) {
$row = $result->fetch_assoc();
echo "コンテンツを読む: " . $row['content'] . "<br>";
} else {
echo "クエリに失敗しました: " . $mysqli->error . "<br>";
}
// 接続を閉じます
$mysqli->close();
?>
データベーステーブルとフィールド文字セットは一貫している必要があります<br> テーブルとフィールドの文字セットもUTF8MB4であることを確認してください。SQLを次のように使用できます。
SHOW CREATE TABLE test_table;
そうでない場合は、 Alter Tableを使用して一貫した文字セットに変更できます。
ページコーディングをテスト<br> PHPページ自体がUTF-8エンコードで保存され、正しいコンテンツタイプがHTTP応答ヘッダーで宣言されていることを確認してください。
header('Content-Type: text/html; charset=utf-8');
MySqli_Reportを使用して、デバッグ<br>を容易にします 開発中にMySQLIレポート機能を有効にして、隠されたエラーのキャッチを容易にすることができます。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);