2012年11月12日月曜日

mysql に 4バイトutf8 の文字を入れたい

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 件のコメント:

コメントを投稿