none
关于nchar使用LIKE 的问题 RRS feed

  • 问题

  • DECLARE @tmpTable TABLE (col1 char(3),col2 nchar(3),col3 varchar(3),col4 nvarchar(3))
    INSERT INTO @tmpTable
    VALUES ('a','a','a','a'),('b','b,'b','b')

    1:SELECT * FROM @tmpTable WHERE col1 LIKE 'a'

    2:SELECT * FROM @tmpTable WHERE col2 LIKE 'a'

    3:SELECT * FROM @tmpTable WHERE col2 LIKE 'a  '

    4:SELECT * FROM @tmpTable WHERE col3 LIKE 'a'

    5:SELECT * FROM @tmpTable WHERE col4 LIKE 'a'

    此例中1,3,4,5可搜出结果,但2搜不出结果,请高人指点,nchar类型与其它类型特别是char类型在此处用法上的关键区别

     
    2013年6月7日 6:26

答案

  • 我刚才解释的不够清楚,char和nchar都存在尾随空格。

    但是当unicode数据(nchar或nvarchar)与like 一起使用时,尾随空格有意义。

    但是对于非unicode数据,尾随空格无意义。

    参考官方说明:

    http://msdn.microsoft.com/zh-cn/library/ms179859.aspx

    有这样一段文字:

    使用 LIKE 的模式匹配

    LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。 match_expressionpattern 和 escape_character,如果存在)均为 ASCII 字符数据类型,则执行 ASCII 模式匹配。 <sentencetext xmlns="http://www.w3.org/1999/xhtml">如果任何一个参数为 Unicode 数据类型,则所有参数都将转换为 Unicode,并执行 Unicode 模式匹配。</sentencetext> nchar 或nvarchar 数据类型)与 LIKE 一起使用时,尾随空格有意义;但对非 Unicode 数据,尾随空格则没有意义。 Unicode LIKE 与 ISO 标准兼容。 ASCII LIKE 与 SQL Server 的早期版本兼容。

    2013年6月7日 7:48
    版主

全部回复

  • SELECT * FROM @tmpTable WHERE col2 LIKE cast('a' as nchar(3))

    要转一下吧,默认不是NCHAR型

    2013年6月7日 6:35
  • SELECT * FROM @tmpTable WHERE col2 LIKE cast('a' as nchar(3))

    要转一下吧,默认不是NCHAR型


    转换了确实可以,但是SELECT * FROM @tmpTable WHERE col2 LIKE cast('a' as nchar(2))搜不出结果,Unicode字符与非Unicode在like比较上难道有区别?但是varchar与nvarchar又可以搜到。难道是固定长度的Unicode字符比较特殊?
    2013年6月7日 6:50
  • 我估计是尾随空格的问题。

    SELECT * FROM @tmpTable WHERE col2 LIKE 'a__'
    SELECT * FROM @tmpTable WHERE col2 LIKE 'a%'

    这样就应该可以查询出来了。

    2013年6月7日 7:43
    版主
  • 我刚才解释的不够清楚,char和nchar都存在尾随空格。

    但是当unicode数据(nchar或nvarchar)与like 一起使用时,尾随空格有意义。

    但是对于非unicode数据,尾随空格无意义。

    参考官方说明:

    http://msdn.microsoft.com/zh-cn/library/ms179859.aspx

    有这样一段文字:

    使用 LIKE 的模式匹配

    LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。 match_expressionpattern 和 escape_character,如果存在)均为 ASCII 字符数据类型,则执行 ASCII 模式匹配。 <sentencetext xmlns="http://www.w3.org/1999/xhtml">如果任何一个参数为 Unicode 数据类型,则所有参数都将转换为 Unicode,并执行 Unicode 模式匹配。</sentencetext> nchar 或nvarchar 数据类型)与 LIKE 一起使用时,尾随空格有意义;但对非 Unicode 数据,尾随空格则没有意义。 Unicode LIKE 与 ISO 标准兼容。 ASCII LIKE 与 SQL Server 的早期版本兼容。

    2013年6月7日 7:48
    版主
  • 谢谢maco wang ,看了参考,明白了!
    2013年6月7日 7:53