現在の位置: ホーム> 最新記事一覧> mysqli :: get_charsetを使用して、unicode emojiストレージの障害の問題を回避する

mysqli :: get_charsetを使用して、unicode emojiストレージの障害の問題を回避する

M66 2025-05-23

MySQLデータベース、特にコメント、ニックネーム、チャットレコードなどのテキストフィールドを使用してユーザーの入力コンテンツを保存すると、ユーザーが絵文字の絵文字またはいくつかの特別なユニコードシンボルに入ると、データベースに保存すると、セーブが成功した場合でも、装備されて表示されます( )。

これは、MySQLデータベース( UTF8など)のデフォルト文字セットが4バイトのUnicode文字(ほとんどの絵文字を含む)を完全にサポートしていないためです。この問題を解決するには、データベースレベルの構成に加えて、PHPコードは、クライアントに接続された文字セットが正しく設定されていることを確認する必要があります。この記事では、mysqli :: get_charset関数を使用して、接続文字セットが正しいことを確認して、Unicodeの絵文字を保存できない問題を解決する方法について説明します。

問題の背景

MySQLのUTF8エンコーディングは実際には最大3バイトの文字しかサポートされていませんが、絵文字と一部のユニコード文字には4バイトが必要なため、 UTF8MB4を使用する必要があります。サーバー側(データベーステーブル、フィールド、接続)がUTF8MB4を設定しない場合、これらの文字は挿入に失敗するか、切り捨てられて疑問符に置き換えられます。

通常、3つのことをする必要があります。

  1. データベースとテーブルの文字セットは、 UTF8MB4に設定されています。

  2. データベースに接続するときにUTF8MB4を指定します。

  3. PHPコードで使用されている文字セットが正しいことを確認します。

mysqli :: get_charsetを使用して文字セットを確認します

PHPのMySQLIクラスは、 get_charsetメソッドを提供します。これは、現在の接続の文字セット情報を取得するために使用できます。この関数を使用すると、現在の接続がUTF8MB4を使用しているかどうかをコードに確認し、一致しない場合は調整できます。

サンプルコードは次のとおりです。

 <?php
// データベース接続情報
$mysqli = new mysqli('localhost', 'username', 'password', 'database');

// 接続が成功しているかどうかを確認してください
if ($mysqli->connect_errno) {
    die('接続に失敗しました: ' . $mysqli->connect_error);
}

// 現在の接続文字セットを確認します
$charsetInfo = $mysqli->get_charset();
echo '現在の接続文字セット: ' . $charsetInfo->charset . PHP_EOL;

// そうでない場合 utf8mb4,次に、に設定します utf8mb4
if ($charsetInfo->charset !== 'utf8mb4') {
    if (!$mysqli->set_charset('utf8mb4')) {
        die('文字セットの設定に失敗しました: ' . $mysqli->error);
    } else {
        echo '接続文字セットが設定されています utf8mb4' . PHP_EOL;
    }
}

// 挿入の例は含まれます Emoji のデータ
$stmt = $mysqli->prepare('INSERT INTO messages (content) VALUES (?)');
$content = 'テスト Emoji ?? ??';
$stmt->bind_param('s', $content);

if ($stmt->execute()) {
    echo 'データ挿入に正常に!' . PHP_EOL;
} else {
    echo '挿入障害: ' . $stmt->error . PHP_EOL;
}

$stmt->close();
$mysqli->close();
?>

データベース構成の提案

コードレベルの設定に加えて、絵文字やその他の4バイトの文字を完全にサポートするには、次のことも必要です。

  1. データベース、テーブル、およびフィールド文字セットの設定:

     ALTER DATABASE your_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  2. 接続パラメーター: mysql構成ファイルの[mysqld]部分がmy.cnfが含まれていることを確認してください。

     character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    

まとめ

mysqli :: get_charsetを使用すると、コードで接続文字セットが正しいかどうかを動的に確認し、必要に応じて修正を行うのに役立ちます。データベースとテーブルの正しい構成を組み合わせることで、Unicode絵文字を保存できない問題を完全に解決できます。このようにして、ユーザーは、損失や文字化けコードを心配することなく、アプリケーションでさまざまな絵文字を使用できます。