LoginSignup
1
0

More than 1 year has passed since last update.

Goでレコードを追加する際にincorrect string value

Posted at

はじめに

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を作成

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で共有する

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)などで文字化けする対応をするだけで済みそうだった

最終的には

docker-compose.yml
  db:
    image: mysql:8.0
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    env_file:
      - .env
    container_name: db
    ports:
      - 3306:3306
my.cnf
[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8

で落ち着いた

ちなみに私がはまったのが、コンテナの設定を変えても変更が反映されていない(日本語がインサートできない)というので、原因はコンテナのキャッシュが効いていたことだった。コンテナをdocker-compose down -vで落としてから立てたら動いた

おわりに

新米Gopherにむけて私の記事がどれも参考になればよいなと思い、これから細かい単位で記事を投稿していきます

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0