MySQLに絵文字を格納する

アプリの機能でチャットシステム作ってるんですけど、
絵文字対応することになりサーバーとかDB組み直してるんですが、色々と躓いたのでメモ。

最近デフォルトで使ってる文字コードはUTF-8なんですけど3バイトまでしか対応できないらしく、
一部の中国語とか絵文字が4バイトらしいんです。

4バイトに対応するにはどの文字コードを使うかというと、utf8mb4らしい。
このutf8mb4をMySQLで使うならMySQL 5.5以上でないと使えないみたい。

PHPのフレームワークでCodeIgniterを使ってるのでapplication/config/development/database.phpを以下のように修正

$db['default']['char_set'] = "utf8mb4";
$db['default']['dbcollat'] = "utf8mb4_general_ci";

すると以下のエラー

クライアント接続文字エンコードを設定できませんでした: utf8mb4
Filename: core/Loader.php
Line Number: 268

該当箇所を確認すると

$CI->db =& DB($params, $active_record);

コードを追いかけて行って実際にエラーになってる箇所を探し当てると
mysqli_driver.phpの149行目

return @mysqli_set_charset($this->conn_id, $charset);

これがfalseで返って来ていて失敗していることがわかった。
詳細分からんのでmysqli_connectとmysqli_connect_errorだけ記載したphpを用意してアクセスすると以下のエラー

Can't initialize character set utf8mb4 (path: /usr/share/mysql/charsets/)

検索するとMySQLをコンパイルし直さないとダメらしく、ある程度構築した環境でやるのは面倒だし、エラーの元だと思ったのでVPSのインスタンスを新しく用意。

その後、このサイトこのサイトを参考にして構築開始

モジュールを色々インストール

yum -y install make.x86_64 cmake.x86_64 gcc.x86_64 gcc-c++.x86_64 ncurses-devel bison.x86_64 libaio-devel.x86_64

MySQL 5.6.16のソースコードをDLして解凍

wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.16.tar.gz
tar zvxf mysql-5.6.16.tar.gz

ビルドしてインストール
makeはAzureのSサイズで40分弱かかる
スクリーンショット 2014-02-04 21.59.25


cd mysql-5.6.16
/usr/bin/cmake . -DDEFAULT_CHARSET=utf8mb4 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8mb4_general_ci -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_INNOBASE_STORAGE_ENGINE=1

make
sudo make install
groupadd mysql
useradd -g mysql -d /usr/local/mysql mysql

mkdir /var/lib/mysql
chown -R mysql:mysql /usr/local/mysql

/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/var/lib/mysql -basedir=/usr/local/mysql

chown mysql:mysql -R /var/lib/mysql/*

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

ここで起動してもCan’t connect to local MySQL server through socketというエラーが出るので設定ファイルを編集
vi /etc/my.conf

[mysqld]
socket=/tmp/mysql.sock

[client]
socket=/tmp/mysql.sock

MySQLをスタートしてrootパスワード変更などする。

/etc/init.d/mysqld start

Message: mysqli::mysqli(): (HY000/2003): Can’t connect to MySQL server on ‘HostName’ (13) を解決する
# setsebool -P httpd_can_network_connect 1

広告

MySQLに絵文字を格納する」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中