mysql – 检查输入字符串是否符合DB排序规则

我们所拥有的是一个包含电子邮件字段的表 – 由于我们的电子邮件服务的限制,整理latin1_swedish_ci.

《mysql – 检查输入字符串是否符合DB排序规则》

当新用户到达以查看他是否已订阅时,将检查此表.

来自用户的电子邮件中的字符对于此特定排序规则无效.比如hsıasdf@test.com

《mysql – 检查输入字符串是否符合DB排序规则》

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
点赞