SlideShare a Scribd company logo
MySQLの文字コード事情 Powered by Rabbit 2.1.9
MySQLの文字コード事情
OSC群馬2016
とみたまさひろ
日本MySQLユーザ会
2016-05-14
MySQLの文字コード事情 Powered by Rabbit 2.1.9
自己紹介
とみた まさひろ
http://tmtms.hatenablog.com
http://twitter.com/tmtms
https://github.com/tmtm
長野県北部在住プログラマー( Ruby & C )
長野ソフトウェア技術者グループ(NSEG)
日本MySQLユーザ会代表
MySQLの文字コード事情 Powered by Rabbit 2.1.9
MySQLの文字コード(charset)
MySQLの文字コード事情 Powered by Rabbit 2.1.9
日本語が使えるのは
ujis, sjis, eucjp, cp932, utf8,
utf8mb4
MySQLの文字コード事情 Powered by Rabbit 2.1.9
今から始めるなら utf8mb4 一択
MySQLの文字コード事情 Powered by Rabbit 2.1.9
MySQL Charset
文字集合\エンコーディング
EUC シフトJIS UTF-8
JIS ujis sjis ―
Windows-
31J
eucjp cp932 ―
Unicode ― ― utf8
utf8mb4
MySQLの文字コード事情 Powered by Rabbit 2.1.9
文字集合
JIS
日本語+α (JIS X 0201, JIS X 0208, (JIS X 0212))
Windows-31J
JIS + NEC特殊文字 + IBM拡張文字(「①」「㈱」「髙」等
)
Unicode
世界中の文字。絵文字(「🍺」「🍣」等)も含む
MySQLの文字コード事情 Powered by Rabbit 2.1.9
エンコーディング
EUC
1〜3バイト。その昔UNIX系OSで日本語を扱うのに使わ
れていた
シフトJIS
1〜2バイト。Windowsで使われている
UTF-8
1〜4バイト。UnicodeのエンコーディングのうちASCII
互換
MySQLの文字コード事情 Powered by Rabbit 2.1.9
ユニコード
世界中のすべての文字を扱える
絵文字も使える
世の中もう普通にユニコード
文字コード変換とか考えなくていい
文字化けしない
MySQLの文字コード事情 Powered by Rabbit 2.1.9
MySQL Charset (再掲)
文字集合\エンコーディング
EUC シフトJIS UTF-8
JIS ujis sjis ―
Windows-
31J
eucjp cp932 ―
Unicode ― ― utf8
utf8mb4
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8 or utf8mb4 ?
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8 と utf8mb4
utf8: 1文字 1〜3バイト (U+0000〜U+FFFF)
utf8mb4: 1文字 1〜4バイト
(U+0000〜U+1FFFFF)
UTF-8 は普通1〜4バイト
utf8 / utf8mb4 の違いは MySQL のみ
ほとんどの日本語文字は3バイト
一部の漢字と絵文字等が4バイト
MySQLの文字コード事情 Powered by Rabbit 2.1.9
JIS X 0213 の文字の中で UTF-8 で 4バイトになるもの
𠀋𡈽𡌛𡑮𡢽𠮟𡚴𡸴𣇄𣗄𣜿𣝣𣳾𤟱𥒎𥔎𥝱𥧄𥶡𦫿𦹀𧃴𧚄𨉷𨏍
𪆐𠂉𠂢𠂤𠆢𠈓𠌫𠎁𠍱𠏹𠑊𠔉𠗖𠘨𠝏𠠇𠠺𠢹𠥼𠦝𠫓𠬝𠵅𠷡𠺕
𠹭𠹤𠽟𡈁𡉕𡉻𡉴𡋤𡋗𡋽𡌶𡍄𡏄𡑭𡗗𦰩𡙇𡜆𡝂𡧃𡱖𡴭𡵅𡵸𡵢
𡶡𡶜𡶒𡶷𡷠𡸳𡼞𡽶𡿺𢅻𢌞𢎭𢛳𢡛𢢫𢦏𢪸𢭏𢭐𢭆𢰝𢮦𢰤𢷡𣇃
𣇵𣆶𣍲𣏓𣏒𣏐𣏤𣏕𣏚𣏟𣑊𣑑𣑋𣑥𣓤𣕚𣖔𣘹𣙇𣘸𣘺𣜜𣜌𣝤𣟿
𣟧𣠤𣠽𣪘𣱿𣴀𣵀𣷺𣷹𣷓𣽾𤂖𤄃𤇆𤇾𤎼𤘩𤚥𤢖𤩍𤭖𤭯𤰖𤴔𤸎
𤸷𤹪𤺋𥁊𥁕𥄢𥆩𥇥𥇍𥈞𥉌𥐮𥓙𥖧𥞩𥞴𥧔𥫤𥫣𥫱𥮲𥱋𥱤𥸮𥹖
𥹥𥹢𥻘𥻂𥻨𥼣𥽜𥿠𥿔𦀌𥿻𦀗𦁠𦃭𦉰𦊆𦍌𣴎𦐂𦙾𦚰𦜝𦣝𦣪𦥑
𦥯𦧝𦨞𦩘𦪌𦪷𦱳𦳝𦹥𦾔𦿸𦿶𦿷𧄍𧄹𧏛𧏚𧏾𧐐𧑉𧘕𧘔𧘱𧚓𧜎
𧜣𧝒𧦅𧪄𧮳𧮾𧯇𧲸𧶠𧸐𧾷𨂊𨂻𨊂𨋳𨐌𨑕𨕫𨗈𨗉𨛗𨛺𨥉𨥆𨥫
𨦇𨦈𨦺𨦻𨨞𨨩𨩱𨩃𨪙𨫍𨫤𨫝𨯁𨯯𨴐𨵱𨷻𨸟𨸶𨺉𨻫𨼲𨿸𩊠𩊱
𩒐𩗏𩙿𩛰𩜙𩝐𩣆𩩲𩷛𩸽𩸕𩺊𩹉𩻄𩻩𩻛𩿎𪀯𪀚𪃹𪂂𢈘𪎌𪐷𪗱
𪘂𪘚𪚲
MySQLの文字コード事情 Powered by Rabbit 2.1.9
UTF-8 で4バイトになる絵文字(一部)
🀀🀁🀂🀃🀄🀅🀆🀇🀈🀉🀊🀋🀌🀍🀎🀏🀐🀑🀒🀓🀔🀕🀖🀗🀘🀙🀚🀛🀜🀝🀞
🀟🀠🀡🀢🀣🀤🀥🀦🀧🀨🀩🀪🀫🂠🂡🂢🂣🂤🂥🂦🂧🂨🂩🂪🂫🂬🂭
🂮🂱🂲🂳🂴🂵🂶🂷🂸🂹🂺🂻🂼🂽🂾🂿🃁🃂🃃🃄🃅🃆🃇🃈
🃉🃊🃋🃌🃍🃎🃏🃑🃒🃓🃔🃕🃖🃗🃘🃙🃚🃛🃜🃝🃞🃟🈀🈁
🈂🈐🈑🈒🈓🈔🈕🈖🈗🈘🈙🈚🈛🈜🈝🈞🈟🈠🈡🈢🈣🈤🈥🈦
🈧🈨🈩🈪🈫🈬🈭🈮🈯🈰🈱🈲🈳🈴🈵🈶🈷🈸🈹🈺🉀🉁🉂🉃
🉄🉅🉆🉇🉈🉐🉑🌀🌁🌂🌃🌄🌅🌆🌇🌈🌉🌊🌋🌌🌍🌎🌏🌐
🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜🌝🌞🌟🌠🌡🌢🌣🌤🌥🌦🌧🌨🌩🌪
🌫🌬🌭🌮🌯🌰🌱🌲🌳🌴🌵🌶🌷🌸🌹🌺🌻🌼🌽🌾🌿🍀🍁🍂🍃🍄
🍅🍆🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍔🍕🍖🍗🍘🍙🍚🍛🍜🍝
🍞🍟🍠🍡🍢🍣🍤🍥🍦🍧🍨🍩🍪🍫🍬🍭🍮🍯🍰🍱🍲🍳🍴🍵🍶🍷
🍸🍹🍺🍻🍼🍽🍾🍿🎀🎁🎂🎃🎄🎅🎆🎇🎈🎉🎊🎋🎌🎍🎎🎏🎐🎑
🎒🎓🎔🎕🎖🎗🎘🎙🎚🎛🎜🎝🎞🎟🎠🎡🎢🎣🎤🎥🎦🎧🎨🎩🎪🎫
🎬🎭🎮🎯🎰🎱🎲🎳🎴🎵🎶🎷🎸🎹🎺🎻🎼🎽🎾🎿🏀🏁🏂🏃🏄🏅
🏆🏇🏈🏉🏊🏋🏌🏍🏎🏏🏐🏑🏒🏓🏔🏕
MySQLの文字コード事情 Powered by Rabbit 2.1.9
(文字とはいったい…)
MySQLの文字コード事情 Powered by Rabbit 2.1.9
MySQLのCharset
サーバー
クライアント
サーバー/クライアント間の接続
データベース毎
テーブル毎
カラム毎
MySQLの文字コード事情 Powered by Rabbit 2.1.9
ハマりたくなければ全部統一
MySQLの文字コード事情 Powered by Rabbit 2.1.9
サーバー Charset
新規作成データベースのCharsetのデフォルト値
これさえ指定しておけばだいたいOK
mysqld の起動オプション
--character-set-server=utf8mb4
my.cnf の [mysqld] セクション
character-set-server = utf8mb4
サーバー変数 character_set_server
MySQLの文字コード事情 Powered by Rabbit 2.1.9
データベース Charset
配下に作成するテーブルのCharsetのデフォルト値
サーバーCharsetが適切に設定されてれば指定しなく
てもいい
作成:
CREATE DATABASE db CHARSET utf8mb4;
確認:
SHOW CREATE DATABASE db;
MySQLの文字コード事情 Powered by Rabbit 2.1.9
データベース Charset
変更:
ALTER DATABASE db CHARSET utf8mb4;
変更しても既存のテーブルCharsetは変更されない
MySQLの文字コード事情 Powered by Rabbit 2.1.9
テーブル Charset
テーブル内カラムのCharsetのデフォルト値
データベースCharsetが適切に設定されてれば指定す
る必要はない
作成:
CREATE TABLE tbl (...) CHARSET utf8mb4;
確認:
SHOW CREATE TABLE tbl;
MySQLの文字コード事情 Powered by Rabbit 2.1.9
テーブル Charset
テーブル属性だけ変更:
ALTER TABLE tbl CHARSET utf8mb4;
属性だけ変更しても既存のカラムは変更されない
全カラムとデータの変換:
ALTER TABLE tbl CONVERT TO CHARSET utf8mb4;
MySQLの文字コード事情 Powered by Rabbit 2.1.9
カラム Charset
テーブルCharsetが適切に設定されてれば指定する必
要はない
作成:
CREATE TABLE tbl (col VARCHAR(10) CHARSET
utf8mb4, ...);
確認:
SHOW CREATE TABLE tbl;
MySQLの文字コード事情 Powered by Rabbit 2.1.9
カラム Charset
変更:
ALTER TABLE tbl MODIFY col VARCHAR(10) CHARSET
utf8mb4;
変更するとカラム内のデータも変換される
MySQLの文字コード事情 Powered by Rabbit 2.1.9
クライアント Charset
クライアント内での文字列処理と
サーバーとの接続Charsetに使用される
指定方法はプログラム/言語に依存
mysql --default-character-set=utf8mb4
プログラムによっては my.cnf の [client] セクション
が有効
[client]
default-character-set = utf8mb4
MySQLの文字コード事情 Powered by Rabbit 2.1.9
クライアント Charset
mysqld との接続毎に異なる
mysql コマンドでOKでも他のアプリからはNGかもし
れない
何も指定しなければ latin1
MySQLの文字コード事情 Powered by Rabbit 2.1.9
Charset の確認
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
MySQLの文字コード事情 Powered by Rabbit 2.1.9
mysql コマンド
mysql コマンドのデフォルトCharsetは auto
システムロケール(LC_ALL, LC_CTYPE, LANG 環境変
数等)により値が決定
LANG=ja_JP.UTF-8 の場合は utf8 になる
utf8mb4 ではない
LANG=C の場合は latin1 になる
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8 と utf8mb4 の混在で起きること
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8接続から4バイト文字を参照
クライアントが扱えない文字は「?」になる
mysql> SELECT str FROM tbl;
+-------+
| str |
+-------+
| ?と? | ← '🍣と🍺'
| ?と? | ← '?と?'
+-------+
MySQLの文字コード事情 Powered by Rabbit 2.1.9
バイトコードを見れば違いがわかる
mysql> SELECT HEX(str) FROM tbl;
+------------------------+
| HEX(str) |
+------------------------+
| F09F8DA3E381A8F09F8DBA | ← '🍣と🍺'
| 3FE381A83F | ← '?と?'
+------------------------+
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8接続から4バイト文字を登録
文字化けして登録されちゃう
mysql> INSERT INTO tbl (str) VALUES ('🍣と🍺');
Query OK, 1 row affected, 2 warnings (0.05 sec)
mysql> SELECT str,HEX(str) FROM tbl;
+-------------+------------------------+
| str | HEX(str) |
+-------------+------------------------+
| ????と???? | 3F3F3F3FE381A83F3F3F3F |
+-------------+------------------------+
MySQLの文字コード事情 Powered by Rabbit 2.1.9
sql_mode
MySQLはおかしなことしてもあまりエラーにならない(余
計なお世話)
sql_mode でちゃんとエラーにしてくれる
mysql> SET sql_mode='STRICT_ALL_TABLES';
mysql> INSERT INTO tbl (str) VALUES ('🍣と🍺');
ERROR 1366 (HY000): Incorrect string value:
'xF0x9Fx8DxA3xE3x81...' for column 'str' at row 1
MySQLの文字コード事情 Powered by Rabbit 2.1.9
sql_mode
MySQL 5.7 からはデフォルト
ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
MySQLの文字コード事情 Powered by Rabbit 2.1.9
🍣=🍺 問題
mysql> SELECT '🍣'='🍺';
+---------+
| '?'='?' |
+---------+
| 1 |
+---------+
MySQLの文字コード事情 Powered by Rabbit 2.1.9
Collation
MySQLの文字コード事情 Powered by Rabbit 2.1.9
Collation
文字の照合規則・照合順序
Charset 毎に Collation がある
MySQLの文字コード事情 Powered by Rabbit 2.1.9
Collation 一覧
mysql> SHOW COLLATION;
+--------------------------+----------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci | big5 | 1 | Yes | Yes | 1 |
| big5_bin | big5 | 84 | | Yes | 1 |
| dec8_swedish_ci | dec8 | 3 | Yes | Yes | 1 |
| dec8_bin | dec8 | 69 | | Yes | 1 |
| cp850_general_ci | cp850 | 4 | Yes | Yes | 1 |
| cp850_bin | cp850 | 80 | | Yes | 1 |
| hp8_english_ci | hp8 | 6 | Yes | Yes | 1 |
| hp8_bin | hp8 | 72 | | Yes | 1 |
| koi8r_general_ci | koi8r | 7 | Yes | Yes | 1 |
| koi8r_bin | koi8r | 74 | | Yes | 1 |
| latin1_german1_ci | latin1 | 5 | | Yes | 1 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |
| latin1_danish_ci | latin1 | 15 | | Yes | 1 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin | latin1 | 47 | | Yes | 1 |
| latin1_general_ci | latin1 | 48 | | Yes | 1 |
| latin1_general_cs | latin1 | 49 | | Yes | 1 |
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8mb4 の Collation
utf8mb4_general_ci
utf8mb4_bin
utf8mb4_unicode_ci
utf8mb4_unicode_520_ci
utf8mb4_言語_ci
(utf8m4_japanese_ci は無い)
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8mb4_general_ci
utf8mb4 Charset のデフォルト Collation
ASCII大文字小文字を区別しない(A=a)
絵文字を区別しない(🍣=🍺)
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8mb4_bin
varchar(99) binary
全文字を区別する(A≠a, 🍣≠🍺)
PostgreSQLと同じ?
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8mb4_unicode_ci
Unicode Collation Algorithm 4.0.0
http://www.unicode.org/reports/tr10/
http://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-sets.html
ASCII大文字小文字を区別しない(A=a)
絵文字を区別しない(🍣=🍺)
ひらがな、カタカナ、濁点有無、全角、半角を区別し
ない
(は=ば=ぱ=ハ=バ=パ=ハ)
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8mb4_unicode_520_ci
Unicode Collation Algorithm 5.2.0
ASCII大文字小文字を区別しない(A=a)
絵文字を区別する(🍣≠🍺)
ひらがな、カタカナ、濁点有無、全角、半角を区別し
ない
(は=ば=ぱ=ハ=バ=パ=ハ)
MySQLの文字コード事情 Powered by Rabbit 2.1.9
utf8mb4_*_ci
Collation A : a 🍣 : 🍺 は : ぱ : ば
general = = ≠
bin ≠ ≠ ≠
unicode = = =
unicode
_520
= ≠ =
MySQLの文字コード事情 Powered by Rabbit 2.1.9
まとめ
今から使うなら utf8mb4
サーバーとクライアントの両方で Charset を指定
sql_mode をちゃんと設定
Collation は適切に

