MySQLで中国語など4バイト文字を使いたいとき

MySQLで中国語が入ったデータを扱うことがあったのでメモ。
中国語以外にも特殊文字や一部の日本語の漢字、絵文字なども関係があるみたい。
単純にUTF-8の設定だけだとデータの表示がおかしくなる。

いろいろと調べてみると、同じUTF-8でも4バイトの文字があるのが原因らしい。
4バイトのUTF-8を扱うには「utf8mb4」という文字コード設定をすれば大丈夫みたい。
utf8mb4の照合順序は「utf8mb4_general_ci」になる。

人にアドバイスを貰ったときはUTF-16にすれば大丈夫じゃないか、と言われていたが
なぜかそっちの設定をしようとすると、エラーが出て起動もままならなかった。

ちなみに、この設定ができるのは5.5.3以降らしい。


あと、tera termなどでMySQLへアクセスしていたりすると、ターミナルソフトの表示側の問題で正しく文字が見れないこともあるので注意。

CentOS6でyumが繋がらなくなった

サーバの設定をしてたら、次のエラーが出て突然yumが繋がらなくなった。

Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

iptablesの設定を間違えたのかと思ったらそうではないし、wgetpingで適当なところにアクセスするとちゃんと通る。
エラーでググると同じような症状のページを見つけたので対応してみる。
http://d.hatena.ne.jp/mezashi184/20120412

/etc/yum.repos.d/epel.repoを次のように修正

#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

↓

baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

ファイルを保存して適当にyum updateとかやってみたら無事通った。

いつの間にかupdate中にEPELのレポジトリが追加されてたようだ。

PHP libmemcachedのビルドがうまくできなかった

PHPでlibmemcachedを利用するためのライブラリにこんなのがある。
GREE Engineering
これを使うためにビルドしたらmakeで失敗した。

その時のログがこれ。

/bin/sh /usr/local/src/libmemcached-0.2.0/libtool --mode=compile cc  -I. -I/usr/local/src/libmemcached-0.2.0 -DPHP_ATOM_INC -I/usr/local/src/libmemcached-0.2.0/include -I/usr/local/src/libmemcached-0.2.0/main -I/usr/local/src/libmemcached-0.2.0 -I/usr/local/php-5.4.13/include/php -I/usr/local/php-5.4.13/include/php/main -I/usr/local/php-5.4.13/include/php/TSRM -I/usr/local/php-5.4.13/include/php/Zend -I/usr/local/php-5.4.13/include/php/ext -I/usr/local/php-5.4.13/include/php/ext/date/lib -I/usr/local/include  -DHAVE_CONFIG_H  -g -O2   -c /usr/local/src/libmemcached-0.2.0/libmemcached.c -o libmemcached.lo 
mkdir .libs
 cc -I. -I/usr/local/src/libmemcached-0.2.0 -DPHP_ATOM_INC -I/usr/local/src/libmemcached-0.2.0/include -I/usr/local/src/libmemcached-0.2.0/main -I/usr/local/src/libmemcached-0.2.0 -I/usr/local/php-5.4.13/include/php -I/usr/local/php-5.4.13/include/php/main -I/usr/local/php-5.4.13/include/php/TSRM -I/usr/local/php-5.4.13/include/php/Zend -I/usr/local/php-5.4.13/include/php/ext -I/usr/local/php-5.4.13/include/php/ext/date/lib -I/usr/local/include -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/libmemcached-0.2.0/libmemcached.c  -fPIC -DPIC -o .libs/libmemcached.o
