Buravo46's Note

学んだ事を書いていくブログです。

【MySQL】MySQLの文字コード設定

経緯

MySQLでデータベースを扱っていたら、 テーブル内の日本語文字データが文字化けしてしまいました。 文字化けが起こるのは大体文字コードが原因です。 なので、MySQL文字コードを設定して データベースで日本語を扱えるようにしようと思いました。

環境

OS : Windows7 32bit

XAMPP : XAMPP Version 5.5.24

MySQL : MySQL Server version 5.6.24

概要

MySQL文字コードUTF-8に設定する方法です。 MySQLの設定ファイル「my.ini」もしくは「my.cnf」に クライアント側とサーバー側の文字コードを設定することで解決します。 手順としては文字化けの確認、文字コード設定、文字化け修正の確認といった流れです。

目次

文字化けの確認

まずは文字化けの確認を行ないます。 確認には下記手順を行ないます。

  1. XAMPP Control Panelからコマンドプロンプトを起動
  2. MySQLの接続
  3. MySQL文字コード設定を確認
  4. データベースの作成
  5. データベースの文字コードを確認
  6. テーブルの作成
  7. データの追加
  8. データの表示

1.XAMPP Control Panelからコマンドプロンプトを起動

XAMPPControlPanelからコマンドプロンプトを起動すると、 環境変数の設定をしなくてもMySQLのコマンドが入力できて 簡単なので此処から起動します。

f:id:buravo46:20150524013222p:plain

上の画像でマウスポインタが指しているShellボタンを クリックすることでコマンドプロンプトが開きます。

2.MySQLの接続

起動したコマンドプロンプトmysqlコマンドを使用してMySQLへの接続を行ないます。 mysqlコマンドでは下記のオプションが設定できます。

  • -u : 接続するユーザ名
  • -D : 接続するデータベース名
  • -p : 接続するユーザのパスワード

mysql -u ユーザ名 -pと入力するとパスワードが求められます。 このパスワードを入力して、内容が正しければMySQLへ接続できます。 データベースが既に存在していて接続したい場合は、 mysql -u ユーザ名 -D データベース名 -pと入力して、 次に求められるパスワードの入力をすることで接続できます。 今回は指定のデータベースが存在しないので、 ユーザ名とパスワーくドのオプションのみで接続します。

MySQLに接続したい場合

例:mysql -u ユーザ名 -p

データベースが既に存在していて接続したい場合

例:mysql -u ユーザ名 -D データベース名 -p

f:id:buravo46:20150524013259p:plain

上の画像では

mysql -u root -p

と入力して、次に求められるパスワードも入力することでMySQLに接続しています。

3.MySQL文字コード設定を確認

文字コードの設定を確認するにはSHOW VARIABLES構文LIKE節を使用します。 SHOW VARIABLES構文MySQLのシステム変数の値を表示できます。 LIKE節はパターンと一致する名前を持つ変数の行のみを表示できます。 また、LIKE節で名前がパターンと一致する変数のリストを得るには、 LIKE節内の「%」ワイルドカード文字を使用する必要があります。 上記を組み合わせて、文字コードを設定しているシステム変数一覧を表示します。

パターンと一致する名前を持つ変数を表示したい場合

例:show variables like '表示したいシステム変数名';

名前がパターンと一致する変数のリストを表示したい場合

例:show variables like '表示したいシステム変数名の一部%';

f:id:buravo46:20150524013328p:plain

上の画像では、

show variables like 'char%';

と入力して、設定している文字コード変数の一覧を表示して確認しています。 このcharacter_set_filesystemcharacter_set_dir以外を utf8にすることで日本語文字が扱えます。

4.データベースの作成

データベースの作成にはCREATE DATABASE構文を使用します。 この構文ではデータベース名、データベースの文字セット、データベースの照合を 指定して作成することができます。今回はデータベース名のみを指定して作成します。

データベース名のみを指定して作成する場合

例:create database データベース名;

