character_set_connection = sjis でDATETIME型のカラムにインデックスがきかないはなし
mysql

character_set_connection = sjis でDATETIME型のカラムにインデックスがきかないはなし

このエントリーをはてなブックマークに追加

DBAです。

default-character-set = sjis とかやっている悪い子はいませんか? 少なくとも最近作られたシステムで積極的にやっている人はいない(と信じたい)ですが、古くからあるMySQLとかだとたまにお目にかかりますよね。

正直character set sjisは結構つらい感じのバグが多い(というか、結構つらい感じなのにMySQL開発チーム的にはそう思ってなさそうなのが一番つらい)ので、今後新規で作られるサービスが

 間 違 っ て も sjis を 選 択 さ れ た り す る 悲 劇 が 起 こ ら な い よ う に

ついさっき盛大に踏み抜いたバグをメモしておきます。

MySQL Bugs: #74449: Incorrect datetime casting with charcter_set_connection=sjis

charcter_set_connectionがsjisの場合にStringからDATETIME型へのキャストがおかしく、インデックスのレンジ検索で済むはずのクエリーがインデックス全体のスキャンになってしまう問題。
(たぶん、カラムに入っているDATETIME型の値の方を暗黙の型変換しちゃってて、インデックスに対する演算扱い => type: index になってるんだと予測。。)

道理でインデックス足したのに軽くならないよね! <censored>ばいいのに! すまほの液晶割れちゃえばいいのに! (誰の

取り敢えずCASTでしのいでもらうことにしています。

なお、Performance IssueはつらいとはいえWorkaroundもあったりするので何とかなるっちゃ何とかなるんですが、こっちは俺としてはかなり深刻で

MySQL Bugs: #68531: incorrect interpret single digits in time values

MySQL Bugs: #68557: sjis changes in 5.5 break date parsing 

直接引っかかったわけではないのですが、「ひょっとしたら気付いていないだけで黙って正しくない結果が返ってくる」類なので結構シリアスだと思うんですが、全然音沙汰なし。

5.6.21でも再現するしなー。。

sjisダメ、絶対。


名無しのエンジニア
社内座談会イベント始めました 〜第1回「モバイルバックエンドのAPIを考える」
エンジニアのコミュニケーションを人事がのぞいて見た件