gpt4 book ai didi

mysql - MySQL/Postgres 之间的大小写敏感问题

转载 作者:行者123 更新时间:2023-11-29 00:27:02 26 4
gpt4 key购买 nike

当用户注册我的应用程序以查看用户名是否已存在时,我正在执行 ajax 验证。每当您取消关注/模糊用户名字段时都会发出请求。我在本地使用 MySQL,在 Heroku 上使用的是 Postgres,所以我假设问题出在某种程度上,因为它在我的开发机器上本地运行完美。

例如注册的用户名是Matt...

发展:

  • 马特 = 采纳是真的
  • matt = 采纳为真
  • MATT = 采纳为真
  • MaTt = taken 为真,等等...

生产:

  • 马特 = 采纳是真的
  • matt = taken 是假的
  • MATT = taken 是假的
  • MaTt = taken 是假的

这是方法(你甚至可以看到我更进一步尝试强制它小写,再次在本地按应有的方式工作,但不是在生产中)...

def checkname

scrubb = ActionController::Base.helpers.sanitize(params[:username], :tags => '')
user = User.find_by_username(scrubb, :conditions => [ "lower(username) = ?", scrubb.downcase ])

if user.blank?
render :json => { :isAvailable => true }
else
render :json => { :isAvailable => false }
end

return

end

**编辑**

这是生成的 MySQL 查询的输出:

SELECT `users`.* FROM `users` WHERE `users`.`username` = 'MATT' AND (lower(username) = 'matt') LIMIT 1

因此,看起来真正的问题是 Rails 正在生成 AND 语句。我该如何删除它?

最佳答案

您检查用户名的方法有误。这:

User.find_by_username(scrubb)

只是生成此 SQL 的一种方法:

select * from users where username = ...

然后你添加一些:conditions:

:conditions => [ "lower(username) = ?", scrubb.downcase ]

find_by_username 只是将它们附加到通常使用的 WHERE 子句上。结果是:

User.find_by_username(scrubb, :conditions => ...)

意思是:

find the User whose username is scrubb and where :conditions are true.

在MySQL中,字符串比较:

`users`.`username` = 'MATT'

在您的配置中显然不区分大小写(我相信默认配置)但在 PostgreSQL 中它将区分大小写;如果 username'Matt',那么该条件在 PostgreSQL 中将失败,并且除了区分大小写的匹配项之外,您将找不到任何其他内容。

不要为此使用find_by_username(如果您希望username 不区分大小写,则不要使用其他任何方式),请使用where计数:

n = User.where('lower(username) = ?', scrubb.downcase).count

或者更好的是,哪里存在?:

taken = User.where('lower(username) = ?', scrubb.downcase).exists?

User 添加范围似乎也是个好主意:

class User < ActiveRecord::Base
def self.with_username(username)
where('lower(username) = ?', username)
end
end

然后你可以说:

how_many = User.with_username(scrubb).count
taken = User.with_username(scrubb).exists?

而且您在其他任何地方都不必担心这种不区分大小写的问题。

请在开发和生产中使用相同的堆栈,还有其他各种小差异会让您感到悲伤。

关于mysql - MySQL/Postgres 之间的大小写敏感问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com