嗯,为啥用'2'或'2'查找返回相同的记录?

Posted

技术标签:

【中文标题】嗯,为啥用\'2\'或\'2\'查找返回相同的记录?【英文标题】:Hmm, why finding by '2' or '2' return the same record?嗯,为什么用'2'或'2'查找返回相同的记录? 【发布时间】:2011-02-04 08:55:14 【问题描述】:

请原谅我的新手问题,但是为什么在 mysql 中通过 '2' 或 '2' 查找返回相同的记录?

例如:

假设我有一个名为'slug'的字符串字段的记录,值为'2'。下面的 SQL 会返回相同的记录。

SELECT * From articles WHERE slug='2'  
SELECT * From articles WHERE slug='2' 

【问题讨论】:

+1 第二个 2 字符到底是什么? :) @Jørn U+FF12 全宽两位数。 【参考方案1】:

这与你的数据库的排序有关:

mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

mysql> SELECT '2'='2';
+-----------+
| '2'='2' |
+-----------+
|         0 |
+-----------+
1 row in set (0.00 sec)

mysql> SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT '2'='2';
+-----------+
| '2'='2' |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

【讨论】:

【参考方案2】:

它们不应该返回相同的行来表示相等,但是如果您使用like,您可能会得到相同的行。使用likemysql会使用模糊匹配,所以2和2是一样的(毕竟都是2的形式,不是吗?)

【讨论】:

是的,mysql确实返回了相同的记录,正如答案所述,这与排序规则有关。【参考方案3】:

slug 的数据类型是什么?我认为它的数字之一。如果是这样,这里 mysql 确实将其转换为 int,并且任何方式 '2' 或 '2' 都将变为 2。这不会发生在字符串数据类型中。

【讨论】:

以上是关于嗯,为啥用'2'或'2'查找返回相同的记录?的主要内容,如果未能解决你的问题,请参考以下文章

检查为啥记录在 SQL 中返回两次

为啥不能用相同的签名声明两个方法,即使它们的返回类型不同? [复制]

为啥 Math.floor 返回一个双精度值?

为啥相同的 SQL 查询可能在 SQL Developer 和代码中返回不同的结果?

为啥 $var 和 vars.get('var') 没有返回相同的值?

为啥我对 QueueConnectionFactory 的 JNDI 查找返回 null?