文字コードについて調べる機会があったので、自分なりに参考にさせていただいた記事を備忘録も兼ねまとめたいと思います。
#調べるきっかけ
今まで開発する中で、文字コードについて曖昧な理解だったのもあり、文字コードの設定やMySQLの照合順序で違いがあることに気づきました。
#文字コードについて
文字コードとは、コンピュータ上で文字を扱うために個々の文字、記号に割り当てられた固有の番号のことです。コンピューターはデータを数値でしか扱えないため、文字も数値で扱わなければならなく、そのため、文字を表示するには文字コードが必要となります。
文字コードは、2つの要素で構成されています。それが、文字集合
と符号化方式
です。
##(符号化)文字集合、(文字)符号化方式
-
文字集合
文字をその要素(元)とする集合体のことである。文字セットという場合もある。 -
符号化方式
文字集合で文字に対応付けた非負整数値を実際にコンピュータで利用できるデータ列に変換する符号化方式のことをいう。
###参考記事
※下記リンクの図がイメージしやすいです
・文字コードとは?~UTF-8はパソコンの世界共通語~|データ分析用語を解説
文字コードの種類
-
ASCIIコード
最も基礎となる文字コード。下記の表のようにキーボード上にある「数字」、「アルファベット」、「記号」を1バイトで表現します。これらの文字の他に、赤字で記載している改行コード(LF、CR)やタブ文字(HT)、制御コードのNULLやBSなどもあります。 -
Unicodeの文字符号化形式
Windows、Java、XMLなどで用いられている文字コード。以下、Unicodeの文字符号化方式。 -
UTF-8
ISO/IEC 10646 (UCS) とUnicodeで使える8ビット符号単位の文字符号化形式及び文字符号化スキーム。UTF-8は、データ交換方式・ファイル形式として一般的に使われる傾向にある。ASCIIコードとの互換性が高い。(ASCIIで定義している文字を、Unicodeでそのまま使用することを目的として制定している。) -
UTF-16
UnicodeおよびISO/IEC 10646の、符号化形式および符号化スキーム(文字符号化方式を参照)のひとつである。Windows XPなど多くのOSで、内部表現に使われている。 -
UTF-32
Unicodeの各符号位置に32ビット符号単位一つだけを使う、固定長のUnicodeの符号化形式及び符号化スキーム(文字符号化方式#文字符号化形式と文字符号化スキーム)である。UTF-32は、テキストファイルで使用されることは少なく、主にシステムのメモリ上での管理や、符号位置の数で管理するデータベースなどで使用される。 -
JISの文字符号化形式
日本語を表現する文字コードのひとつ。パソコンで日本語を扱うための文字コードの一種です。電子メールで日本語を表記する際の標準的な文字コードです。 -
Shift-JIS
ASCIIコードの文字に加え、日本語の文字を加えたのが、Shift-JISです。ASCIIコードの文字に日本語の文字を加えた物です。Windows、Macでも採用しており、PC上のファイルで広く用いられています。ASCIIコードとの互換性が高い。 -
EUC
UNIX上で日本語の文字を扱う場合にもっとも多く利用されている文字コード(符号化方式)のひとつである。UNIX以外のOS上で使われることもある。
#MySQLの照合順序について
MySQLは文字コードとソート順を持っていて、ソート順の部分がCollationとよばれている。(文字コードの部分はCharacter Set)文字コードだけでなくてCollationが一致するかどうかを比較する。
###Collationとは
Collationの命名規則は、文字コード_言語名_比較法
となる。
例)utf-8_general_ciの場合
文字コード:utf-8
言語名:general
比較法:ci
となる。
###比較法について
_ci:大文字と小文字が区別されない
_cs:大文字と小文字が区別される
_bin:バイナリ
###参考記事
・【MySQL】照合順序とは?
・MySQLのCollationを理解するためにまとめてみた。
##utf-8_general_ciとutf-8_unicode_ciの違い
-
utf-8_general_ci
mysqlのデフォルトはgeneral_ciになる。
アルファベットの大文字小文字は区別しない。全角半角は区別する。 -
utf-8_unicode_ci
アルファベットの大文字小文字は区別しない。全角半角も区別しない。
さらに濁音、半濁音、ひらがな、カタカナも区別しない。
#Mysqlでの文字コード設定
MySQLには文字列の照合順序(collation)というのがあって、MySQL側でのcharset utf8のときのデフォルトの照合順序はutf8_general_ciになる。
#Railsでの文字コード設定
ActiveRecord::Migrationでは明示的に照合順序を指定しない場合、charset utf8で照合順序utf8_unicode_ciのデータベースを作成になる。
utf-8_unicode_ciからutf-8_genral_ciに変更したい場合は、config/databese.yml
にcharset
とcollation
を指定すればよいとのこと。
development:
adapter: mysql2
encoding: utf8
charset: utf8
collation: utf8_general_ci
database: mojicode_development
#まとめ
utf-8_unicode_ci
は、「ひらがな」「カタカナ」が混在したりと検索が曖昧になってしまうことがあるため、日本語を使用するwebサイトは基本的にutf-8_general_ci
を使用した方が良いとのこと。
読む記事によっては、unicode_ci推奨といったものもあり、少し混乱する部分があると思いますが、どちらを使用するかは用途に応じてといったところでしょうか。
文字コードや照合順序などあまり意識することは、普段少ないかもしれませんが、同じように気になった方の少しでも参考になればと思います。
###あわせて読みたい参考になる記事
・MySQLのencodingをutf8からutfmb4に変更して寿司ビール問題に対応する
・新人さんに知ってほしい「文字コードのお話」