サーバー SQL

【RHEL7.9】MySQL8のコンソールで日本語入力ができない

2023年3月20日

RHEL7.9にMySQL8をインストールすると日本語入力ができなかったので対応方法を検討しました。

MySQL8のコンソール画面では日本語入力できない

RHEL7.9+SoftwareCollectionでMySQL Clientをインストールし、別サーバで構築したMySQLに接続した場合日本語入力が日本語入力できませんでした。

インストールしたのは下記

 yum install rh-mysql80-mysql

MySQLに接続できても日本語入力ができませんでした。

Locale で「ja_JP.UTF-8」に設定しても変わらず

Localeで「ja_JP.UTF-8」に設定すると日本語入力できると記事がいくつか見つかったので、試してみたがうまくいきませんでした。

# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=ja_JP.UTF-8
#''内に日本語入力をしてもEnterキーで確定した時点で文字が消える
mysql> select '';
+--+
|  |
+--+
|  |
+--+

my.cnfの設定を確認しても変更せず

my.cnfに「default-character-set」を入力したらうまくいくかもと思ったがうまくいかず

utf8mb4、utf8設定でも同様の状態でした。

MySQL5.7だと動作する

MySQL5.7でインストールした場合はインストールできたのでMySQL8のインストールで問題がありそうということがわかりました。

RHEL8やUbuntuでも問題なく動作する

MySQL8の問題かと思い、RHEL8やUbuntuにMySQLをインストールした場合は日本語入力ができる。
そのため、RHEL7とMySQL8に問題がありそうというのがわかりました。

libeditのバージョンが問題

RHEL7のRed Hat Software Collections(RHSCL)でMySQLをインストールすると、コンソール入力ライブラリとしてlibeditを利用していることがわかりました。
RHEL7でインストールされているlibeditは3.0-12.20121213cvs.el7(バージョン40)でした。

libeditは2016-06-18(バージョン54)以降にUTF-8対応となってるのでRHEL7でインストールしているものはUTF-8未対応のものであるため入力できなかったのが原因でした。

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.
Editline Library (libedit) ChangeLog

そのため、libeditのバージョンアップを行う必要がありました。

libeditのmake・mysqlに適用

libeditのmake

Editline Libraryから最新版をダウンロードしてconfigure→makeします

デフォルトでインストールすると「/usr/local/lib」に入るのですが、指定してインストールしたい場合はconfigureにlibdirの引数を追加します

# gccとncurses-develをインストール
yum install gcc ncurses-devel
wget https://www.thrysoee.dk/editline/libedit-20221030-3.1.tar.gz

# ライブラリインストール先を/usr/local/lib64に指定
./configure --prefix=/usr/local --libdir=/usr/local/lib64
make
make install

mysqlで実行

そのままだとインストールしたlibeditは使われないため、設定を行っていきます。

mysql実施時だけ最新のlibeditを利用する

libeditの最新版を標準で読み込みさせるとほかの不具合が出る可能性があるため、mysql実行時だけ利用します。

LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH /usr/bin/mysql -uroot -ppassword -h 192.168.xxx.xxx

これで日本語の文字入力ができるようになりました。

ただ、何度もLD_LIBRARY_PATHを実行するのはめんどくさいので、alias設定をします。

alias mysql="LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH /usr/bin/mysql"
# 実際にログインして文字入力できることを確認する
mysql> select 'あああ';
+-----------+
| あああ    |
+-----------+
| あああ    |
+-----------+
1 row in set (0.00 sec)

【非推奨】ldconfigの設定

ldconfigの設定を変更することで最新のlibeditを使うことができます。

ただし、最新版libeditを最新版に挙げたことで他アプリの挙動がおかしくなる可能性があるためあまりお勧めしないです。

#root権限で実行
echo /usr/local/lib64 > /etc/ld.so.conf.d/libedit.conf
ldconfig

#lddで置き換わっていることを確認
ldd /usr/bin/mysql |grep libedit
        libedit.so.0 => /usr/local/lib64/libedit.so.0 (0x00007f8d1ad93000)

雑感

RHEL7なんて2024年6月30日にサポート終了するのですが、MySQL5.7のExtended Supportサポート期限は2023年10月なのですぐにバージョンアップ対応しないといけなくなりますね。

RHEL8.7のlibeditは3.1-23.20170329(バージョン56)でした。これもそこそこ古い・・・

参考

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

-サーバー, SQL
-, ,