文字コードはプログラミングをしていく上で様々な障壁となることがあります。
恐らくプログラミングの学習をしている方にとっては、文字化け問題などは致命的な悩みとなった経験もあるのではないでしょうか?
この文字コードはクライアント側とサーバー側でそれぞれ違うため、度々エラーを引き起こすトリガーとなるケースもあります。
今回はそんな文字コードについて解説していきたいと思います。
文字コードとは
文字コードとは、大雑把に言うとコンピューター内で処理するための文字に一定の法則に則って振り分けをしてあるものと思ってください。
例えば、「a」なら1番、「b」なら2番…といった感じです(もちろん1番や2番という番号振り分けではありませんが…)。
この振り分けを基にコンピューター内でどのような命令かを認識し処理を行っているというわけです。
様々な文字コードが存在する背景
これは世界中で使われている言語の違いに対応するためという認識でほぼ間違いありません。
例えば、文字コードが開発された当初はASCIIという1バイトコードのみでした。
アメリカではこのASCIIが標準化されましたが、当然漢字などには対応していません。
漢字やひらがなに対応するには2バイトのコードが必要です。
そこで開発されたのが2バイトコードです。
1バイトでは最大で256文字までしか対応できないのに対し、2バイトは最大で65,536文字まで対応することができます。
しかし今まで使っていた1バイトコードで構築されたスクリプトも使える状態で2バイトコードも使えるようにするためには、混合型の文字コードが必要となります。
またこの問題が解決できても、次は国別、地域別に文字コードをまとめて国際的な統一コードを作ろうという試みも始まり、こういったことが重なった結果、現在のように文字コードが乱立し複雑化したわけです。
文字コードの設定
さて、ここからがいよいよ本題です。
MySQLサーバーの文字コードとクライアントサイドの文字コードはそれぞれで変更する必要があります。
この変更を行うにあたり、”my.ini”というファイルの中身を変更します。
※サーバー側の設定であれば、この方法以外にも”phpMyAdmin”と呼ばれる管理画面より設定することができます。
“my.ini”はテキストで構成されたファイルとなっており、中には様々な設定が構成されているので変更箇所以外を消したりしないように注意してください。
またmy.iniはMySQLのバージョンやDBの種類によって若干内容が異なってきますので、必ずしも今から説明を行う通りとは限りませんが、概ね方法は一緒だと思ってください。
ではまず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:/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:/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:/mysql/mysql.sock”
# Here follows entries for some specific programs
# The MySQL server
default-character-set=utf8
[mysqld]
port=3306
socket=”C:/mysql/mysql.sock”
basedir=”C:/mysql”
tmpdir=”C:/tmp”
これはmy.iniを一部抜粋したものになりますが、このようにテキストのみで構成されています。
この中で文字コードの設定に関係のある個所は以下の部分となっています。
- クライアントサイドの設定:[client]と書かれている箇所より下の行
- サーバー再度の設定:[mysqld]と書かれている箇所より下の行
また文字コードの設定は、クライアント側は”default-character-set”、サーバー側は”character-set-server”となっている部分です。
もしこの設定部分が無いようであれば、それぞれの項目を追加記述することで設定を変更することができます。
文字コードの確認
では実際にご自分が現在使用しているサーバーにどのような文字コードが使用されているのかを確認してみましょう。
コマンドラインで以下のコマンドを実行してください。
MariaDB [(none)]> show variables like "chara%";
このコマンドを実行すると以下のような一覧が表示されると思います。
+--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | C:\mysql\share\charsets\ | +--------------------------+--------------------------------+ 8 rows in set (0.001 sec)
character_set_client:クライアント側で発行したsql文に使用される文字コード
character_set_connection:クライアントから受け取った文字を変換するときに使用される文字コード
character_set_database:DBの文字コード
character_set_results:クライアントへ送信する検索結果に使用される文字コード
character_set_server:DB作成時に設定されるデフォルト文字コード
character_set_system:システムに使用される文字セット。基本的にこの部分は常にutf8
通常は上記説明箇所の全てを”utf8″にしておけば問題ありません。
DBやクライアントでの認識の際に意図しない文字コードが使用されていて文字化けが起こってしまう場合には、まずこのようにデータベースを全て確認し、間違って設定されている箇所を探し出してください。
また設定ミスに気付くタイミングが遅れれば遅れるほど、後々面倒なことになりますので、DBを作成した際には必ず最初にチェックをするように癖づけておきましょう。
“DB DROP”と”DB CREATE”を使えばDBの作り替えは簡単にできますので、そちらも併せて覚えておいてください。
まとめ
いかがでしたか?
今回は文字コードについて複雑化した背景や設定方法、確認方法などについて解説してみました。
意図しない文字コードのままプログラミングを進めてしまうと、プログラムを正しく認識できないためコンパイルした際にエラーとなります。
初期段階で設定を確認することでこういったトラブルは確実に回避できますので、常に確認を怠らないようにしましょう。