More Related Content

What's hot (20)

PDF
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
 
PDF
REST API のコツ
pospome
 
PDF
ゼロからはじめるKVM超入門
VirtualTech Japan Inc.
 
PDF
PG-REXで学ぶPacemaker運用の実例
kazuhcurry
 
PPTX
reduxのstate設計の話
ayatas0623
 
PDF
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
Satoshi Shimazaki
 
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
Redmine にいろいろ埋め込んでみた
Kohei Nakamura
 
PDF
DBスキーマもバージョン管理したい!
kwatch
 
PDF
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
VirtualTech Japan Inc.
 
PDF
View customize plugin for Redmineの紹介 (2019年版)
onozaty
 
PDF
Redmineチューニングの実際と限界(旧資料) - Redmine performance tuning(old), See Below.
Kuniharu(州晴) AKAHANE(赤羽根)
 
PPTX
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
君はyarn.lockをコミットしているか?
Teppei Sato
 
PDF
Pythonによる黒魔術入門
大樹 小倉
 
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
PPTX
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
NTT DATA Technology & Innovation
 
PDF
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
 
PDF
PostgreSQL監査
Ayumi Ishii
 
PDF
[오픈소스컨설팅]초간단 Cubrid HA구성
Ji-Woong Choi
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
 
REST API のコツ
pospome
 
