ユーニックス総合研究所

  • home
  • archives
  • mariadb-jpn-input

MariaDBで日本語入力できない原因はロケールの設定にありました

  • 作成日: 2021-12-03
  • 更新日: 2023-12-24
  • カテゴリ: MariaDB

MariaDBで日本語入力できない

MariaDB(mysql)で日本語が入力できない。
日本語を含んだクエリを実行できなかった。
なぜ?

この記事ではこの問題の解決法を備忘録として残すことにする。

環境

問題が発生した環境は次の通り。

  • Ubuntu 20.04
  • MariaDB 10.3.25

MariaDBの状態

ちなみにMariaDBの文字コードは↓のようになっている。

MariaDB [mydb]> SHOW VARIABLES LIKE '%char%';  
+--------------------------+----------------------------+  
| Variable_name            | Value                      |  
+--------------------------+----------------------------+  
| character_set_client     | utf8mb4                    |  
| character_set_connection | utf8mb4                    |  
| character_set_database   | utf8mb4                    |  
| character_set_filesystem | binary                     |  
| character_set_results    | utf8mb4                    |  
| character_set_server     | utf8mb4                    |  
| character_set_system     | utf8                       |  
| character_sets_dir       | /usr/share/mysql/charsets/ |  
+--------------------------+----------------------------+  
8 rows in set (0.001 sec)  

ここで文字コードがlatinなどになっている場合はutf8mb4に設定することをお勧めする(2021年現在)。
ただし運用中のDBの設定を変更すると色々問題が発生する可能性がある。
その辺は各自の判断でお願いします。

解決法: 環境変数を設定する

なんでもMariaDBで日本語を入力するには環境(端末)に↓の2つの変数をセットする必要があるそう。

  • LANG
  • LC_ALL

これらの変数は「ロケール環境変数」と呼ばれる。
つまり日本語(ロケール)を設定するにはこの環境変数を弄ればいい。

LANG環境変数はロケール設定の基本となる変数で、普通はこのLANGを設定すれば用は足りるらしい。
LC_ALLが設定されている場合はこの値が最優先でロケールに反映される。

つまり優先順位的には

優先: LC_ALL > LANG :非優先  

になる。
ということはLC_ALLだけを設定すればいいみたいだけど、今回は念のためのこの2つを共に設定する。

以下のコマンドでBashにロケール環境変数を設定する。

# export LANG=ja_JP.UTF-8  
# export LC_ALL=ja_JP.UTF-8  
bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)  

ja_JP.UTF-8」は「UTF-8の日本語」を表すロケール値。
現在起動中のBash(端末)にexportで環境変数を設定する。

しかし「warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)」という警告が出力されるようになった。
localeを実行しても同様。
localeコマンドは現在設定されているロケールの一覧を出力する。

# locale  
locale: Cannot set LC_CTYPE to default locale: No such file or directory  
locale: Cannot set LC_MESSAGES to default locale: No such file or directory  
locale: Cannot set LC_ALL to default locale: No such file or directory  
LANG=ja_JP.UTF-8  
LANGUAGE=  
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  

どうやらja_JP.UTF-8が無いらしい。
Ubuntu 20.04の場合は「language-pack-ja」をインストールすると直るそう。

# apt update && apt install language-pack-ja  

localeを実行しても警告は出なくなった。

解決後の実行結果

mysqlコマンドでMariaDBを起動して日本語を入力する。

# mysql  
MariaDB [(none)]> # 日本語  

無事に日本語を入力できた。

おわりに

ロケール絡みのエラーはLinuxを扱っていると頻繁に遭遇する。
しかし適切なロケールを設定すれば怖くはない(たぶん)。

🦝 < ロッケンロール

🐭 < ……