MySQLの文字コード設定は、テーブルやカラムに指定する文字コード設定とクライアントからサーバーに接続する文字コード設定があります。全体を通して整理してまとめました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
1)指定可能な文字コードを確認
mysql> SHOW CHARACTER SET; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | : | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | : | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | +----------+-----------------------------+---------------------+--------+ 36 rows in set (0.00 sec)
各文字コード毎にデフォルトのcollationがあらかじめ定義されています。
2)UTF8で設定可能な照合順序
mysql> show collation like 'utf8%'; +--------------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------------+---------+-----+---------+----------+---------+ | utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 8 | | utf8_icelandic_ci | utf8 | 193 | | Yes | 8 | | utf8_latvian_ci | utf8 | 194 | | Yes | 8 | | utf8_romanian_ci | utf8 | 195 | | Yes | 8 | | utf8_slovenian_ci | utf8 | 196 | | Yes | 8 | | utf8_polish_ci | utf8 | 197 | | Yes | 8 | | utf8_estonian_ci | utf8 | 198 | | Yes | 8 | | utf8_spanish_ci | utf8 | 199 | | Yes | 8 | | utf8_swedish_ci | utf8 | 200 | | Yes | 8 | | utf8_turkish_ci | utf8 | 201 | | Yes | 8 | | utf8_czech_ci | utf8 | 202 | | Yes | 8 | | utf8_danish_ci | utf8 | 203 | | Yes | 8 | | utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 | | utf8_slovak_ci | utf8 | 205 | | Yes | 8 | | utf8_spanish2_ci | utf8 | 206 | | Yes | 8 | | utf8_roman_ci | utf8 | 207 | | Yes | 8 | | utf8_persian_ci | utf8 | 208 | | Yes | 8 | | utf8_esperanto_ci | utf8 | 209 | | Yes | 8 | | utf8_hungarian_ci | utf8 | 210 | | Yes | 8 | | utf8_general_mysql500_ci | utf8 | 223 | | Yes | 1 | +--------------------------+---------+-----+---------+----------+---------+ 22 rows in set (0.00 sec)
デフォルトは、utf8_general_ciです。WordPressのテーブルのデフォルト設定では、utf8_unicode_ciに設定されていました。
1)サーバー単位の文字コード設定
・サーバー単位に文字コードと照合順序を設定できる。
・設定していない場合のデフォルトはlatin1。
・サーバー開始時のコマンドのオプションまたはオプションファイルで指定出来る。
・サーバー単位の文字コード設定は、データベース作成時に文字コードを指定しなかった場合にデータベースの文字コードとして設定されるだけで、それ以外には意味を持たない。
・サーバー単位の文字コード設定は、サーバー開始時に変更できる。
①サーバー開始のコマンドでの設定例
shell> mysqld --character-set-server=utf8 \ --collation-server=utf8_unicode_ci
②オプションファイルでの設定例
〇/etc/my.cnf
[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
※Linux環境のMySQLオプションファイルの読込順
/etc/my.cnf Global options /etc/mysql/my.cnf Global options (as of MySQL 5.1.15) SYSCONFDIR/my.cnf Global options $MYSQL_HOME/my.cnf Server-specific options defaults-extra-file The file specified with --defaults-extra-file=path, if any ~/.my.cnf User-specific options
2)データベース単位の設定
・データベース単位に文字コードを設定できる。
・データベース作成時に文字コードを指定
CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;
・既存のデータベースを変更する場合
ALTER DATABASE db_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;
・データベース作成時に文字コードを指定しなかった場合は、サーバー単位の設定が適用される。
・データベース単位の文字コード設定は、テーブル作成時に文字コードを指定しなかった場合に、そのテーブルの文字コードに指定される。
さらに”LOAD DATA INFILE”実行時にもこのデータベース単位の文字コード設定が使用される。
上記以外にはこのデータベース単位の文字コード設定は意味を持たない。
3)テーブル単位の設定
・すべてのテーブルは、テーブル単位の文字コード設定を持つ。
・テーブル定義文
CREATE TABLE tbl_name (column_list) [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]]
・テーブル定義変更文
ALTER TABLE tbl_name [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
・明示的に指定しなかった場合は、データベース単位の文字コード設定が適用される。
・各カラムの定義に文字コードが指定されていない場合は、このテーブル単位の文字コードが適用される。
4)カラム単位の設定
・CHAR, VARCHAR, TEXTのタイプのカラムでは、カラム単位に文字コードを指定出来る。
col_name {CHAR | VARCHAR | TEXT} (col_length) [CHARACTER SET charset_name] [COLLATE collation_name]
・カラム単位に文字コードが指定されていなかった場合は、テーブル単位の文字コード設定が適用される。
①character_set_client
・クライアントから送られたクエリーの文字コード
②character_set_connection、collation_connection
・サーバーがクライアントから受け取ったクエリーをどの文字コードに変換して処理するか?
③character_set_results
・サーバーが処理した結果をどの文字コードでクライアントに送り返すか?
●上記3つのデフォルト値
①何も指定しない場合
特にサーバー接続時に明示的に指定していない場合は、コンパイル時のデフォルトであるlatin1に設定される。
②–default-character-set
mysqlコマンドでサーバー接続時に–default-character-setオプションを指定するとこの文字コードに設定される。
例)mysql -u user -p –default-character-set=utf8
mysql> show variables like 'character_set%'; +--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
③/etc/my.cnfファイルに設定
[mysql]
default-character-set=utf8
●実行例
テーブルの文字コード設定がutf8の場合
1)クライアントのTeraTermの文字設定がutf8の場合
①クエリーに日本語を含まない場合(クライアントから日本語情報を送信しない場合)
少なくてもcharacter_set_resultsをutf8にしないとクエリーの結果が文字化けします。
mysql> show variables like 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ mysql> select name from markers limit 3; +-----------+ | name | +-----------+ | Name | | ?????? | | ????????? | +-----------+ mysql> SET character_set_results = utf8; mysql> select name from markers limit 3; +-----------------------------+ | name | +-----------------------------+ | Name | | おとめ山公園 | | 薬王院 ボタンの花 | +-----------------------------+
②クエリーに日本語情報を含む場合
character_set_client、character_set_connectionもutf8にしないとクライアントが送信した日本語を認識できず、正しくクエリーが実行されません
mysql> select name from markers where name like "%公園" limit 3; Empty set (0.01 sec) mysql> SET character_set_client = utf8; mysql> SET character_set_connection = utf8; mysql> select name from markers where name like "%公園" limit 3; +--------------------+ | name | +--------------------+ | おとめ山公園 | | 哲学堂公園 | | 甘泉園公園 | +--------------------+
2)クライアントのTeraTermの文字設定がsjisの場合
①クエリーに日本語を含まない場合(クライアントから日本語情報を送信しない場合)
少なくてもcharacter_set_resultsをsjisにしないとクエリーの結果が文字化けします。
mysql> show variables like 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ mysql> SET character_set_results = sjis; mysql> select name from markers limit 3; +--------------------+ | name | +--------------------+ | Name | | おとめ山公園 | | 薬王院 ボタンの花 | +--------------------+
②クエリーに日本語情報を含む場合
character_set_clientをsjis、character_set_connectionもutf8(テーブルの文字コードはutf8のため)にしないとクライアントが送信した日本語を認識できず、正しくクエリーが実行されません
mysql> select name from markers where name like "%公園" limit 3; Empty set (0.01 sec) mysql> SET character_set_client = sjis; mysql> select name from markers where name like "%公園" limit 3; Empty set (0.00 sec) mysql> SET character_set_connection = utf8; mysql> select name from markers where name like "%公園" limit 3; +--------------+ | name | +--------------+ | おとめ山公園 | | 哲学堂公園 | | 甘泉園公園 | +--------------+ mysql> show variables like 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | sjis | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | sjis | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
-
インストール、基本設定、文字コード、仕組み
- MySQLのインストール
- CentOS6でMySQL5.1からMySQL5.7へアップデートする手順、注意点
- CentOS6.10でMySQL5.7からMySQL8へアップデートする手順、注意点
- MySQLサーバーの起動スクリプト(v5.1)
- MySQLのファイルシステムとストレージエンジンの概要
- MySQLのデータ型の概要
- MySQLのサーバー、データベース、テーブル、カラムの文字コード設定とクライアントからのサーバー接続時の文字コード設定
- MySQLの”LOAD DATA INFILE”などでCSVファイル入出力時の文字コード、権限などの注意点
- セキュリティを考慮し、MySQLの匿名ユーザーにパスワードを設定、または削除
- CentOS6にphpMyAdminを導入
- MySQLのbツリーインデックスの概要とマルチカラムインデックス
- MySQLのプレフィックスインデックス、FULLTEXTインデックスの概要
- MySQLのEXPLAINの実行例
- MySQLのインデックス結合の概要
- MySQLのSelect文でインデックスのカラムのみ取得する場合のメリット
- MySQLのORDER BY句でインデックスを使用
- MySQLのPACK_KEYSオプション
- MySQLのインデックス統計更新の概要
- MySQL初期設定確認
- mysqladminコマンドでMySQLサーバーの状態確認
- mysqlshowコマンドで簡単にデータベース、テーブル定義の確認
- awkを使ってmysqlshowの必要な列のみ表示
- MySQLのスロークエリログの概要と表示方法
- show profileでクエリーの内部処理時間を調査
- MySQL Benchmark Suiteによるパフォーマンス測定
- MySQLの診断、監視に利用できる外部ツール
- WordPressデータベースのバックアップとリストア
- Bashスクリプトでmysqldumpバックアップと世代管理
- MySQLの壊れたテーブルのチェック、修復方法
- MySQLのインデックス統計更新の概要
- MySQLのフラグメンテーションの概要と改善方法
- MySQLのスレッド、コネクションに関する設定値、チューニング
- MySQLのセッション単位に設定するバッファーサイズ
- MySQLのクエリキャッシュの設定値、パフォーマンス
- MySQLのテーブルオープン、クローズとテーブルキャッシュのチューニング
- MyISAMキーキャッシュの概要とチューニング
- MySQLのソートに関する設定値とステータス
- MySQL innoDBの性能関連の設定値とステータス確認
- MySQL MyISAMの性能関連の設定値とステータス確認
インデックス
状態確認、調査
バックアップ、リストア、メンテナンス
パフォーマンス、チューニング