ゼロからはじめるKVM超入門
VirtualTech Japan Inc.
 
PG-REXで学ぶPacemaker運用の実例
kazuhcurry
 
reduxのstate設計の話
ayatas0623
 
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
Satoshi Shimazaki
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
Redmine にいろいろ埋め込んでみた
Kohei Nakamura
 
DBスキーマもバージョン管理したい!
kwatch
 
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
VirtualTech Japan Inc.
 
View customize plugin for Redmineの紹介 (2019年版)
onozaty
 
Redmineチューニングの実際と限界(旧資料) - Redmine performance tuning(old), See Below.
Kuniharu(州晴) AKAHANE(赤羽根)
 
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
君はyarn.lockをコミットしているか?
Teppei Sato
 
Pythonによる黒魔術入門
大樹 小倉
 
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
NTT DATA Technology & Innovation
 
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
 
PostgreSQL監査
Ayumi Ishii
 
[오픈소스컨설팅]초간단 Cubrid HA구성
Ji-Woong Choi
 

Similar to MySQLの文字コード事情 (20)

PDF
Nseg49 mysql
Masahiro Tomita
 
PDF
Mysqlの文字コード
Masahiro Tomita
 
PPTX
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
Ryusuke Kajiyama
 
PDF
20160929 inno db_fts_jp
yoyamasaki
 