f:id:buravo46:20150524013414p:plain

上の画像では

create database sample_db_latin1;

と入力してデータベースを作成しています。

5.データベースの文字コードを確認

データベースの文字コードを確認するためには、SHOW CREATE DATABASE 構文を使用します。 この構文は与えられたデータベースを作成するCREATE DATABASEステートメントを表示します。 ステートメントとは構文内容とパラメータのことだと思います。 なので、ここではCREATE DATABASE構文の内容とパラメータが表示されます。

データベースの文字コードを確認する場合

例:show create database データベース名;

f:id:buravo46:20150524013509p:plain

上の画像では

show create database sample_db_latin1;

と入力して、作成したデータベースのステートメントを確認しています。 このデータベースではデフォルトでlatian1文字コードがセットされています。

6.テーブルの作成

テーブルを作成するには、CREATE TABLE構文を使用します。 この構文はデータベース名、テーブル名、カラム名、データタイプを指定することで、 指定したデータベース又は現在使用しているデータベース内にテーブルを作成することができます。 データベース名を指定せずにテーブルを作成する場合は、USE構文を使用して 指定したデータベースをデフォルトのデータベースとして選択することで省略することもできます。 他にも指定できることはありますが、今回はデータベース名、テーブル名、カラム名、データタイプのみを指定して作成します。

データベース名、テーブル名、カラム名、データタイプを指定してテーブルを作成する場合

例:create table データベース名.テーブル名 ( カラム名 データタイプ名, カラム名 データタイプ名 ...);

データベース名を省略してテーブルを作成する場合

例:

use データベース名;

create table テーブル名 ( カラム名 データタイプ名, カラム名 データタイプ名 ...);

f:id:buravo46:20150524013444p:plain

上の画像では

create table sample_db_latin1.sample_tb (id int, name varchar(10));

と入力して指定したデータベース内にIDと名前を格納できるテーブルを作成しています。

7.データの追加

テーブルへデータの追加をするには、INSERT構文を使用します。 この構文はデータベース名、テーブル名、カラム名、追加するデータを指定することで 指定したデータベース内の指定したテーブルにデータを追加することができます。 カラム名は省略することが可能です。今回は省略した形でデータの追加をします。

データベース名、テーブル名、カラム名、追加するデータを指定して追加する場合

例:insert into データベース名.テーブル名 (カラム名, カラム名, ...) values (データ, データ, ...);

カラム名を省略して追加する場合

例:insert into データベース名.テーブル values (データ), (データ), ...;

f:id:buravo46:20150524013527p:plain

上の画像では

insert into sample_db_latin1.sample_tb values (0, '扶桑'), (1, '山城');

と入力してテーブルにIDと名前のデータを追加しています。

8.データの表示

データを表示するには、SELECT構文を使用します。 この構文は検索したいカラム名、データベース名、テーブル名を指定することで、 検索したカラムの情報を表示することができます。検索したいカラム名複数の指定や 全て指定することもできます。今回は全てのカラムを検索しています。

1つのカラム名を検索して表示する場合

例:select カラム名 from データベース名.テーブル名;

複数カラム名を検索して表示する場合

例:select カラム名, カラム名 from データベース名.テーブル名;

全てのカラム名を検索して表示する場合

例:select * from データベース名.テーブル名;

f:id:buravo46:20150524013546p:plain

上の画像では

select * from sample_db_latin1.sample_tb;

と入力して全てのカラムの情報を表示しています。 これで文字化けしているのが確認できました。

文字コードの設定

次は文字コードの設定と確認を行ないます。 設定と確認には下記手順を行ないます。

  1. MySQLの設定ファイルにクライアント側とサーバー側の文字コードを設定
  2. MySQLの再起動
  3. MySQL文字コード設定を確認
  4. データベースの作成
  5. データベースの文字コードを確認
  6. テーブルの作成
  7. データの追加
  8. データの表示

1.MySQLの設定ファイルにクライアント側とサーバー側の文字コードを設定

