MariaDBでデータベースを作り、テーブルに日本語文字列をinsertしようとしたところ、文字コードの設定ミスから日本語をinsertできなかった。対応方法を記述する。
環境
MariaDB 10.2.13
windows10
発生した事象
salesデータベースを作成する
MariaDB [(none)]> create database sales; Query OK, 1 row affected (0.01 sec)
商品テーブルを作成する
MariaDB [sales]> create table goods (id int, name varchar(30)); Query OK, 0 rows affected (0.23 sec)
レコードを追加するとエラーになる。文字コードの設定が良くない。
MariaDB [sales]> insert into goods (id, name) values (1, 'ビール'); ERROR 1366 (22007): Incorrect string value: '\x83r\x81[\x83\x8B' for column 'name' at row 1
調査
文字コードを確認
MariaDB [sales]> show variables like 'char%'; +--------------------------+----------------------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------------------+ | character_set_client | sjis | | character_set_connection | sjis | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | sjis | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | C:\Program Files\MariaDB 10.2\share\charsets\ | +--------------------------+----------------------------------------------------+ 8 rows in set (0.00 sec)
character_set_databaseの文字コードがlatin1になっている。
続いて、databaseの文字コードを確認してみる。
MariaDB [sales]> show create database sales; +----------+------------------------------------------------------------------+ | Database | Create Database | +----------+------------------------------------------------------------------+ | sales | CREATE DATABASE `sales` /*!40100 DEFAULT CHARACTER SET latin1 */ | +----------+------------------------------------------------------------------+ 1 row in set (0.00 sec)
デフォルト設定がlatin1となっている。
そこでdatabaseの文字コードを修正する。
対応
流れは以下の通り
- my.iniの修正
- 作成済みdatabaseの文字コード変更
- 作成済みtableの文字コード変更
- カラムの文字コード変更
MariaDB 10.2\data\my.iniに設定を追加する。
[mysqld] ・・・ character-set-server=utf8
設定を変更したらmariaDBを再起動する。
databaseのデフォルト文字コードを変更する。
MariaDB [(none)]> alter database sales character set utf8; Query OK, 1 row affected (0.02 sec) MariaDB [(none)]> show create database sales; +----------+----------------------------------------------------------------+ | Database | Create Database | +----------+----------------------------------------------------------------+ | sales | CREATE DATABASE `sales` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+----------------------------------------------------------------+ 1 row in set (0.00 sec)
テーブルの文字コードを変更
MariaDB [sales]> alter table goods charset=utf8; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [sales]> show create table goods; ----------------------------------------------------------+ | goods | CREATE TABLE `goods` ( `id` int(11) DEFAULT NULL, `name` varchar(30) CHARACTER SET latin1 DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ----------------------------------------------------------+ 1 row in set (0.00 sec)
※テーブルの文字コードはutf8になったが、カラムの文字コードはlatin1のまま
カラムの文字コードを修正
MariaDB [sales]> alter table goods change name name varchar(30) character set utf8 default null; Query OK, 0 rows affected (0.74 sec) Records: 0 Duplicates: 0 Warnings: 0 MariaDB [sales]> show create table goods; -------------------------------------+ | goods | CREATE TABLE `goods` ( `id` int(11) DEFAULT NULL, `name` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | -------------------------------------+ 1 row in set (0.00 sec)
結果の確認
MariaDB [sales]> insert into goods (id, name) values (1, 'ビール'); Query OK, 1 row affected (0.05 sec) MariaDB [sales]> select * from goods; +------+--------+ | id | name | +------+--------+ | 1 | ビール | +------+--------+ 1 row in set (0.02 sec)
コメント