MySQL に iOS の絵文字など、4バイトUTF-8 の文字を入れると、そこで途切れるという現象がありました。
残念ながら発生したサーバの MySQL バージョンは5.1系でバージョンアップせずに対応したのですが、最近構築したサービスイン前のサーバは5.5系だったので設定してみました。
■設定内容
1. 文字コードを utf8 → utf8mb4 に変更
2. skip-character-set-client-handshake を設定
■詳細
1. 文字コードを utf8 → utf8mb4 に変更
MySQLの UTF-8 は4バイトに対応していません。
ですが、絵文字や中国漢字、日本語でも特殊漢字などは4バイトが含まれています。
詳しくはこちら↓
iOS の絵文字(4bytes UTF-8)が入った文字列を MySQL に INSERT/UPDATE すると絵文字以降の文字がぶった切られる件
------------
2. skip-character-set-client-handshake を設定
mysql.cnf の character-set-server を変更しただけでは、PHP で取得した時の文字コードがビルドした時のものが使用されます。
そうすると、MySQLのエラーが出てしまうのです。
General error: 1267 Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ...
これを、ビルドした情報ではなく、MySQL サーバの文字コードで取得するには次のオプションを使います。
skip-character-set-client-handshake
詳しくはこちら↓
PHPとMySQLの個人的まとめ
■変更内容
# vi my.cnf
[client]
-- default-character-set = utf8
++ default-character-set = utf8mb4
[mysqld]
-- character-set-server = utf8
++ character-set-server = utf8mb4
++ skip-character-set-client-handshake
■phpから文字コードを見るコード
<?php
$mysql_host = 'localhost';
$mysql_user = 'root';
$mysql_pw = '';
$mysql_db = 'mysql';
$conn = mysqli_connect($mysql_host, $mysql_user, $mysql_pw, $mysql_db);
$sql = "SHOW VARIABLES LIKE 'char%'";
$result = mysqli_query($conn, $sql);
while ($data = mysqli_fetch_array($result, MYSQLI_NUM)) {
echo str_pad($data[0], 24) ." | ". $data[1]."\n";
}
?>
-------------
以下、実行結果です。
character_set_client | utf8mb4
character_set_connection | utf8mb4
character_set_database | utf8mb4
character_set_filesystem | binary
character_set_results | utf8mb4
character_set_server | utf8mb4
character_set_system | utf8
character_sets_dir | /usr/local/mysql/share/charsets/
0 件のコメント:
コメントを投稿