その他
    ホーム 技術発信 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