ここではMySQLの設定ファイルのWindowsであれば「my.ini」 またはMacやLinaxであれば「my.cnf」に クライアント側とサーバー側の文字コードを設定します。 MySQLの設定ファイルはXAMPPControlPanelのMySQLのConginボタンから開くことができます。 全てのクライアントが利用するオプションの設定箇所である[client]MySQLコマンドラインツールが参照するオプションの設定箇所である[mysql]には default-character-set = utf8と書き込むことでクライアント側の文字コード設定ができます。 また、MySQLサーバに関するオプションの設定箇所である[mysqld]には character-set-server=utf8と書き込むことでサーバー側の文字コード設定ができます。

MySQLの設定ファイルの開き方

f:id:buravo46:20150524013610p:plain

MySQLの設定ファイル「my.ini」

# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.
#
# You can copy this file to
# C:/xampp/mysql/bin/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is C:/xampp/mysql/data) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client]
# password       = your_password
port            = 3306
socket          = "C:/xampp/mysql/mysql.sock"
default-character-set = utf8

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql"
tmpdir = "C:/xampp/tmp"
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"
# enable-named-pipe
key_buffer = 16M
max_allowed_packet = 16M
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"
character-set-server=utf8

# Change here for bind listening
# bind-address="127.0.0.1"
# bind-address = ::1          # for ipv6

# Where do all the plugins live
plugin_dir = "C:/xampp/mysql/lib/plugin/"

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
# commented in by lampp security
#skip-networking
skip-federated

# Replication Master Server (default)
# binary logging is required for replication
# log-bin deactivated by default since XAMPP 1.4.11
#log-bin=mysql-bin

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id   = 1

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#    the syntax is:
#
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
#    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
#
#    where you replace <host>, <user>, <password> by quoted strings and
#    <port> by the master's port number (3306 by default).
#
#    Example:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
#    start replication for the first time (even unsuccessfully, for example
#    if you mistyped the password in master-password and the slave fails to
#    connect), the slave will create a master.info file, and any later
#    change in this file to the variables' values below will be ignored and
#    overridden by the content of the master.info file, unless you shutdown
#    the slave server, delete master.info and restart the slaver server.
#    For that reason, you may want to leave the lines below untouched
#    (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id       = 2
#
# The replication master for this slave - required
#master-host     =   <hostname>
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user     =   <username>
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =   <password>
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port     =  <port>
#
# binary logging - not required for slaves, but recommended
#log-bin=mysql-bin


# Point the following paths to different dedicated disks
#tmpdir = "C:/xampp/tmp"
#log-update = /path-to-dedicated-directory/hostname

# Uncomment the following if you are using BDB tables
#bdb_cache_size = 4M
#bdb_max_lock = 10000

# Comment the following if you are using InnoDB tables
#skip-innodb
innodb_data_home_dir = "C:/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "C:/xampp/mysql/data"
#innodb_log_arch_dir = "C:/xampp/mysql/data"
## You can set .._buffer_pool_size up to 50 - 80 %
## of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M
## Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

## UTF 8 Settings
#init-connect=\'SET NAMES utf8\'
#collation_server=utf8_unicode_ci
#character_set_server=utf8
#skip-character-set-client-handshake
#character_sets-dir="C:/xampp/mysql/share/charsets"

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
default-character-set = utf8

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

2.MySQLの再起動

ここではMySQLの設定を反映させるためにMySQLの再起動をしています。 現在起動しているMySQLをStopボタンで停止させて、 もう一度起動させるためにStartボタンをクリックします。 文字コードの設定が反映されてない時はMySQLの再起動をしているか確認しましょう。

3.MySQL文字コード設定を確認

ここでは、MySQLの文字コード設定を確認します。 内容は文字化けの確認でした3.MySQLの文字コード設定を確認と同じです。

f:id:buravo46:20150524013638p:plain

上の画像では

show variables like 'char%';

