テスト環境は
windows 10
xampp 7.2.0
Apache 2.4.29
MariaDB 10.1.29
PHP 7.2.0
https://qiita.com/suzuki_sh/items/f02fc88a8514fd23a47e
上記ページを参考にして
sql
1CREATE DATABASE sushiya; 2CREATE TABLE sushi(id INT AUTO_INCREMENT, name VARCHAR(20), INDEX(id)) COLLATE utf8mb4_bin; 3INSERT INTO sushi(name) VALUES("タマゴスシ"); 4INSERT INTO sushi(name) VALUES("マグロ????スシ"); 5INSERT INTO sushi(name) VALUES("マグロ????スシ");
このれらの命令文を1行ごとにphpMyAdminのSQLタブにあるformから実行させたところ正しく絵文字が登録されました。
php
1<?php 2try { 3 $dbh = new PDO('mysql:dbname=sushiya;host=localhost;charset=utf8mb4','root','hogehoge'); 4} catch (PDOException $e) { 5 exit($e->getMessage()); 6} 7 8$sql = "INSERT INTO sushi(name) VALUES('マグロ????スシ');"; 9$dbh->exec($sql); 10?>
上記を実行させたところ
マグロ????スシ
このように?4つに文字化けしてしまいました。
phpMyAdminで実行させたら絵文字が保存できているのでテーブルの設定には問題ないと思うのですがPHPで実行させると文字化けを起こす理由がわからず困っています。
追加
PHPファイルの文字コードはUTF-8(BOM無し)です。
php
1<?php 2try { 3 $options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8mb4"); 4 $dbh = new PDO('mysql:dbname=sushiya;host=localhost;charset=utf8mb4','root','hogehoge', $options); 5} catch (PDOException $e) { 6 exit($e->getMessage()); 7} 8 9$sql = "INSERT INTO sushi(name) VALUES('マグロ????スシ');"; 10$dbh->exec($sql); 11?>
php
1<?php 2try { 3 $dbh = new PDO('mysql:dbname=sushiya;host=localhost;charset=utf8mb4','root','hogehoge'); 4 $dbh->query("set names utf8mb4"); 5} catch (PDOException $e) { 6 exit($e->getMessage()); 7} 8 9$sql = "INSERT INTO sushi(name) VALUES('マグロ????スシ');"; 10$dbh->exec($sql); 11?>
上記のように
php
1$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8mb4");
php
1$dbh->query("set names utf8mb4");
これらを追加したところ正しく絵文字が登録されました。
ただし根本的な解決になってないので、テスト環境の設定が間違っているのであれば指摘してもらえるとありがたいです。
