β

Mysql prepare statment in 的一个陷阱

涂0实验室 123 阅读

使用prepare statment设置in表达式的参数,结果没有像预想的那样,既没有出错,也没有返回全部的值,而是只返回了逗号分隔的第一值的结果。不知道mysql为什么要这么设计,还不如直接报错了好。

mysql> prepare stmt1 from 'select id,name from user where id in (?)';
mysql> set @a = '4208064,7303964,7303967,7355999';
mysql> execute stmt1 using @a;
+---------+----------+
| id      | name     |
+---------+----------+
| 4208064 | aaaaaaaa |
+---------+----------+
 row in set (0.00 sec)
mysql> select id, name from user where id in (4208064,7303964,7303967,7355999);
+---------+------------+
| id      | name       |
+---------+------------+
| 4208064 | aaaaaaaa   |
| 7303964 | bbbbbbbb   |
| 7303967 | cccccc     |
| 7355999 | ddddddddd  |
+---------+------------+
 rows in set (0.00 sec)

如果非要用, 只能这样:

mysql> prepare stmt1 from 'select id,name from user where id in (?,?,?,?)';
mysql> set @a = '4208064';
mysql> set @b = '7303964';
mysql> set @c = '7303967';
mysql> set @d = '7355999';
mysql> execute stmt1 using @a, @b, @c, @d;
+---------+------------+
| id      | name       |
+---------+------------+
| 4208064 | aaaaaaaa   |
| 7303964 | bbbbbbbb   |
| 7303967 | cccccc     |
| 7355999 | ddddddddd  |
+---------+------------+
 rows in set (0.00 sec)

所以,你要在程序中正确的生成”?,?,?,?”,问好的个数和参数的个数对应。

相关文章:

  1. 一次sql调优
  2. mysql用sum()等函数后始终返回一行
  3. Mysql下生成序列的方法
  4. mysql sql 语句中的大小写规则
  5. SQL select语句执行顺序

YARPP
作者:涂0实验室
在我的小实验室里捣鼓程序,捣鼓人生
原文地址:Mysql prepare statment in 的一个陷阱, 感谢原作者分享。