この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
RailsでMySQLに格納できない文字が入力された場合の対処法方の検討しました
■ テーブル例
Field | Type |
---|---|
id | int(11) |
hoge | varchar(255) |
■ エラーの出る文字の一例(本文中に記載すると投稿できないため外部サイト参照)
■ 実行例
ユーザが自由に文字列を入力できる場合、MySQLに格納できない文字が入力される可能性がある。
> t = Hoge.new(hoge: "<エラーの出る文字>")
=> #<hoge id: nil, hoge: "<エラーの出る文字>">
> t.save!
(0.6ms) BEGIN
SQL (0.3ms) INSERT INTO `hoges` (`hoge`) VALUES ('<エラーの出る文字>')
Mysql2::Error: Incorrect string value: '\xF0\xA8\xBC\xB2' for column 'hoge'
at row 1: INSERT INTO `hoges` (`hoge`) VALUES ('<エラーの出る文字>')
(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value:
'\xF0\xA8\xBC\xB2' for column 'hoge' at row 1: INSERT INTO `hoges` (`hoge`)
VALUES ('<エラーの出る文字>')
■ 検出方法
直接Mysql2::Errorは直接例外検出できないため、ActiveRecord::StatementInvalidを検出して判定することでエラー処理を行うことができる
テスト用のメソッド
def hoge_test(str)
t = Hoge.new(hoge: str)
t.save!
rescue ActiveRecord::StatementInvalid => e
if(e.cause.class == Mysql2::Error
&& e.cause.message.match(/^Incorrect string value/))
puts "[DEBUG!] MySQLに格納できない文字が入力されました."
# エラー処理等
end
end
実行結果
> hoge_test("<エラーの出る文字>")
(0.6ms) BEGIN
SQL (0.5ms) INSERT INTO `hoges` (`hoge`) VALUES ('<エラーの出る文字>')
Mysql2::Error: Incorrect string value: '\xF0\xA8\xBC\xB2' for column 'hoge'
at row 1: INSERT INTO `hoges` (`hoge`) VALUES ('<エラーの出る文字>')
(0.1ms) ROLLBACK
[DEBUG!] MySQLに格納できない文字が入力されました.
=> nil