为什么SELECT语句中的'BINARY'?

ohh*_*hho 5 activerecord ruby-on-rails ruby-on-rails-3

Vote模型中,有一个验证:

validates_uniqueness_of :topic_id, :scope => [:user_id]
Run Code Online (Sandbox Code Playgroud)

它被转换为开发日志中的以下SQL:

SELECT 1 AS one FROM `votes` WHERE (`votes`.`topic_id` = BINARY 2 AND `votes`.`user_id` = 1) LIMIT 1
Run Code Online (Sandbox Code Playgroud)

哪里有BINARY在2(topic_id)前?而且,这是什么意思?

Vir*_*ren 7

这是一种比较字节到字节而不是字符到字符的有效方法

假设你有一个名为productsrecord 的数据库表,它有vin_number(某些列名),其值为vin_numbersay的记录123456

现在如果你跑了这个

select * from products where vin= '123456' 
Run Code Online (Sandbox Code Playgroud)

select * from products where vin = '123456 '
Run Code Online (Sandbox Code Playgroud)

两者都会产生相同的结果

注意第二个选择中的空格

但用二进制比较

select * from products where vin= BINARY '123456'
Run Code Online (Sandbox Code Playgroud)

要么

select * from producst where vin = BINARY '123456 '
Run Code Online (Sandbox Code Playgroud)

逐字节匹配是针对字符到字符进行的

所以第一个会产生valid结果

第二个没有结果

这里的链接将进一步帮助您