PDF
MySQL 5.7 InnoDB 日本語全文検索(その2)
yoyamasaki
 
PDF
Mysql charset
Masahiro Tomita
 
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
 
PDF
MySQLを拡張する
Masahiro Tomita
 
PDF
5 古雷my sql源碼與資料庫規範
Ivan Tu
 
PPTX
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
Ryusuke Kajiyama
 
PDF
文字化け
Masahiro Tomita
 
PDF
MySQL日本語利用徹底入門
Mikiya Okuno
 
PDF
What's Temporal model FuelPHP東京勉強会03
Takayuki Yamaguchi
 
PDF
MySQL 8.0でMroonga
Kouhei Sutou
 
PPTX
システムパフォーマンス勉強会#8
shingo suzuki
 
PDF
States of Dolphin - MySQL最新技術情報2013秋 -
yoyamasaki
 
PDF
ペパボ de MySQL
yoku0825
 
PDF
MySQLerの7つ道具
yoku0825
 
PDF
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
yoku0825
 
PDF
LINEのMySQL運用について
LINE Corporation
 
Nseg49 mysql
Masahiro Tomita
 
Mysqlの文字コード
Masahiro Tomita
 
[db tech showcase 2017 Tokyo] D31 - MySQL 8.0の日本語キャラクタ・セットと文字照合
Ryusuke Kajiyama
 