/usr/local/src/libmemcached-0.2.0/libmemcached.c: In function ‘_php_libmemcached_error’:
/usr/local/src/libmemcached-0.2.0/libmemcached.c:431: error: ‘memcached_st’ has no member named ‘hosts’
/usr/local/src/libmemcached-0.2.0/libmemcached.c:433: error: ‘memcached_server_st’ has no member named ‘cached_errno’
/usr/local/src/libmemcached-0.2.0/libmemcached.c:433: error: ‘memcached_server_st’ has no member named ‘cached_errno’
/usr/local/src/libmemcached-0.2.0/libmemcached.c: In function ‘zif_memcached_gets’:
/usr/local/src/libmemcached-0.2.0/libmemcached.c:515: 警告: passing argument 2 of ‘memcached_mget’ from incompatible pointer type
/usr/local/include/libmemcached-1.0/get.h:54: note: expected ‘const char * const*’ but argument is of type ‘char **’
/usr/local/src/libmemcached-0.2.0/libmemcached.c:534: 警告: passing argument 2 of ‘_php_libmemcached_get_value’ discards qualifiers from pointer target type
/usr/local/src/libmemcached-0.2.0/libmemcached.c:305: note: expected ‘char *’ but argument is of type ‘const char *’
/usr/local/src/libmemcached-0.2.0/libmemcached.c: In function ‘zif_memcached_server_list’:
/usr/local/src/libmemcached-0.2.0/libmemcached.c:1165: 警告: initialization makes pointer from integer without a cast
/usr/local/src/libmemcached-0.2.0/libmemcached.c: In function ‘zif_memcached_mget’:
/usr/local/src/libmemcached-0.2.0/libmemcached.c:1275: 警告: passing argument 2 of ‘memcached_mget’ from incompatible pointer type
/usr/local/include/libmemcached-1.0/get.h:54: note: expected ‘const char * const*’ but argument is of type ‘char **’
make: *** [libmemcached.lo] エラー 1

libmemecachedも入ってるし、何が行けないんだろうと結構悩んだ。
とりあえず「libmemcached.lo」ってなんだろう、と思ってディレクトリ内のファイルを見ていたら「libmemcached.loT」というファイルを見つけた。


まさか・・・とおもってこれをlibmemcached.loにリネームしたらmakeが通った。

ここで生成されるファイル名が間違ってるとは思わなかったよ。

PHPモジュールのエラー

PHPのエラーログにWarningでこんなのが出た

Invalid library (maybe not a PHP library) 'gd.so'  in Unknown on line 0
Invalid library (maybe not a PHP library) 'json.so'  in Unknown on line 0
Invalid library (maybe not a PHP library) 'libmemcached.so'  in Unknown on line 0
Invalid library (maybe not a PHP library) 'pdo.so'  in Unknown on line 0

【php】Invalid library (maybe not a PHP library) ‘mcrypt.so’ at softelメモ
ここと全く同じ状態だったみたい。
要はコンパイル時にオプションで静的に組み込んだモジュールに対して、モジュールファイルを指定して読み込むとエラーが出るらしい。
・・・いろんなオプションを付けてたから気づいてないだけでモジュールが組み込まれてたみたいだ。

ちなみにlibmemcached.soはmemcacheを使うオプションをつけていて、php-libmemcachedを組み込むと出る。

調べてて気づいたけど、「php -i」でモジュールが組み込まれてるか確認できるから、それを見てからphp.iniにモジュールを追記したほうがいいかも。
phpinfo()でもいけるのかなあ、これ。

node.jsがソースからインストール出来ない場合

node.jsのインストールでハマったことがあったので対処をメモっておく。

まずコンパイル時にgcc-c++が必要。
あとopensslも要るので、必要に応じて以下を実行。

yum install gcc-c++ openssl-devel

よし、じゃあconfigureしてインストール、と思ったら通らない。
pythonのバージョンが2.5?2.6?以上じゃないとダメらしい。
つまりCentOS標準のpythonだとインストール出来ない。

というわけでpython-2.7.3をインストール。
システムのを入れ替えるのはめんどくさいのでソースから。

cd /usr/local/src
wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
tar zxvf Python-2.7.3.tgz; cd Python-2.7.3
./configure --prefix=/usr/local/python-2.7.3
make && make install

次はnode.jsのビルド。
まず、configureファイルの1行目を見ると

#!/usr/bin/env python

ってなってるので以下のように変更

#!/usr/bin/env /usr/local/python-2.7.3/bin/python

これで別途ソースからインストールしたpythonを使ってくれるので、以下のコマンドを実行。

./configure --prefix=/usr/local/node-v0.10.0
make
PYTHON=/usr/local/python-2.7.3/bin/python make install

気をつけないといけないのは最後のmake install時。pythonの場所を指定してあげないと途中でコケる。

これで晴れてnode.jsがインストールできる。
と、これを書いている途中で確認していたら、どうやら最近出たCentOS6.4に標準で入っているpythonはバージョンが2.6.6だった。
CentOS5系や6.3以前を使っている場合は以上の手順でインストールできるはず。