SlideShare a Scribd company logo
1 of 45
Download to read offline
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

Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Web Services Japan
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAmazon Web Services Japan
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)NTT DATA Technology & Innovation
 
20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon CognitoAmazon Web Services Japan
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Amazon Web Services Japan
 
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)NTT DATA Technology & Innovation
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようShuto Suzuki
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例gree_tech
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
マイクロサービスアーキテクチャ とは何か
マイクロサービスアーキテクチャとは何かマイクロサービスアーキテクチャとは何か
マイクロサービスアーキテクチャ とは何かYusuke Suzuki
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAkihiro Kuwano
 

What's hot (20)

Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
 
DevOps with Database on AWS
DevOps with Database on AWSDevOps with Database on AWS
DevOps with Database on AWS
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
 
20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
 
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
Black Belt Online Seminar Amazon Cognito
Black Belt Online Seminar Amazon CognitoBlack Belt Online Seminar Amazon Cognito
Black Belt Online Seminar Amazon Cognito
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
マイクロサービスアーキテクチャ とは何か
マイクロサービスアーキテクチャとは何かマイクロサービスアーキテクチャとは何か
マイクロサービスアーキテクチャ とは何か
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 

Similar to MySQLの文字コード事情

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

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

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

More from Masahiro Tomita

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろMasahiro Tomita
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコルMasahiro Tomita
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわいMasahiro Tomita
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版Masahiro Tomita
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版Masahiro Tomita
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャルMasahiro Tomita
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトMasahiro Tomita
 
本当はこわいエンコーディングの話
本当はこわいエンコーディングの話本当はこわいエンコーディングの話
本当はこわいエンコーディングの話Masahiro Tomita
 
MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説Masahiro Tomita
 

More from Masahiro Tomita (20)

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

Recently uploaded

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 

Recently uploaded (9)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 

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 は適切に