MySQLのCLIで日本語が入力できない

  • このエントリーをはてなブックマークに追加

文字コードの設定関係なしに、MySQLのCLIに日本語を貼り付けても入力できないことがあります。AmazonLinuxのMySQL56がそうでした。

参考: MySQLクライアントに日本語が入力できない理由

理由は上記のブログにも書いてあるとおり、ReadlineではなくLibEditをLinkしているからなのですが、実はLibEditは2016年にマルチバイトに対応しています。

http://thrysoee.dk/editline/

2016-06-18 Jess Thrysoee

  • version-info: 0:54:0

  • all: sync with upstream source

  • deprecate option –enable-widec.
    Upstream now always build with unicode (wide-char/UTF-8) support.

ではなぜ入力できないのか、それはAmazonLinuxに入っているlibeditが古いからです。2008年のものです。とても古いです😱

$ sudo yum list | grep libedit

libedit.x86_64 2.11-4.20080712cvs.1.6.amzn1 installed
libedit.i686 2.11-4.20080712cvs.1.6.amzn1 amzn-main
libedit-devel.x86_64 2.11-4.20080712cvs.1.6.amzn1 amzn-main
$ mysql --version
mysql Ver 14.14 Distrib 5.6.41, for Linux (x86_64) using EditLine wrapper

対応はいくつかあります。

  • MySQL55を使う
  • MySQL56を使いつつ、LibEditは新しいものを使う

MySQL55を使う

MySQL5.6.12からReadlineではなくなっています。そのため、MySQL55のクライアントを使えば日本語は入力できます。

$ sudo yum install mysql55
$ mysql --version
mysql Ver 14.14 Distrib 5.5.61, for Linux (x86_64) using readline 5.1

新しいLibEditを使う

そうは言ってもMySQL5.6や5.7のクライアントを使いたい。
幸いにもstatic linkではないので、新しいLibEditをインストールしてそちらを参照するようにしてみます。

$ sudo yum install mysql56
$ ldd /usr/bin/mysql | grep libedit
libedit.so.0 => /usr/lib64/libedit.so.0 (0x00007fd0a7a03000)

ビルドしてインストール

wget http://thrysoee.dk/editline/libedit-20180525-3.1.tar.gz
tar zxvf libedit-20180525-3.1.tar.gz
cd libedit-20180525-3.1

sudo yum install gcc ncurses-devel
./configure --prefix=/usr/local --libdir=/usr/local/lib64
make
sudo make install

何も指定しないでconfigureすると/usr/local/libに入ってしまうので、一応/usr/local/lib64に入れるようにします。

$ ll /usr/local/lib64/

total 2052
-rw-r--r-- 1 root root 1315136 Aug 29 20:53 libedit.a
-rwxr-xr-x 1 root root 930 Aug 29 20:53 libedit.la
lrwxrwxrwx 1 root root 17 Aug 29 20:53 libedit.so -> libedit.so.0.0.58
lrwxrwxrwx 1 root root 17 Aug 29 20:53 libedit.so.0 -> libedit.so.0.0.58
-rwxr-xr-x 1 root root 762136 Aug 29 20:53 libedit.so.0.0.58
drwxr-xr-x 2 root root 4096 Aug 29 20:53 pkgconfig
drwxr-xr-x 3 root root 4096 Aug 11 01:26 python2.7
drwxr-xr-x 3 root root 4096 Aug 11 01:26 ruby

差し替え方法 その1

ldconfigの設定を変更する。
ただし、この方法は全てに波及してしまうので気をつける必要があります。

cat <<EOS | sudo tee /etc/ld.so.conf.d/libedit.conf
/usr/local/lib64
EOS

# キャッシュ更新
sudo ldconfig

sudo ldconfig -p | grep edit
libedit.so.0 (libc6,x86-64) => /usr/local/lib64/libedit.so.0
libedit.so.0 (libc6,x86-64) => /usr/lib64/libedit.so.0
libedit.so (libc6,x86-64) => /usr/local/lib64/libedit.so

ldd /usr/bin/mysql | grep edit
libedit.so.0 => /usr/local/lib64/libedit.so.0 (0x00007f459702f000)

問題なく日本語入力できました。

差し替え方法 その2

全体を差し替えてしまうのは怖いので、mysqlのCLIだけ差し替える場合はLD_LIBRARY_PATHで対応します。

alias mysql="LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH /usr/bin/mysql"
ldd /usr/bin/mysql | grep edit
libedit.so.0 => /usr/local/lib64/libedit.so.0 (0x00007fb179bec000)

これでも問題なく日本語が入力できました。