ホーム DoRuby RailsでMySQLに格納できない文字が入力された場合の対処法方の検討

RailsでMySQLに格納できない文字が入力された場合の対処法方の検討

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

RailsでMySQLに格納できない文字が入力された場合の対処法方の検討しました

 テーブル例

FieldType
idint(11)
hogevarchar(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
記事を共有

最近人気な記事