PostgreSQL14からMySQL8.0移行時に遭遇したエラーと不具合の対応をした

文字コードでえらくハマった。
闇雲にググるんじゃなくて、公式ドキュメントを読もうと誓った。

開発環境

github.com

# ホスト
> docker --version
Docker version 20.10.8, build 3967b7d

> docker-compose --version
docker-compose version 1.29.2, build 5becea4c

# コンテナ
root@{CONTAINER_ID}:/# mysql --version
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

ERROR 1290 (HY000)

ERROR 1290 (HY000) at line 3: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

発生タイミング

CSVファイルをインポートするとき

どう解決した?

[mysqld]
secure-file-priv = "docker-entrypoint-initdb.d"

ファイルを読み取りおよび書き込みできるようにするための設定を追加。

ERROR 1366 (HY000)

ERROR 1366 (HY000) at line 3: Incorrect integer value: 'id' for column 'id' at row 1

発生タイミング

CSVファイルをインポートしてテーブルに反映するとき

どう解決した?

LOAD DATA INFILE '/docker-entrypoint-initdb.d/idol_list.csv'
INTO
    TABLE idol FIELDS TERMINATED BY
        ',' IGNORE 1 ROWS
;

CSVファイルの1行目がレコードとして読み込まれてしまっていた。
1行目を無視する設定を追加。

文字コードの不具合

mysql> select id, name, height from idol limit 5;
+----+--------+--------+
| id | name   | height |
+----+--------+--------+
|  1 | ?? ??  |    155 |
|  2 | ?? ??? |    157 |
|  3 | ?? ??  |    154 |
|  4 | ?? ??  |    165 |
|  5 | ?? ??  |    160 |
+----+--------+--------+

日本語が ? に変換されていた。

発生タイミング

テーブルの中身を目視で確認したとき

どう解決した?

明示的に文字コードを指定。

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
ADD ./my.cnf /etc/mysql/my.cnf

mysql> select id, name, height from idol limit 5;
+----+------------------+--------+
| id | name             | height |
+----+------------------+--------+
|  1 | 櫻木 真乃        |    155 |
|  2 | 八宮 めぐる      |    157 |
|  3 | 風野 灯織        |    154 |
|  4 | 月岡 恋鐘        |    165 |
|  5 | 幽谷 霧子        |    160 |
+----+------------------+--------+

参考