🙆‍♀️

【MySQL】構築するときの注意点

2023/05/11に公開

MySQLのバージョン

[vagrant@localhost ~]$ mysqld -V
mysqld  Ver 5.7.40 for Linux on x86_64 (MySQL Community Server (GPL))
[vagrant@localhost ~]$ mysql -V
mysql  Ver 14.14 Distrib 5.7.40, for Linux (x86_64) using  EditLine wrapper

設定ファイルが色々あるけど、どういうこと?

  • my.iniはwindows用、my.cnfはwindows以外のOS用の設定ファイル
  • windowsでもmy.cnfを使用するが、これはmy.iniがどこにあるかを書くだけ

文字コードを統一する必要がある

文字コードを確認

mysql> SHOW VARIABLES like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

character-set-serverutf8に設定

[mysqld]
character-set-server=utf8

文字コードを確認

mysql> SHOW VARIABLES like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

設定完了かと思い、データベースを選択

use <データベース名>;

character_set_databaselatin1に戻る

mysql> SHOW VARIABLES like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

CHARACTER SETで指定する必要がある

データベース作成時
CREATE DATABASE <データベース名> CHARACTER SET utf8 COLLATE utf8_general_ci;
後で変更する場合
# character_set_databaseの修正
ALTER DATABASE <データベース名> CHARACTER SET utf8 COLLATE utf8_general_ci;
# 既存テーブルの文字コード変換
ALTER TABLE <テーブル名> CONVERT TO character SET utf8 COLLATE utf8_unicode_ci;
# 既存カラムの文字コード変換
ALTER TABLE <テーブル名> CHANGE <カラム名> <カラム名> VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

補足

  • MySQLのバージョン5.7と8では設定が色々違う
  • latin1のDB(テーブル)には日本語が入らない
  • DBの文字集合を変えた場合、クライアントからの接続時にもそれに合わせる
  • SET character_set_database=utf8;は接続中のセッションだけ変更するコマンド
    (再起動すると元に戻るし、再起動は必要なく設定反映される)
  • character_set_databaseとは
    デフォルトデータベースで使用される文字セット
    デフォルトのデータベースが変更されるたびに、サーバーはこの変数を設定します
    デフォルトデータベースが存在しない場合、変数は character_set_server と同じ値になります
    ※デフォルトデータベースとは、USEで選択されているデータベースを指す
  • character_set_serverとは
    サーバーのデフォルト文字セット

Discussion