不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。

  今天在修改郑州家政网的时候,遇到一个很郁闷的事情“不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。”,本人使用的MSSQL 原来使用ACCESS数据库的时候啥时候也没有遇到过这样的问题啊!原来还以为是自己的SQL语句写错了,立刻在sql 查询分析器中进行测试,发现可以正常分析查询,但是想要执行的时候就出现了“服务器: 消息 306,级别 16,状态 1,行 1
不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。”郁闷!赶快上网查找,发现在MS Sql数据库中,如果table中的某column数据类型设计为ntext或者text,做查询匹配时,用=操作会引起:

  The data types ntext and varchar are incompatible in the equal to operator. 或 不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。

因为 用‘’引起来的字符串默认的数据类型为nvarchar,ntext类型的数据与nvarcahr类型数据不能直接做比较。

  比如,如下一个查询:

  select * from myTable where myColumnOne = 'some value'

  其中,myColumnOne数据类型为ntext,执行该语句后,就会出现上述红色标记的错误。

解决办法如下

一:将表里的字段类型为text或是ntext的改为varchar类型;
二:类型转换
  将所要匹配的字段转换成相同的数据类型,对例中可改写为:
  select * from myTable where cast( myColumnOne as nvarchar(max) ) = 'some value'
  转换的长度可以根据实际情况进行指定,或者使用最大值max由sql自己处理。
三:使用Like关键字
  like关键字做条件查询已经很熟悉,对例中进行改写:
  select * from myTable where myColumnOne like 'some value'
四:Patindex
  此关键字是在sql2005中引入的,在条件查询中用于模式匹配,对例中改写:
  select * from myTable where patindex( 'some value', myColumnOne ) > 0

另外查看了下mssql中text/char/varchar/ntext/nchar/nvarchar的区别(主要是查询时的性能) 发现如下:

如果希望列中所有数据项的大小接近一致,则使用   char/nchar。nvarchar/nchar最多支持4000。
如果希望列中数据项的大小差异很大,则使用   varchar/nvarchar。varchar/char最多支持8000。
如果varchar够用的话,text最好不要用,查询效率会很低。
'n '开头的是unicode,是国际标准,支持多国语言
text最好不用,只适于存储大数据,还要用专门的函数来读写更新,但是也不是任何时候都是和使用文本型数据,因为他非常占空间,也非常消耗服务器,随处乱用后果不堪设想!因为即使你像一个文本型字段输入了一个空值他都会占用2K的空间!

OK!就这么多吧!这下又学习了!

参与评论