背景
4byte文字に対応してないとmariadbが日本語を受け付けなかったので、設定を変更しました。備忘録として対応内容を記事に残します。
コマンドは大体下記の記事を参考にしています。
[MySQL MariaDB] MySQLの文字コードをutf8mb4に変更しても絵文字を保存できない
使ったもの
mariadb 10.5.23遭遇したエラーと変更前の設定
日本語をdbに保存しようとしたら下記のエラーが発生しました。Exception in resolver for `Mutation/user_team_update': (conn=439725) Incorrect string value: '\xE3\x83\xAC\xE3\x82\xB0...' for column `{db name}`.`{table name}`.`name` at row 1
文字コードが4byte文字を扱えるutf8md4でないと上記のエラーが発生するようです。
mariadbでstatusコマンドを実行して表示される内容を見ると、文字コードがutf8md4で無いのを確認できました。
# mariadb client
status
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
文字コードをutf8md4に変えます。
clientとserverの文字コードをutf8md4に変更
設定ファイルに下記の設定を追加します。[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
amazon linux2の場合は/etc/my.confに[mysqld]が、/etc/my.conf.d/client.confに[client]がありました。
clientの設定は繋ぎ直せば反映されます。
mysqldの設定はmariadbを再起動すると反映されます。
debian系ならsystemctlで再起動可能です。
# bash
sudo systemctl restart mariadb
mariadbに接続してstatusコマンドを実行すると、設定が成功していればserverとclientとconnの設定が変わります。
# mariadb client
status
Server characterset: utf8mb4
Db characterset: latin1
Client characterset: utf8mb4
Conn. characterset: utf8mb4
databaseの文字コードutf8md4に変更
mysqld設定変更前に作られたdbは古い設定の文字コードになっているため、個別に変更が必要です。開発初期段階でdatabaseの中身を破棄して良いのなら一度破棄して作り直すのが楽です。
今回はある程度動かした後で破棄したくなかったので、設定を変更します。
なお、変更前にバックアップをお勧めします。
# bash
mysqldump --host {your host} --user={your user} --password {db name} > db-$(date "+%Y%m%d-%H%M").dump
dbの文字コードはstatusコマンドかshow create databaseコマンドで確認できます。
# mariadb client
show create database {db name};
+-----------+--------------------------------------------------------------------------------------------------+
| Database | Create Database |
+-----------+--------------------------------------------------------------------------------------------------+
| {db name} | CREATE DATABASE `{db name}` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */ |
+-----------+--------------------------------------------------------------------------------------------------+
utf8md4でないのが分かったので変更します。
# mariadb client
ALTER DATABASE {db name} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
変わったか確認します。
# mariadb client
show create database {db name};
+-----------+--------------------------------------------------------------------------------------------------+
| Database | Create Database |
+-----------+--------------------------------------------------------------------------------------------------+
| {db name} | CREATE DATABASE `{db name}` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ |
+-----------+--------------------------------------------------------------------------------------------------+
dbの標準文字コードがutf8md4になりました。
tableの文字コードをmtf8md4に変更
既に作られたtableの文字コードも古いままなので変えます。db内の全てのtableの設定変更を行うsqlを組み立てて紹介している方がstackoverflowに居るので、tableが多い場合はこれに頼るのも一手です。
How to convert all tables in database to one collation?
テーブルの一覧を見ます。
表示されたテーブル全てに対して変更を行います。
# mariadb client
show tables;
テーブルの設定を確認します。
# mariadb client
show create table {table name};
# 表示された内容の最後の方
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci |
文字コードがutf8md4ではないので変更します。
# mariadb client
ALTER TABLE {table name} CONVERT TO CHARACTER SET utf8mb4;
変わったか確認します。
# mariadb client
show create table {table name};
# 表示された内容の最後の方
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci |
utf8md4になりました。
tableの文字コードを変えれば日本語を保存可能なはずです。
おわり
mariadbに日本語が保存できなくて冷や汗をかきましたが、設定変更可能で良かったです。参考
[MySQL MariaDB] MySQLの文字コードをutf8mb4に変更しても絵文字を保存できないHow to convert all tables in database to one collation?
MySQL/MariaDBのダンプリストア方法一覧【高速】
0 件のコメント :
コメントを投稿