我们所拥有的是一个包含电子邮件字段的表 – 由于我们的电子邮件服务的限制,整理latin1_swedish_ci.
当新用户到达以查看他是否已订阅时,将检查此表.
来自用户的电子邮件中的字符对于此特定排序规则无效.比如hsıasdf@test.com
Would it be possible to determine before saving if a string will
adhere to the collation rules of database?Is it possible for me to check before any DB trigger to
save/create/find; if an entry with this particular email will
agree with the collation? Some regex maybe?
最佳答案 在Ruby中,您可以使用
String#encode
来测试在常见编码之间转换字符串.
但是,由于您要测试MySQL特定的排序规则,这无济于事.
你能做的是使用transaction:
User.transaction do
if User.create!(email: 'hsıasdf@test.com')
puts "yup its valid"
raise ActiveRecord::Rollback
end
end
然而,它并不是非常有效.如果您希望在保存之前运行它,则可以使用自定义验证.
如果可能的话,我会使用MySQL标准utf和utf8_general_ci,并仅在需要与电子邮件系统交互的应用程序边界进行转换.使用非UTF-8编码会给您带来很多麻烦,如果例如更改了错误的电子邮件系统,从长远来看可能会非常不利.
您可以动态选择整理:
SELECT users.email COLLATE latin1_swedish_ci AS users.collated_email
FROM users