Suzna Developer Blog

すずな株式会社の開発者が技術情報を発信します。

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

こんにちは。clonedです。

MySQLの対話クライアントに日本語(ASCII以外の文字)が入力できない場合、まずは文字コードの設定を確認しますが、文字コードの設定が正しくても日本語を入力できない場合があります。

mysql> SELECT * FROM foo WHERE name = '日本語';

と入力(もしくは貼り付け)しようとしても

mysql> SELECT * FROM foo WHERE name = '';

となってしまうような状態です。なお、次のように対話インタフェースを利用しなければ日本語が利用できるため、文字コード設定以外の問題が考えられます。

$ mysql -ufoo -p dbname -e "SELECT * FROM foo WHERE name = '日本語';"

原因

MySQLの文字入力ライブラリがGNU Readlineではなくlibeditになっていると、上記のような現象になります。libeditがマルチバイトに対応していないことが原因のようです。

対策

MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.9.4 MySQL ソース構成オプション によると、MySQL 5.6.5でReadlineがバンドルされなくなり、5.6.12に WITH_EDITLINE が導入され bundledsystem をコンパイル時に選択できるようです。 bundled になっていると libedit が利用され、日本語入力できません。

Amazon LinuxでMySQL 5.6をyum installしたところこのようになりました。コンパイルオプションを調べたところ WITH_EDITLINE は指定されていなかったため、デフォルトの bundled になっているのだと思います。

この記事の確認環境は Amazon Linux AMI release 2017.09 mysql Ver 14.14 Distrib 5.6.39, for Linux (x86_64) using EditLine wrapper です