我遇到与包含UTF-8字符的字符串属性相关的MySQL文本列的问题。我们假设我们有这样的迁移:
class CreateItems < ActiveRecord::Migration
def change
create :items do |t|
t.text "description", null: false
end
end
end
我们知道MySQL
TEXT
列的最大长度为65535字节,并且添加如下所示的验证可以防止此类MySQL
例外:
class Item < ActiveRecord::Base
validates :description, length: { maximum: 65535 }
end
当然,当用户放入一个包含超过1个字节长的字符的非常长的文本时,它就可以工作。有什么区别?参见示例:
> s = "A text with some national characters ĄąĘę"
=> "A text with some national characters ĄąĘę"
> s.length
=> 41
> s.bytesize
=> 45
所以,例如如果有人用很多这样的字符写了65500个字符的长描述,验证通过它但MySQL不会原谅......
我暂时创建了bytesize
验证:
class BytesizeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors.add(attribute, :too_long, count: options[:maximum]) if value.bytesize > options[:maximum]
end
end
在模型中使用如下:
validates :description, bytesize: { maximum: 65535 }
解决了我的问题,但我相信,有一个简单的解决方案。也许我错过了一些东西,并且有可能按照预期在常规Rails length validation
覆盖多字节字符?
我在Linux上使用Rails 4.2.5.1,Ruby 2.2.4和MariaDB 15.1。