PHPのプログラムでMySQLへ日本語をinsertしたら文字化けしてしまいました。
原因と対策を調べてみました。
PHP から MySQL へ insert すると 文字化けして????「はてな」(クエスチョンマーク)
PHPでMySQLに、UTF-8の日本語の文字列を insert しました。
その後、表示させてみると、日本語の文字列が「????」(はてな、クエスチョンマーク) と文字化けしていました。
UTF-8がまずいんだろうか?
原因を調べてみました。
PHP から MySQL へ接続するにはPDO
まず、PHPからMySQLへの接続方法を調べてみます。
PHP から MySQLに接続するには、mysql_connectとPDOとがあります。
PHP 5.5から mysql_connect() は、非推奨のため、PDOを使って接続します。
こんな感じで、接続する際の文字コードをutf8で指定しているので、接続する時の文字コードは問題ないようです。
1 2 3 4 5 |
$dsn = 'mysql:host=0.0.0.0;port=0000;dbname=DBNAME;charset=utf8'; $user = 'DBUSER'; $password = 'DBPASS'; $dbh = new PDO($dsn, $user, $password); |
文字化けの原因は、MySQLの文字コード?
MySQLの文字コードを調べてみます。
以下のSQLで調べます。
mysql > show variables like "char%";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
MariaDB [(none)]> show variables like "chara%"; の結果は以下です。 +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+--------------------------------+ |
character_set_database と character_set_server が latin1 となっていますね。
ここを修正します。
/etc/my.cnf を編集して
character-set-server=utf8
を追加しておきます。
1 2 |
[mysqld] character-set-server=utf8 |
MySQL (MariaDB) を再起動します。
1 |
# systemctl restart mariadb.service |
再度、MySQLの文字コードを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
MariaDB [(none)]> show variables like "char%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) |
これで、再度、UTF-8の日本語をinsertすると、無事に文字化けは解決しました!
コメント