20160929 inno db_fts_jp
yoyamasaki
 
MySQL 5.7 InnoDB 日本語全文検索(その2)
yoyamasaki
 
Mysql charset
Masahiro Tomita
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
 
MySQLを拡張する
Masahiro Tomita
 
5 古雷my sql源碼與資料庫規範
Ivan Tu
 
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
Ryusuke Kajiyama
 
文字化け
Masahiro Tomita
 
MySQL日本語利用徹底入門
Mikiya Okuno
 
What's Temporal model FuelPHP東京勉強会03
Takayuki Yamaguchi
 
MySQL 8.0でMroonga
Kouhei Sutou
 
システムパフォーマンス勉強会#8
shingo suzuki
 
States of Dolphin - MySQL最新技術情報2013秋 -
yoyamasaki
 
ペパボ de MySQL
yoku0825
 
MySQLerの7つ道具
yoku0825
 
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
yoku0825
 
LINEのMySQL運用について
LINE Corporation
 
Ad

More from Masahiro Tomita (20)

PDF
お前の罪を数えろ
Masahiro Tomita
 
PDF
Ruby 2.5
Masahiro Tomita
 
PDF
本当はこわいMySQLプロトコル
Masahiro Tomita
 
PDF
ネットワークこわい
Masahiro Tomita
 
PDF
MySQLの文字コード事情 2017春版
Masahiro Tomita
 
PDF
MySQLの文字コード事情 2017版
Masahiro Tomita
 
PDF
Ruby24
Masahiro Tomita
 
PDF
進捗と品質
Masahiro Tomita
 
PDF
「理論から学ぶデータベース実践入門」読書会スペシャル
Masahiro Tomita
 
PDF
MyNAができるまで
Masahiro Tomita
 
PDF
文字化け
Masahiro Tomita
 
PDF
Crystal
Masahiro Tomita
 
PDF
メールの暗号化
Masahiro Tomita
 
PDF
進捗と品質
Masahiro Tomita
 
PDF
アジャイルジャパン長野サテライト
Masahiro Tomita
 
PDF
🍣=🍺
Masahiro Tomita
 
PDF
本当はこわいエンコーディングの話
Masahiro Tomita
 
PDF
Sequelのすすめ
Masahiro Tomita
 
PDF
MySQLのプロトコル解説
Masahiro Tomita
 
お前の罪を数えろ
Masahiro Tomita
 
Ruby 2.5
Masahiro Tomita
 
本当はこわいMySQLプロトコル
Masahiro Tomita
 
ネットワークこわい
Masahiro Tomita
 
MySQLの文字コード事情 2017春版
Masahiro Tomita
 
MySQLの文字コード事情 2017版
Masahiro Tomita
 
進捗と品質
Masahiro Tomita
 
「理論から学ぶデータベース実践入門」読書会スペシャル
Masahiro Tomita
 
MyNAができるまで
Masahiro Tomita
 
文字化け
Masahiro Tomita
 
メールの暗号化
Masahiro Tomita
 
進捗と品質
Masahiro Tomita
 
アジャイルジャパン長野サテライト
Masahiro Tomita
 
🍣=🍺
Masahiro Tomita
 
本当はこわいエンコーディングの話
Masahiro Tomita
 
Sequelのすすめ
Masahiro Tomita
 
MySQLのプロトコル解説
Masahiro Tomita
 
Ad

Recently uploaded (10)

PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 

