问一个数据库的基本问题,大牛来回答一下,Where条件查询的准确度问题,与数据类型和数据长度有关吗

xghabc 2012-12-17 04:12:13
如题,
SQL的Where条件的的准确度,与数据类型和数据的长度有关吗

比如
select * from users where userid='int类型'

select * from users where username='nvarchar类型'

select * from users where username='nvarchar(80)类型'


这三种,查询,会不会查询出错啊,比如查询出不是对应的数据啊,特别担心第三种,因为,类型是nvarchar,还是80长度,特长。

会不会啊

大牛来回答一下
...全文
228 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2012-12-19
  • 打赏
  • 举报
回复
参数化就不用,我是说存储过程的时候。
xghabc 2012-12-19
  • 打赏
  • 举报
回复
引用 16 楼 DBA_Huangzj 的回复:
在不抱错的前提下,强烈建议类型要一一对应,类型隐式转换是需要开销的。
是这样吗? StringBuilder strSql=new StringBuilder(); strSql.Append("select count(1) from Users"); strSql.Append(" where UserID=N@UserID"); SqlParameter[] parameters = { new SqlParameter("@UserID", SqlDbType.Int,4) }; parameters[0].Value = UserID;
xghabc 2012-12-19
  • 打赏
  • 举报
回复
引用 16 楼 DBA_Huangzj 的回复:
在不抱错的前提下,强烈建议类型要一一对应,类型隐式转换是需要开销的。
参数化情况下,怎样一一对应类型啊?
xyc880813 2012-12-19
  • 打赏
  • 举报
回复
如果是Nvarchar 那最好还是加上N‘’
黄_瓜 2012-12-18
  • 打赏
  • 举报
回复
关系当然是有的。 长了匹配肯定慢。
發糞塗牆 2012-12-18
  • 打赏
  • 举报
回复
在不抱错的前提下,强烈建议类型要一一对应,类型隐式转换是需要开销的。
xghabc 2012-12-18
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
我试了一下,在简体下是没问题的,当初我是在繁体下试了,的确不行,因为我要同时处理大陆和台湾方面的系统,如果你只是在简体环境下,那可以不加。
我用的是10楼的,参数化查询,也要加N吗??
xghabc 2012-12-18
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
我试了一下,在简体下是没问题的,当初我是在繁体下试了,的确不行,因为我要同时处理大陆和台湾方面的系统,如果你只是在简体环境下,那可以不加。
这样参数化查询,应该不用加N吧???
發糞塗牆 2012-12-17
  • 打赏
  • 举报
回复
我试了一下,在简体下是没问题的,当初我是在繁体下试了,的确不行,因为我要同时处理大陆和台湾方面的系统,如果你只是在简体环境下,那可以不加。
xghabc 2012-12-17
  • 打赏
  • 举报
回复
引用 9 楼 qianjin036a 的回复:
你试一下不就知道了! create table tb(a nvarchar(80)) insert into tb select 'SQL的Where条件的的准确度,与数据类型和数据的长度有关吗' insert into tb select 'select * from users where userid=''int类型''' insert into tb se……
这样参数化查询,应该不用加N吧???
xghabc 2012-12-17
  • 打赏
  • 举报
回复
这样参数化查询,应该不用加N吧???
xghabc 2012-12-17
  • 打赏
  • 举报
回复
我没有加N的,不过我是这样的
引用 7 楼 DBA_Huangzj 的回复:
如果表里面存放的本来就是Unicode数据,我曾经试过不加N是查不出来的,所以我强烈建议加N。
我没有加N的,不过我是这样查询的 StringBuilder strSql=new StringBuilder(); strSql.Append("select count(1) from Users"); strSql.Append(" where UserID=@UserID"); SqlParameter[] parameters = { new SqlParameter("@UserID", SqlDbType.Int,4) }; parameters[0].Value = UserID; return DbHelperSQL.Exists(strSql.ToString(),parameters);
-晴天 2012-12-17
  • 打赏
  • 举报
回复
你试一下不就知道了! create table tb(a nvarchar(80)) insert into tb select 'SQL的Where条件的的准确度,与数据类型和数据的长度有关吗' insert into tb select 'select * from users where userid=''int类型''' insert into tb select 'select * from users where username=''nvarchar类型''' insert into tb select 'select * from users where username=''nvarchar(80)类型''' insert into tb select '这三种,查询,会不会查询出错啊,比如查询出不是对应的数据啊,特别担心第三种,因为,类型是nvarchar,还是80长度,特长。' insert into tb select '会不会啊' insert into tb select '大牛来回答一下' go select * from tb where a='会不会啊' /* a -------------------------------------------------------------------------------- 会不会啊 (1 行受影响) */ go drop table tb
KevinLiu 2012-12-17
  • 打赏
  • 举报
回复
应该不会有问题,SQL Server会做类型转化,你可以在执行计划中看到。
發糞塗牆 2012-12-17
  • 打赏
  • 举报
回复
如果表里面存放的本来就是Unicode数据,我曾经试过不加N是查不出来的,所以我强烈建议加N。
zhengnan2012 2012-12-17
  • 打赏
  • 举报
回复
第一种可能会有问题,后两种没问题。
-晴天 2012-12-17
  • 打赏
  • 举报
回复
这和长度应该没什么关系,只要你后面的字符串符合条件就行了,不管多长,因为你是用相等到来比较的.
以学习为目的 2012-12-17
  • 打赏
  • 举报
回复
不会出错的,但是查询的时候最好是 select * from users where username=N'nvarchar(80)类型' 加N告诉数据库这写字符串是以Unicode格式存储的,会更好一些
發糞塗牆 2012-12-17
  • 打赏
  • 举报
回复
改成: select * from users where userid='int类型'--去掉两个单引号 和 select * from users where username=N'nvarchar类型'--红字部分 和 select * from users where username=N'nvarchar(80)类型'--红字部分 对于第三个查询,只要有符合条件的数据都能出来,和80没关系,但是效率会很低。
發糞塗牆 2012-12-17
  • 打赏
  • 举报
回复
select * from users where username='nvarchar类型' 这个,其实就是select * from users where username='nvarchar(1)类型' 而且你这个查询和下面那个是应该出不了数据的,要改成: select * from users where username=N'nvarchar类型'
加载更多回复(1)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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