と入力して、設定している文字コード変数の一覧を表示して確認しています。 ここではcharacter_set_filesystemcharacter_set_dir以外が utf8になっていることが確認できます。

4.データベースの作成

ここでは、データベースの作成します。 内容は文字化けの確認でした4.データベースの作成とほぼ同じです。 違う事といえば作成するデータベース名をsample_db_uft8にしているぐらいです。 ここで気をつけるべきことは、前回作成したデータベースを使い回さないことです。 前回作成したデータベースの設定されている文字セットには MySQLの設定ファイルに書き込んだ文字コードの設定が反映されないので、 文字セットがlatin1となった状態で文字化けします。

f:id:buravo46:20150524013657p:plain

上の画像では

create database sample_db_utf8;

と入力してデータベースを作成しています。

5.データベースの文字コードを確認

ここでは、データベースの文字コードを確認します。 内容は文字化けの確認でした5.データベースの文字コードを確認とほぼ同じです。 違う事といえば指定するデータベース名をsample_db_uft8にしているぐらいです。

f:id:buravo46:20150524013801p:plain

上の画像では

show create database sample_db_utf8;

と入力して、作成したデータベースのステートメントを確認しています。 このデータベースではデフォルトでutf8文字コードがセットされているのが確認できます。

6.テーブルの作成

ここでは、テーブルの作成します。 内容は文字化けの確認でした6.テーブルの作成とほぼ同じです。 違う事といえば指定するデータベース名をsample_db_uft8にしているぐらいです。

f:id:buravo46:20150524013709p:plain

上の画像では

create table sample_db_utf8.sample_tb (id int, name varchar(10));

と入力して指定したデータベース内にIDと名前を格納できるテーブルを作成しています。

7.データの追加

ここでは、データの追加します。 内容は文字化けの確認でした7.データの追加とほぼ同じです。 違う事といえば指定するデータベース名をsample_db_uft8にしているぐらいです。

f:id:buravo46:20150524013818p:plain

上の画像では

insert into sample_db_utf8.sample_tb values (0, '扶桑'), (1, '山城');

と入力してテーブルにIDと名前のデータを追加しています。

8.データの表示

ここでは、データの表示します。 内容は文字化けの確認でした8.データの表示とほぼ同じです。 違う事といえば指定するデータベース名をsample_db_uft8にしているぐらいです。 これで文字化けが解決されていることを確認できると思います。

f:id:buravo46:20150524013835p:plain

上の画像では

select * from sample_db_utf8.sample_tb;

と入力して全てのカラムの情報を表示しています。 これで文字化けの修正が確認できました。

まとめ

MySQL文字コード設定はMySQLの設定ファイルに クライアント側とサーバー側の文字コード設定を書き込むことで解決しました。 設定が反映されていない場合は、MySQLの再起動をしていない、もしくは データベースの文字セットが違うかを確認してみましょう。

参考サイト

MySQL逆引きリファレンス-コマンドラインからMySQL に接続する

MySQL::MySQL 5.1 リファレンスマニュアル(オンラインヘルプ)::8.5.5.41 SHOW VARIABLES 構文

DBOnline-文字コードの設定

MySQL::MySQL 5.1 リファレンスマニュアル::12.1.6 CREATE DATABASE 構文

MySQL::MySQL 5.1 リファレンスマニュアル::12.5.4.6 SHOW CREATE DATABASE 構文

MySQL逆引きリファレンス-データベースの文字コードを調べる

MySQL::MySQL 5.1 リファレンスマニュアル::12.1.8 CREATE TABLE 構文

MySQL::MySQL 5.1 リファレンスマニュアル::12.3.3 USE 構文

MySQL::MySQL 5.1 リファレンスマニュアル::12.2.4 INSERT 構文

DBOnline-データの追加

MySQL::MySQL 5.1 リファレンスマニュアル::12.2.7 SELECT 構文

DBOnline-現在の設定内容の確認

Unlimited Island-MySQL起動オプション解説