寿司とビール問題を解決したらハマった罠

skuwa
2 min readAug 28, 2019

--

tl;dl

脳死でutf8mb4_binを指定しても🍣と🍺問題は解決しません。

寿司とビール問題

MySQLで絵文字を入れるためにutf8mb4を指定しただけでは🍣と🍺が同じものとして扱われてしまう。

(🍣と🍺に限らず、🐶と😺も一緒になる)

対応策としてutf8mb4_bin(バイナリ照合順序を指定してあげれば絵文字も、大文字小文字も、濁点半濁点も全部違うものとして扱ってくれるよ!というのがよくあるやつ。

いざ検索

うん、検索されてそう。
ちゃんと🍣と🍺が別物として扱われている!!
ん・・・?

どういうことか、「🍣🍺」が検索結果に出てこない・・・

原因と解決

言われてみればめちゃくちゃ当たり前なのだが、utf8mb4_binを照合順序として指定した場合にはバイナリでの比較が行われる。

つまり、比較する値自体もじゃんとバイナリにキャストしなければならない。

binaryでキャストをしてあげればちゃんと出る

検索するととりあえず「utf8mb4_bin」を指定しましょう!という記事はいっぱい出てくるが、where句で検索する時にbinary指定しましょうって書いてる記事は見当たらなかったので備忘録的に書いておきました。

--

--

skuwa

Service Lead Engineer @DeNA Co., Ltd. Rails / Kotlin / Golang / Scala / AWS / GAE ex. kurashiru @dely, Inc.