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を扱っていると頻繁に遭遇する。
しかし適切なロケールを設定すれば怖くはない(たぶん)。
🦝 < ロッケンロール
🐭 < ……