文字コードの設定関係なしに、MySQLのCLIに日本語を貼り付けても入力できないことがあります。AmazonLinuxのMySQL56がそうでした。
参考: MySQLクライアントに日本語が入力できない理由
理由は上記のブログにも書いてあるとおり、ReadlineではなくLibEditをLinkしているからなのですが、実はLibEditは2016年にマルチバイトに対応しています。
http://thrysoee.dk/editline/
2016-06-18 Jess Thrysoee
ではなぜ入力できないのか、それは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)
|
これでも問題なく日本語が入力できました。