php MySQL 絵文字を表示する

発端:
php と MySQL で作成している SNS で、ユーザーが「絵文字入り」の文章を投稿したとき、データが正常に格納されなかった

解決の主旨:
絵文字を表示するには文字コードを utf8mb4 (4バイト)にしないといけない

解決手順1:
phpMyAdmin でデータベースの管理画面に入り、データベースの文字コードを utf8mb4 に変更する
今回、ラッキーなことに、さくらインターネットから「MySQL 5.7 にアップグレードして」と依頼が来ていて、アップグレードを実行したら、デフォルトで utf8mb4 に変わっていた

データベースの文字コードの確認方法は、
phpMyAdmin上で、
SQL で、
SHOW VARIABLES LIKE “chara%”;
を実行する

すると、
character_set_database の項目は utf8mb4 になっていなかったので、
SQL で、
ALTER DATABASE (データベース名) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
を実行した
すると、設定が変わった

解決手順2:
次に、各テーブルの文字コードを utf8mb4 に変える
(これをやるので、上記の「データベースの変更」はやらなくても行けるかもしれない)

各テーブルの文字コードの確認は、
SQL で、
SHOW CREAT TABLE (テーブル名);
を実行する
下の方の DEFAULT CHARSET の項目を変更したい

SQL で、
ALTER TABLE (テーブル名) DEFAULT CHARACTER SET utf8mb4;
を実行する

すると、テーブルの DEFAULT CHARSET=utb8mb4 になるのだが、
各「カラム」が「utf8mb4 ではないよ」という表示に変わるので、そこも修正が必要になる

解決手順3:
各カラムの文字コードを変える
変更前のカラムの設定を正確にメモするために、
SQL で、
SHOW CREATE TABLE (テーブル名);
を実行する
すると、

CREATE TABLE (テーブル名) (
m bigint(11) NOT NULL AUTO_INCREMENT COMMENT ‘連番’,
m_from varchar(80) CHARACTER SET utf8 NOT NULL COMMENT ‘発信者’,
bunsho text CHARACTER SET utf8 NOT NULL COMMENT ‘文章’,
jikan datetime NOT NULL,
PRIMARY KEY (m)
) ENGINE=InnoDB AUTO_INCREMENT=258 DEFAULT CHARSET=utf8mb4
と、実行結果が表示される

今回、bunsho だけ変えたいので、
SQL で、
ALTER TABLE (テーブル名) modify bunsho text CHARACTER SET utf8mb4 NOT NULL COMMENT ‘文章’;
を実行して、カラムの文字コードを変更した

解決手順4:
最後に、php と MySQL の接続パラメータを変更する

$dsn = ‘mysql:dbname=(データベース名);host=mysql57.(サーバー名).sakura.ne.jp;charset=utf8mb4’;
$user = (サーバー名);
$password = (パスワード);
と、 charset だけ修正して、ファイルをサーバーに転送した

以上で、絵文字を投稿、表示できるようになった


コメント

タイトルとURLをコピーしました