MySQL查询,其中id=id\u产品错误

MySQL查询,其中id=id\u产品错误,mysql,Mysql,我正在nodejs网络应用程序中使用mysql。我不明白为什么当我要求一些id(键)时,它会给我不止一个结果 当我: SELECT * FROM products WHERE id = 1; 如果发生这种情况,我会得到3个结果,但我只想要1个: 1、001和0000001 我只需要一个产品的信息(id:1,在本例中为) 我如何解决这个问题? ID类型为varchar(20) 如果我使用像而不是=我的结果会改变: SELECT * FROM products WHERE id LIKE 0000

我正在nodejs网络应用程序中使用mysql。我不明白为什么当我要求一些
id
(键)时,它会给我不止一个结果

当我:

SELECT * FROM products WHERE id = 1;
如果发生这种情况,我会得到3个结果,但我只想要1个:
1
001
0000001

我只需要一个产品的信息(
id:1,在本例中为

我如何解决这个问题?
ID类型为varchar(20)

如果我使用
而不是
=
我的结果会改变:

SELECT * FROM products WHERE id LIKE 0000001;
我得到的是id=
1
的信息,而不是
0000001
。不知道为什么

谢谢,MySQL(以及现实世界)中的数字没有前导零。字符串可以

因此,您只需使用正确的类型进行比较:

SELECT *
FROM products
WHERE id = '1';
原始查询的结果是
id
被转换为一个数字。和
'1'
'001'
和'
0000001'
都转换为相同的整数--
1
。因此,所有三个都通过了过滤器。

MySQL(以及现实世界)中的数字没有前导零。字符串可以

因此,您只需使用正确的类型进行比较:

SELECT *
FROM products
WHERE id = '1';

原始查询的结果是
id
被转换为一个数字。和
'1'
'001'
和'
0000001'
都转换为相同的整数--
1
。因此,所有三个都会通过过滤器。

问题在于,您正在使用整数强制转换按varchar类型查找

尝试向id参数添加引号:

SELECT * FROM products WHERE id = '1';
如果要添加带前导零的整数ID,建议您使用zerofill选项:


如果要使用字母数字值,则将ID类型保留为varchar,但请记住将搜索参数括在引号中。

问题在于,您正在使用整数强制转换按varchar类型查找

尝试向id参数添加引号:

SELECT * FROM products WHERE id = '1';
如果要添加带前导零的整数ID,建议您使用zerofill选项:


如果要使用字母数字值,则将ID类型保留为varchar,但请记住将搜索参数括在引号中。

查询的
WHERE
子句包含文字数字值与字符串(列
ID
)的比较

当需要比较不同类型的值时,MySQL使用几个规则将一个或两个值转换为公共类型

有些问题是不直观的。最后一条规则是唯一匹配整数与字符串比较的规则:

在所有其他情况下,参数作为浮点(实数)数进行比较

当它们转换为浮点(实数)数时,
1
(整数)、
'1'
'0001'
'0000001'
都是相等的

为了获得精确匹配,您在查询中输入的文本值必须与列
id
(即字符串)具有相同的类型。查询应为:

SELECT * FROM products WHERE id = '1'

查询的
WHERE
子句包含文本数值与字符串(列
id
)的比较

当需要比较不同类型的值时,MySQL使用几个规则将一个或两个值转换为公共类型

有些问题是不直观的。最后一条规则是唯一匹配整数与字符串比较的规则:

在所有其他情况下,参数作为浮点(实数)数进行比较

当它们转换为浮点(实数)数时,
1
(整数)、
'1'
'0001'
'0000001'
都是相等的

为了获得精确匹配,您在查询中输入的文本值必须与列
id
(即字符串)具有相同的类型。查询应为:

SELECT * FROM products WHERE id = '1'

您的
id
列的数据类型是什么?我的答案已经被另一个用户以类似的形式粘贴到下面。您的
id
列的数据类型是什么?我的答案已经被另一个用户以类似的形式粘贴到下面。id的数据类型是varchar。所以它不起作用。有什么办法可以解决吗?或者这是一个糟糕的实现?@Baumann。修理什么?这似乎回答了你的问题。如果需要另一个值,则将其用作字符串:
'0001'
。id的数据类型为varchar。所以它不起作用。有什么办法可以解决吗?或者这是一个糟糕的实现?@Baumann。修理什么?这似乎回答了你的问题。如果您需要另一个值,则将其用作字符串:
'0001'
。您是对的。这是个老项目,我得改进一下。我不熟悉代码和数据库。谢谢,你说得对。这是个老项目,我得改进一下。我不熟悉代码和数据库。谢谢,我现在拿到了。解释得很好,我现在明白了。解释得很好。