はじめに
Goの開発を始めて今回DBでかなり時間を使ってしまったのでまとめます
またGoと書いてありますが根本的な原因はGoにはなかったのに早くに気づいてなかったので無駄に時間を取られました(それは検索してもみつからないわけだ)
問題
Go(gorm)でレコードインサートをした際に以下のエラーが発生した
incorrect string value
名前に日本語を利用していたためエラーが発生していることはわかっていたがgo mysql incorrect string value
としてもそれらしき記事がまったくヒットしなくて困っていた
解決方法
これはそもそもGoのエラーではなくMySQL
のエラーなのでそちらの対応が必要になる
今回はDockerでMySQLのコンテナをたてていたので日本語(utf-8)を使えるようにするため色々調べた
まずイメージをMysql:5.7を利用していたので以下のmy.cnf
を作成
[mysqld]
character_set_server=utf8
character_set_filesystem=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
init_connect='SET collation_connection = utf8_general_ci'
skip-character-set-client-handshake
そしてdocker-compose.ymlで共有する
db:
image: mysql:5.7
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
env_file:
- .env
container_name: db
ports:
- 3306:3306
これで問題なく日本語のインサートができて、MySQLからの確認もできた
ここでMySQLのイメージが古いことに気づき、MySQL8.0に変更
すると、デフォルトで日本語対応しており、表示の箇所(select * from)などで文字化けする対応をするだけで済みそうだった
最終的には
db:
image: mysql:8.0
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
env_file:
- .env
container_name: db
ports:
- 3306:3306
[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8
で落ち着いた
ちなみに私がはまったのが、コンテナの設定を変えても変更が反映されていない(日本語がインサートできない)というので、原因はコンテナのキャッシュが効いていたことだった。コンテナをdocker-compose down -v
で落としてから立てたら動いた
おわりに
新米Gopherにむけて私の記事がどれも参考になればよいなと思い、これから細かい単位で記事を投稿していきます
参考