MariaDB日本語文字化け対応

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の文字コードを修正する。
 

対応

流れは以下の通り

  1. my.iniの修正
  2. 作成済みdatabaseの文字コード変更
  3. 作成済みtableの文字コード変更
  4. カラムの文字コード変更

 
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)

コメント

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