ちゃなべの備忘録

ほぼ備忘録です。

MySQLを使っているアプリで日本語を保存できるように【備忘録】

はじめに

こちらでアプリをアップしました。

dockerを安くデプロイしたい【備忘録】【読みづらい】 - Qiita

そのアプリがDBに日本語の登録ができません。 そこの設定周りをやっていこうと思います。

前提イメージ

まずlocalでも登録できなかったし、本番環境でも登録できなかった。 local → 本番 の順番で実装していく。 んで、おそらくMySQLの設定が悪い。詳しくはlogを見てみないとだけど。

実装

開発環境

まずはdockerを起動して、みてみる。 日本語を登録しようとすると、サーバー側でエラーがでた。

server  | (/usr/local/src/main.go:77)
server  | [2023-03-05 08:10:36]  Error 1366: Incorrect string value: '\xE3\x81\x84\xE3\x81\xA3...' for column 'name' at row 1

これは指定の行を見てみるとGORMでデータを送信しようとしている時だ。

逆に日本語の登録がDBに直接できないかやってみた。すると同様のエラーがでた。

MySQLに直接日本語を入れてみようとした結果

あーーじゃあMySQLの設定っぽいな。

これの設定をまんまやってみるか。

qiita.com

この設定でやってみた。 docker でdebianを指定したら、apt-getがないって言われないよ。

# 認証周りでエラーが起こったので、versionを5.7に
# TODO: いつかmysql:8.0に
FROM mysql:5.7-debian

RUN apt-get update
RUN apt-get -y install locales-all

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

COPY my.cnf /etc/mysql/my.cnf

お、問題なく立ち上がっているっぽい...?

mysqlにログインして、設定を見てみると、

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | utf8                       |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.10 sec)

よいね!ちゃんとutf8になってる。 DBにデータをぶち込んでみる。

MySQLに直接日本語を入れてみようとした結果(after)

はいった!じゃあアプリケーションからやってみる。

アプリの店舗一覧ページのテスト

でーけた!

本番環境

ということは同じような設定を本番環境ですれば良いな。

...って思ったけどやっているっぽい?

https://qiita.com/ayumu-1212/items/47c7ff72dd280c11a57a#mysql%E3%81%AE%E8%A8%AD%E5%AE%9A

え、じゃあ本番環境で日本語の入力をしてみる。

本番環境の日本語設定

いやできるんかい!!w じゃあ終わり!