Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.
For the best experience please use the latest Chrome or Safari browser. Firefox 10 (to be released soon) will also handle it.
About me
- クソクエリの話題にクソリプ業
- MySQL Casual
MySQL Casual
- 次回のMySQL Casualは12月12日(金)開催です
- 今年もAdvent Calendarあります
今日話す話題
- ActiveRecordのMySQL対応は放置される傾向にある
- でもMySQL対応がんばりたい
- (みんなもMySQL使ってますよね?)
- ActiveRecordからMySQLを使うときのハマりどころ
ActiveRecordのMySQL対応は放置される傾向にある
- Rebuild: 56
- a_matsudaさんがゲストの回でActiveRecordのMySQL対応について言及されてる
miyagawa「MySQLのdatetimeでmicrosecondサポートするやつマージされるのに1年半ぐらいかかった」
a_matsuda「ARメンテしてる人が全員ポスグレ派でMySQL使ってる人がたぶん誰もいない」
a_matsuda「MySQLまわりのパッチはめっちゃ放置される傾向にあります」
ActiveRecordのMySQL対応は放置される傾向にある
- メンテナが全員ポスグレ派なので使ってる人が問題を上げていくしかない
- MySQL使ってる人たちが問題を上げていかないと解決されないままになる
このへん対応されてほしい
- テーブルオプションをschema.rbにダンプする
- カラムにcharsetとcollationを指定できるようにする
- utf8mb4以外のunicode対応
- primary_keyに任意の型を指定できるようにする
ActiveRecordからMySQLを使うときのハマりどころ
- strict_mode
- utf8mb4
- validates :uniquenessのBINARY
- utf8_unicode_ci
- unsigned int
strict_mode
- ActiveRecordでstrict_modeを無効にする
- 接続時に
sql_mode = STRICT_ALL_TABLES
をセットする
- MySQL側での設定を上書きされたくないので無効にしたい
- database.ymlで
strict: false
を設定すると無効にできた
- rails 4.2.0(beta)で
strict: false
の挙動が変更された
sql_mode = ''
をセットするようになった
- #17370
strict_mode
- rails 4.2.0(beta)でもstrict_modeを無効にする方法
# database.yml
production:
adapter: mysql2
database: foo_prod
user: foo
variables:
sql_mode: :default
utf8mb4
- stringのデフォルトを
limit: 191
にする
utf8mb4
module ActiveRecord
module ConnectionAdapters
class AbstractMysqlAdapter
NATIVE_DATABASE_TYPES[:string][:limit] = 191
end
end
end
utf8mb4
- rails 4.1以降を使う
- 8744632でutf8mb4対応したつもりだった
rake db:migrate
ができないissueは上がってたけどutf8mb4対応が不完全なのにたぶん気づいてなかった
- #12252がめっちゃ放置される(つらい)
- #12962でようやくマージされる
validates :uniquenessのBINARY
utf8_unicode_ci
- ActiveRecordでデフォルトの照合順序を変更する
- 意図せずにutf8_unicode_ciを使うと日本語の検索でハマる
- なぜデフォルトのcollationをutf8_unicode_ciに変えるのか
- MySQLでなにも意図せずにutf8の文字列型を定義したときcollationはutf8_general_ciになるがそれで困った人はいなかったはずである
- 問題のコミットはf6ca7e4だけどそうしなければならない理由はないように見える
- そうしなければならない理由がない限りデフォルトのcollation(utf8_general_ci)を尊重してほしい
PostgreSQL対応は活発
- jsonカラムやarrayオプションサポート
- primary_keyにuuidを指定できる
- primary_keyにbigserialを指定できる
- primary_keyに任意の型を指定できる
MySQL対応もがんばりたい
- #13040はめっちゃ放置されたけど周りの人たちが働きかけてくれたおかげでマージされた
- MySQL使ってる人たちはまだまだたくさんいるはずなのでみんなで問題を上げていきましょう
以上