Хм, почему поиск по '2' или '2' возвращает одну и ту же запись? - PullRequest
9 голосов
/ 05 апреля 2010

простите мой вопрос новичка, но почему поиск по '2' или '2' в Mysql возвращает ту же запись?

Например:

Скажем, у меня есть запись со строковым полем с именем 'slug', и значением является '2'. И следующие SQL возвращает ту же запись.

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

Ответы [ 3 ]

13 голосов
/ 05 апреля 2010

Это связано с сопоставлением вашей базы данных:

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)
0 голосов
/ 05 апреля 2010

Что такое тип слизня? я думаю, что это числовой. Если это так, то mysql приводит его к типу int, и любые пути '2' или '2' становятся равными 2. Это не случится с типами данных string.

0 голосов
/ 05 апреля 2010

они не должны возвращать одну и ту же строку для равенства, но если вы используете like, вы, вероятно, получаете ту же строку. использование like mysql будет использовать нечеткое сопоставление, поэтому 2 и be будут одинаковыми (если не все они являются формой 2, не так ли?)

...