0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MySQL 5.7で日本語データを入力できない時の対処法

Posted at

要約

MySQL5.7で日本語データを入力すると以下のエラーが表示された。

1366: Incorrect string value: '\xE4...' for column 'question' at row 1

ぶつかった壁が2つあったのでまとめる。

  1. DB構築の壁(Dockerで構築している場合)
  2. テーブルの壁

前提

  • M2 MacBook Air
  • MySQL 5.7
  • Docker Desktop使用
    docker-composeでMySQL構築(説明サイトがたくさんありますので割愛)

1. DB構築の壁(Dockerで構築している場合)

my.cnfに日本語データ入力するための記述を記載してMySQLを再起動。(説明サイトがたくさんありますので割愛)

my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqldump]
default-character-set=utf8mb4

SHOW VARIABLES LIKE 'chara%';を実行すると一部がlatinになっている。

Variable_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database latin1
character_set_filesystem binary
character_set_results utf8mb4
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

docker-compse.ymlの内容は以下の通り。分かりやすくするため間違いと正解を同時に記載しています。
my.cnfを適当に配置して記述したのが間違い。(./docker-compose.ymlと並列に./conf/my.cnfで配置)

docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    container_name: mysql
    platform: linux/amd64
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${ROOT_PASS}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      TZ: ${TZ}
    ports:
        - ${DB_PORT}:3306
    volumes:
        - db-store:/var/lib/mysql
           - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf    (間違い)
           - ./conf:/etc/mysql/conf.d                (正解)
volumes:
  db-store:

対策

Docker DesktopのTerminalからログイン

Containers > Nameのリンクをクリック > Logs/Inspect/Terminal/Files/Statusの中からTerminal

my.cnfの場所を探す。

sh-4.2# mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 

存在した/etc/my.cnfの中身をチェック

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

docker-compose.ymlのmy.cnfの位置を変更。ディレクトリとファイルを間違えていた。

           - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf    (間違い)
           - ./conf:/etc/mysql/conf.d                (正解)

2. データベースの壁

日本語データ入力をリトライするもエラーメッセージが出る。
SHOW VARIABLES LIKE 'chara%';を実行すると正しく設定されている。

Variable_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

対策

カラムの定義を変更する必要があった。

ALTER TABLE テーブル名 CHANGE 旧カラム名 新カラム名 VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

これでエラーは解消しました。

以上

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?