一个奇怪的sql 问题 , 为什么呢???

zhangliangming_87 2010-01-23 01:40:29
有两个表:
tab_user

tab_dd

tbl_user 的结构:


字段名 类型 字段大小 是否为空
id int 4 0
bm varchar 50 1
name varchar 100 1
zw varchar 50 1
zd varchar 50 1
dd varchar 50 1
zzd varchar 50 1
isenable int 4 1
zctime varchar 50 1
ydd varchar 200 1
yzzd varchar 200 1
tp varchar 200 1
Remark ntext 16 1


tbl_dd 的类型为:

 
字段名 类型 字段大小 是否为空
id int 4 0
bm varchar 50 1
name varchar 100 1
remark ntext 16 1



1、 select * from tbl_dd where bm in (0001,0002);

2、 select name from tbl_person where bm in (00003,00004);

执行上面的2句话, 第一条可以执行,

但是第二条是有问题的(将 varchar 值 'wwww' 转换为数据类型为 int 的列时发生语法错误。)

必须是这样 select name from tbl_person where bm in (‘00003’,‘00004’); 才可以执行,

两个表里的bm 都是一个类型的,为什么还会出现执行的时候不一致啊??????

...全文
97 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
扁鵲東南飛 2010-01-23
  • 打赏
  • 举报
回复
谢谢了。知道了。结贴了。
发帖 和 结贴 这进仅用了10分钟……
sunnylyy 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhangliangming_87 的回复:]
那第一条语句和第二条语句,都是一样的啊,为什么

第一条可以不加‘0001’这样写 ,而第二条必须加分号‘’ ,不‘0001’这样写 就不能 执行啊?

当然第一条加 上‘’ 也不出问题,可以执行。
[/Quote]

不加''根本就是错的,当表数据量大的时候,你就可能杯具了。
bm字段是varchar类型的,0001,0002是int型的,int型的优先级别要大于varchar型,数据库在处理的要把整个表bm字段的所有行的值都强制转换成int,然后去和0001,0002比较。如果bm值里面非数字形式的,就会报错。
fyjin99 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunnylyy 的回复:]
引用楼主 zhangliangming_87 的回复:


但是第二条是有问题的(将 varchar 值 'wwww' 转换为数据类型为 int 的列时发生语法错误。)




很明显啊,说明tbl_person表中的bm字段有一个是'wwww',非数字字符串,转换的时候自然也就出错了。
第一句之所以成功是因为bm字段里没有非数字的字符串,可以转换成功。

[/Quote]
应该是这个问题,第一个只是你的巧合罢了,刚好都可以转换。
changshoujun 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guoyueshan 的回复:]
字段定义是varchar 类型的,查询条件就一定要加引号
第一条不加引号也能执行只是巧合,tbl_dd表的bm列正巧存的全是整数。
[/Quote]
是的
扁鵲東南飛 2010-01-23
  • 打赏
  • 举报
回复
那第一条语句和第二条语句,都是一样的啊,为什么

第一条可以不加‘0001’这样写 ,而第二条必须加分号‘’ ,不‘0001’这样写 就不能 执行啊?

当然第一条加 上‘’ 也不出问题,可以执行。
sotom 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guoyueshan 的回复:]
字段定义是varchar 类型的,查询条件就一定要加引号
第一条不加引号也能执行只是巧合,tbl_dd表的bm列正巧存的全是整数。
[/Quote]

有道理
guoyueshan 2010-01-23
  • 打赏
  • 举报
回复
字段定义是varchar 类型的,查询条件就一定要加引号
第一条不加引号也能执行只是巧合,tbl_dd表的bm列正巧存的全是整数。
sunnylyy 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhangliangming_87 的回复:]


但是第二条是有问题的(将 varchar 值 'wwww' 转换为数据类型为 int 的列时发生语法错误。)


[/Quote]

很明显啊,说明tbl_person表中的bm字段有一个是'wwww',非数字字符串,转换的时候自然也就出错了。
第一句之所以成功是因为bm字段里没有非数字的字符串,可以转换成功。

81,114

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