我们拥有的是一个包含电子邮件字段的表格 - 排序latin1_swedish_ci
,因为我们的电子邮件服务存在局限性。
当新用户到达以查看他是否已订阅时,将检查此表。
来自用户的电子邮件中的字符对于此特定排序规则无效。以hsıasdf@test.com
在保存字符串之前是否可以确定 坚持数据库的整理规则?
我可以在任何数据库触发之前检查 保存/创建/查找;如果包含此特定电子邮件的条目将会 同意整理?有些正则表达式可能吗?
答案 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标准utf
和utf8_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);