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

时间:2016-05-24 08:00:21

标签: mysql ruby-on-rails collation

我们拥有的是一个包含电子邮件字段的表格 - 排序latin1_swedish_ci,因为我们的电子邮件服务存在局限性。

Full table description

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

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

为例

enter image description here

  

在保存字符串之前是否可以确定   坚持数据库的整理规则?

     

我可以在任何数据库触发之前检查   保存/创建/查找;如果包含此特定电子邮件的条目将会   同意整理?有些正则表达式可能吗?

3 个答案:

答案 0 :(得分:1)

在Ruby中,您可以使用their website来测试在常见编码之间转换字符串。

但是,由于您希望测试MySQL特定的排序规则,因此无法提供帮助。

您可以使用String#encode

User.transaction do
  if User.create!(email: 'hsıasdf@test.com')
    puts "yup its valid"
    raise ActiveRecord::Rollback
  end
end

然而,它不是非常有效。如果您希望在保存之前运行它,则可以使用自定义验证。

如果可能,我会使用MySQL标准utfutf8_general_ci,并仅在需要与电子邮件系统交互的应用程序边界处进行转换。使用非UTF-8编码会给您带来很多麻烦,例如,如果更改了错误的电子邮件系统,可能会非常有害。

您可以使用以下方式选择整理:

SELECT users.email COLLATE latin1_swedish_ci AS users.collated_email
FROM users

答案 1 :(得分:0)

RoR: application_controller.rb

  def configure_charsets
    response.headers["Content-Type"] = "text/html; charset=utf-8"
    suppress(ActiveRecord::StatementInvalid) do
      ActiveRecord::Base.connection.execute 'SET NAMES UTF8'
    end   end

你应该选择utf8(或utf8mb4),而不是非常有限的latin1(仅处理西欧)。

ALTER TABLE user_subscriptions
    CONVERT TO utf8;

(对于任何其他表格同样如此)。

你的标题谈到检查。但我认为,当你使用相同的CHARACTER SET获取所有内容时,就不需要进行任何“检查”。

答案 2 :(得分:0)

尝试下面的查询。它可能对你有帮助。

select * from user_subscription where email=cast('hsıasdf@test.com' as char CHARSET latin1);