MySQLの文字コード事情

  • 1. MySQLの文字コード事情 Powered by Rabbit 2.1.9 MySQLの文字コード事情 OSC群馬2016 とみたまさひろ 日本MySQLユーザ会 2016-05-14
  • 2. MySQLの文字コード事情 Powered by Rabbit 2.1.9 自己紹介 とみた まさひろ http://tmtms.hatenablog.com http://twitter.com/tmtms https://github.com/tmtm 長野県北部在住プログラマー( Ruby & C ) 長野ソフトウェア技術者グループ(NSEG) 日本MySQLユーザ会代表
  • 3. MySQLの文字コード事情 Powered by Rabbit 2.1.9 MySQLの文字コード(charset)
  • 4. MySQLの文字コード事情 Powered by Rabbit 2.1.9 日本語が使えるのは ujis, sjis, eucjp, cp932, utf8, utf8mb4
  • 5. MySQLの文字コード事情 Powered by Rabbit 2.1.9 今から始めるなら utf8mb4 一択
  • 6. MySQLの文字コード事情 Powered by Rabbit 2.1.9 MySQL Charset 文字集合\エンコーディング EUC シフトJIS UTF-8 JIS ujis sjis ― Windows- 31J eucjp cp932 ― Unicode ― ― utf8 utf8mb4
  • 7. MySQLの文字コード事情 Powered by Rabbit 2.1.9 文字集合 JIS 日本語+α (JIS X 0201, JIS X 0208, (JIS X 0212)) Windows-31J JIS + NEC特殊文字 + IBM拡張文字(「①」「㈱」「髙」等 ) Unicode 世界中の文字。絵文字(「🍺」「🍣」等)も含む
  • 8. MySQLの文字コード事情 Powered by Rabbit 2.1.9 エンコーディング EUC 1〜3バイト。その昔UNIX系OSで日本語を扱うのに使わ れていた シフトJIS 1〜2バイト。Windowsで使われている UTF-8 1〜4バイト。UnicodeのエンコーディングのうちASCII 互換
  • 9. MySQLの文字コード事情 Powered by Rabbit 2.1.9 ユニコード 世界中のすべての文字を扱える 絵文字も使える 世の中もう普通にユニコード 文字コード変換とか考えなくていい 文字化けしない
  • 10. MySQLの文字コード事情 Powered by Rabbit 2.1.9 MySQL Charset (再掲) 文字集合\エンコーディング EUC シフトJIS UTF-8 JIS ujis sjis ― Windows- 31J eucjp cp932 ― Unicode ― ― utf8 utf8mb4
  • 11. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8 or utf8mb4 ?
  • 12. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8 と utf8mb4 utf8: 1文字 1〜3バイト (U+0000〜U+FFFF) utf8mb4: 1文字 1〜4バイト (U+0000〜U+1FFFFF) UTF-8 は普通1〜4バイト utf8 / utf8mb4 の違いは MySQL のみ ほとんどの日本語文字は3バイト 一部の漢字と絵文字等が4バイト
  • 13. MySQLの文字コード事情 Powered by Rabbit 2.1.9 JIS X 0213 の文字の中で UTF-8 で 4バイトになるもの 𠀋𡈽𡌛𡑮𡢽𠮟𡚴𡸴𣇄𣗄𣜿𣝣𣳾𤟱𥒎𥔎𥝱𥧄𥶡𦫿𦹀𧃴𧚄𨉷𨏍 𪆐𠂉𠂢𠂤𠆢𠈓𠌫𠎁𠍱𠏹𠑊𠔉𠗖𠘨𠝏𠠇𠠺𠢹𠥼𠦝𠫓𠬝𠵅𠷡𠺕 𠹭𠹤𠽟𡈁𡉕𡉻𡉴𡋤𡋗𡋽𡌶𡍄𡏄𡑭𡗗𦰩𡙇𡜆𡝂𡧃𡱖𡴭𡵅𡵸𡵢 𡶡𡶜𡶒𡶷𡷠𡸳𡼞𡽶𡿺𢅻𢌞𢎭𢛳𢡛𢢫𢦏𢪸𢭏𢭐𢭆𢰝𢮦𢰤𢷡𣇃 𣇵𣆶𣍲𣏓𣏒𣏐𣏤𣏕𣏚𣏟𣑊𣑑𣑋𣑥𣓤𣕚𣖔𣘹𣙇𣘸𣘺𣜜𣜌𣝤𣟿 𣟧𣠤𣠽𣪘𣱿𣴀𣵀𣷺𣷹𣷓𣽾𤂖𤄃𤇆𤇾𤎼𤘩𤚥𤢖𤩍𤭖𤭯𤰖𤴔𤸎 𤸷𤹪𤺋𥁊𥁕𥄢𥆩𥇥𥇍𥈞𥉌𥐮𥓙𥖧𥞩𥞴𥧔𥫤𥫣𥫱𥮲𥱋𥱤𥸮𥹖 𥹥𥹢𥻘𥻂𥻨𥼣𥽜𥿠𥿔𦀌𥿻𦀗𦁠𦃭𦉰𦊆𦍌𣴎𦐂𦙾𦚰𦜝𦣝𦣪𦥑 𦥯𦧝𦨞𦩘𦪌𦪷𦱳𦳝𦹥𦾔𦿸𦿶𦿷𧄍𧄹𧏛𧏚𧏾𧐐𧑉𧘕𧘔𧘱𧚓𧜎 𧜣𧝒𧦅𧪄𧮳𧮾𧯇𧲸𧶠𧸐𧾷𨂊𨂻𨊂𨋳𨐌𨑕𨕫𨗈𨗉𨛗𨛺𨥉𨥆𨥫 𨦇𨦈𨦺𨦻𨨞𨨩𨩱𨩃𨪙𨫍𨫤𨫝𨯁𨯯𨴐𨵱𨷻𨸟𨸶𨺉𨻫𨼲𨿸𩊠𩊱 𩒐𩗏𩙿𩛰𩜙𩝐𩣆𩩲𩷛𩸽𩸕𩺊𩹉𩻄𩻩𩻛𩿎𪀯𪀚𪃹𪂂𢈘𪎌𪐷𪗱 𪘂𪘚𪚲
  • 14. MySQLの文字コード事情 Powered by Rabbit 2.1.9 UTF-8 で4バイトになる絵文字(一部) 🀀🀁🀂🀃🀄🀅🀆🀇🀈🀉🀊🀋🀌🀍🀎🀏🀐🀑🀒🀓🀔🀕🀖🀗🀘🀙🀚🀛🀜🀝🀞 🀟🀠🀡🀢🀣🀤🀥🀦🀧🀨🀩🀪🀫🂠🂡🂢🂣🂤🂥🂦🂧🂨🂩🂪🂫🂬🂭 🂮🂱🂲🂳🂴🂵🂶🂷🂸🂹🂺🂻🂼🂽🂾🂿🃁🃂🃃🃄🃅🃆🃇🃈 🃉🃊🃋🃌🃍🃎🃏🃑🃒🃓🃔🃕🃖🃗🃘🃙🃚🃛🃜🃝🃞🃟🈀🈁 🈂🈐🈑🈒🈓🈔🈕🈖🈗🈘🈙🈚🈛🈜🈝🈞🈟🈠🈡🈢🈣🈤🈥🈦 🈧🈨🈩🈪🈫🈬🈭🈮🈯🈰🈱🈲🈳🈴🈵🈶🈷🈸🈹🈺🉀🉁🉂🉃 🉄🉅🉆🉇🉈🉐🉑🌀🌁🌂🌃🌄🌅🌆🌇🌈🌉🌊🌋🌌🌍🌎🌏🌐 🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜🌝🌞🌟🌠🌡🌢🌣🌤🌥🌦🌧🌨🌩🌪 🌫🌬🌭🌮🌯🌰🌱🌲🌳🌴🌵🌶🌷🌸🌹🌺🌻🌼🌽🌾🌿🍀🍁🍂🍃🍄 🍅🍆🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍔🍕🍖🍗🍘🍙🍚🍛🍜🍝 🍞🍟🍠🍡🍢🍣🍤🍥🍦🍧🍨🍩🍪🍫🍬🍭🍮🍯🍰🍱🍲🍳🍴🍵🍶🍷 🍸🍹🍺🍻🍼🍽🍾🍿🎀🎁🎂🎃🎄🎅🎆🎇🎈🎉🎊🎋🎌🎍🎎🎏🎐🎑 🎒🎓🎔🎕🎖🎗🎘🎙🎚🎛🎜🎝🎞🎟🎠🎡🎢🎣🎤🎥🎦🎧🎨🎩🎪🎫 🎬🎭🎮🎯🎰🎱🎲🎳🎴🎵🎶🎷🎸🎹🎺🎻🎼🎽🎾🎿🏀🏁🏂🏃🏄🏅 🏆🏇🏈🏉🏊🏋🏌🏍🏎🏏🏐🏑🏒🏓🏔🏕
  • 15. MySQLの文字コード事情 Powered by Rabbit 2.1.9 (文字とはいったい…)
  • 16. MySQLの文字コード事情 Powered by Rabbit 2.1.9 MySQLのCharset サーバー クライアント サーバー/クライアント間の接続 データベース毎 テーブル毎 カラム毎
  • 17. MySQLの文字コード事情 Powered by Rabbit 2.1.9 ハマりたくなければ全部統一
  • 18. MySQLの文字コード事情 Powered by Rabbit 2.1.9 サーバー Charset 新規作成データベースのCharsetのデフォルト値 これさえ指定しておけばだいたいOK mysqld の起動オプション --character-set-server=utf8mb4 my.cnf の [mysqld] セクション character-set-server = utf8mb4 サーバー変数 character_set_server
  • 19. MySQLの文字コード事情 Powered by Rabbit 2.1.9 データベース Charset 配下に作成するテーブルのCharsetのデフォルト値 サーバーCharsetが適切に設定されてれば指定しなく てもいい 作成: CREATE DATABASE db CHARSET utf8mb4; 確認: SHOW CREATE DATABASE db;
  • 20. MySQLの文字コード事情 Powered by Rabbit 2.1.9 データベース Charset 変更: ALTER DATABASE db CHARSET utf8mb4; 変更しても既存のテーブルCharsetは変更されない
  • 21. MySQLの文字コード事情 Powered by Rabbit 2.1.9 テーブル Charset テーブル内カラムのCharsetのデフォルト値 データベースCharsetが適切に設定されてれば指定す る必要はない 作成: CREATE TABLE tbl (...) CHARSET utf8mb4; 確認: SHOW CREATE TABLE tbl;
  • 22. MySQLの文字コード事情 Powered by Rabbit 2.1.9 テーブル Charset テーブル属性だけ変更: ALTER TABLE tbl CHARSET utf8mb4; 属性だけ変更しても既存のカラムは変更されない 全カラムとデータの変換: ALTER TABLE tbl CONVERT TO CHARSET utf8mb4;
  • 23. MySQLの文字コード事情 Powered by Rabbit 2.1.9 カラム Charset テーブルCharsetが適切に設定されてれば指定する必 要はない 作成: CREATE TABLE tbl (col VARCHAR(10) CHARSET utf8mb4, ...); 確認: SHOW CREATE TABLE tbl;
  • 24. MySQLの文字コード事情 Powered by Rabbit 2.1.9 カラム Charset 変更: ALTER TABLE tbl MODIFY col VARCHAR(10) CHARSET utf8mb4; 変更するとカラム内のデータも変換される
  • 25. MySQLの文字コード事情 Powered by Rabbit 2.1.9 クライアント Charset クライアント内での文字列処理と サーバーとの接続Charsetに使用される 指定方法はプログラム/言語に依存 mysql --default-character-set=utf8mb4 プログラムによっては my.cnf の [client] セクション が有効 [client] default-character-set = utf8mb4
  • 26. MySQLの文字コード事情 Powered by Rabbit 2.1.9 クライアント Charset mysqld との接続毎に異なる mysql コマンドでOKでも他のアプリからはNGかもし れない 何も指定しなければ latin1
  • 27. MySQLの文字コード事情 Powered by Rabbit 2.1.9 Charset の確認 mysql> SHOW VARIABLES LIKE '%char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
  • 28. MySQLの文字コード事情 Powered by Rabbit 2.1.9 mysql コマンド mysql コマンドのデフォルトCharsetは auto システムロケール(LC_ALL, LC_CTYPE, LANG 環境変 数等)により値が決定 LANG=ja_JP.UTF-8 の場合は utf8 になる utf8mb4 ではない LANG=C の場合は latin1 になる
  • 29. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8 と utf8mb4 の混在で起きること
  • 30. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8接続から4バイト文字を参照 クライアントが扱えない文字は「?」になる mysql> SELECT str FROM tbl; +-------+ | str | +-------+ | ?と? | ← '🍣と🍺' | ?と? | ← '?と?' +-------+
  • 31. MySQLの文字コード事情 Powered by Rabbit 2.1.9 バイトコードを見れば違いがわかる mysql> SELECT HEX(str) FROM tbl; +------------------------+ | HEX(str) | +------------------------+ | F09F8DA3E381A8F09F8DBA | ← '🍣と🍺' | 3FE381A83F | ← '?と?' +------------------------+
  • 32. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8接続から4バイト文字を登録 文字化けして登録されちゃう mysql> INSERT INTO tbl (str) VALUES ('🍣と🍺'); Query OK, 1 row affected, 2 warnings (0.05 sec) mysql> SELECT str,HEX(str) FROM tbl; +-------------+------------------------+ | str | HEX(str) | +-------------+------------------------+ | ????と???? | 3F3F3F3FE381A83F3F3F3F | +-------------+------------------------+
  • 33. MySQLの文字コード事情 Powered by Rabbit 2.1.9 sql_mode MySQLはおかしなことしてもあまりエラーにならない(余 計なお世話) sql_mode でちゃんとエラーにしてくれる mysql> SET sql_mode='STRICT_ALL_TABLES'; mysql> INSERT INTO tbl (str) VALUES ('🍣と🍺'); ERROR 1366 (HY000): Incorrect string value: 'xF0x9Fx8DxA3xE3x81...' for column 'str' at row 1
  • 34. MySQLの文字コード事情 Powered by Rabbit 2.1.9 sql_mode MySQL 5.7 からはデフォルト ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
  • 35. MySQLの文字コード事情 Powered by Rabbit 2.1.9 🍣=🍺 問題 mysql> SELECT '🍣'='🍺'; +---------+ | '?'='?' | +---------+ | 1 | +---------+
  • 37. MySQLの文字コード事情 Powered by Rabbit 2.1.9 Collation 文字の照合規則・照合順序 Charset 毎に Collation がある
  • 38. MySQLの文字コード事情 Powered by Rabbit 2.1.9 Collation 一覧 mysql> SHOW COLLATION; +--------------------------+----------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------------+----------+-----+---------+----------+---------+ | big5_chinese_ci | big5 | 1 | Yes | Yes | 1 | | big5_bin | big5 | 84 | | Yes | 1 | | dec8_swedish_ci | dec8 | 3 | Yes | Yes | 1 | | dec8_bin | dec8 | 69 | | Yes | 1 | | cp850_general_ci | cp850 | 4 | Yes | Yes | 1 | | cp850_bin | cp850 | 80 | | Yes | 1 | | hp8_english_ci | hp8 | 6 | Yes | Yes | 1 | | hp8_bin | hp8 | 72 | | Yes | 1 | | koi8r_general_ci | koi8r | 7 | Yes | Yes | 1 | | koi8r_bin | koi8r | 74 | | Yes | 1 | | latin1_german1_ci | latin1 | 5 | | Yes | 1 | | latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 | | latin1_danish_ci | latin1 | 15 | | Yes | 1 | | latin1_german2_ci | latin1 | 31 | | Yes | 2 | | latin1_bin | latin1 | 47 | | Yes | 1 | | latin1_general_ci | latin1 | 48 | | Yes | 1 | | latin1_general_cs | latin1 | 49 | | Yes | 1 |
  • 39. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8mb4 の Collation utf8mb4_general_ci utf8mb4_bin utf8mb4_unicode_ci utf8mb4_unicode_520_ci utf8mb4_言語_ci (utf8m4_japanese_ci は無い)
  • 40. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8mb4_general_ci utf8mb4 Charset のデフォルト Collation ASCII大文字小文字を区別しない(A=a) 絵文字を区別しない(🍣=🍺)
  • 41. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8mb4_bin varchar(99) binary 全文字を区別する(A≠a, 🍣≠🍺) PostgreSQLと同じ?
  • 42. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8mb4_unicode_ci Unicode Collation Algorithm 4.0.0 http://www.unicode.org/reports/tr10/ http://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-sets.html ASCII大文字小文字を区別しない(A=a) 絵文字を区別しない(🍣=🍺) ひらがな、カタカナ、濁点有無、全角、半角を区別し ない (は=ば=ぱ=ハ=バ=パ=ハ)
  • 43. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8mb4_unicode_520_ci Unicode Collation Algorithm 5.2.0 ASCII大文字小文字を区別しない(A=a) 絵文字を区別する(🍣≠🍺) ひらがな、カタカナ、濁点有無、全角、半角を区別し ない (は=ば=ぱ=ハ=バ=パ=ハ)
  • 44. MySQLの文字コード事情 Powered by Rabbit 2.1.9 utf8mb4_*_ci Collation A : a 🍣 : 🍺 は : ぱ : ば general = = ≠ bin ≠ ≠ ≠ unicode = = = unicode _520 = ≠ =
  • 45. MySQLの文字コード事情 Powered by Rabbit 2.1.9 まとめ 今から使うなら utf8mb4 サーバーとクライアントの両方で Charset を指定 sql_mode をちゃんと設定 Collation は適切に