MySQL(MariaDB)で#22007 Incorrect string valueエラー

MySQL(MariaDB)

テーブルへの行追加や行更新しようとしたところ「#22007 Incorrect string value」エラーが発生しました。対象テーブルの文字コードを確認すると「DEFAULT CHARSET=latin1」というラテン系になっていました。

MySQL(MariaDB)の文字コード問題を解決する

サーバーにSSHで接続し、MariaDBに接続する

[youruser@157-7-193-0 ~]$ su
Password: 
[root@157-7-193-0 youruser]# mysql -u root -p
Enter password: 

文字コードを確認する

utf8」ではなく「utf8mb4」に変更していく。
なおutf8になっていればマルチバイトが問題無さそうな気もするが、MySQL(MariaDB)では3バイトまでしか扱えない。

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

文字コードを変更するための設定ファイルの場所を探す

MySQL(MariaDB)の設定ファイルの場所は「mysql –help | grep my.cnf」で探せる。一度場所を暗記すれば必要のない操作。

[root@157-7-193-0 /]# mysql --help | grep my.cnf
/etc/my.cnf ~/.my.cnf 
                      order of preference, my.cnf, $MYSQL_TCP_PORT,

my.cnfの中身を確認する

「!includedir /etc/my.cnf.d」となっており、このフォルダ配下の「*.cnf」を読み込むようになっている。

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

「/etc/my.cnf.d」の中で手を加えて良さそうなファイルを探す

私の環境では「mariadb-server.cnf」が適切っぽい

[root@157-7-193-0 my.cnf.d]# ll
total 24
-rw-r--r-- 1 root root   42 Jun 13  2022 auth_gssapi.cnf
-rw-r--r-- 1 root root  295 Mar 26  2022 client.cnf
-rw-r--r-- 1 root root  763 May 18  2022 enable_encryption.preset
-rw-r--r-- 1 root root 1458 Jun 13  2022 mariadb-server.cnf
-rw-r--r-- 1 root root  232 May 18  2022 mysql-clients.cnf
-rw-r--r-- 1 root root  120 May 18  2022 spider.cnf

文字コードの指定を追加、または変更する

[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4

MySQL(MariaDB)の再起動

設定変更したので再起動する(ほぼ一瞬)

sudo systemctl restart mariadb

文字コードを確認する

utf8mb4」に切り替わったのでこちらの設定はこれでOK。
ただし、作成済みのテーブルがある場合、そちらの対応も必要。

MariaDB [(none)]> SHOW VARIABLES LIKE 'chara%';
+--------------------------+------------------------------+
| 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/mariadb/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.002 sec)

各テーブルの文字コードを変更する

テーブル数が多いと大変だが間違ってもテーブル名を手打ちするなどしないこと。
show tables;」でテーブル名の一覧を取得すると楽ちん。

ALTER TABLE table_name 
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

札幌在住エンジニア。JavaやPHPやWordPressを中心とした記事が中心です。

【SE歴】四半世紀以上
【Backend】php / java(spring) / c# / AdobeFlex / c++ / VB / cobol
【Frontend】 vue.js / jquery他 / javascript / html / css
【DB】oracle / mysql / mariadb / sqlite
【infrastructure】aws / oracle / gcp
【license】aws(saa-c03) / oracle master / XML Master / Sun Certified Programmer for the Java 2 Platform 1.4

Nobelをフォローする
MySQL(MariaDB)
Nobelをフォローする

コメント

タイトルとURLをコピーしました