在SQL Server中扩展的ascii字符搜索

时间:2012-10-19 10:18:25

标签: sql-server extended-ascii

我有一个表,其中一列可能包含包含扩展的数据 ASCII字符(如♥,♦,♣....

当我使用select查询搜索相同内容时,结果集无法准确获取 例如:

create table testasci(id int,name varchar(20))

insert into testasci values(1, 'santosh');
insert into testasci values(2, 'santosh♥');
insert into testasci values(3, 'santosh♦');
insert into testasci values(4, 'santosh2');
insert into testasci values(5, 'santoshσ');
insert into testasci values(6, 'santosh3');

当我搜索具有扩展ASCII字符的任何名称时,如下所示

select * from testasci where name = 'santosh♥'

结果集显示id2,id3。

这也是问号(?)符号而不是原始字符。

有任何帮助吗?对于上述搜索查询,我的结果集应仅显示id2

2 个答案:

答案 0 :(得分:4)

问题是您输入的字符根本不在ASCII范围内。 VARCHAR(20)是数据的错误列数据类型。

  1. 更改表格结构
  2. 更改插入方式
  3. 最后,更改SELECT
  4. 的方式

    修正:

    create table testasci(id int,name nvarchar(20))
    
    insert into testasci values(1,N'santosh');
    insert into testasci values(2,N'santosh♥');
    insert into testasci values(3,N'santosh♦');
    insert into testasci values(4,N'santosh2');
    insert into testasci values(5,N'santoshσ');
    insert into testasci values(6,N'santosh3');
    
    select * from testasci where name like N'santosh♥';
    

    查看varchar(20)的原始定义,我创建了一个SQLFiddle来显示问题。

    select id, a.name, number, ascii(substring(a.name,number,1))
    from testasci a
    join master..spt_values v
      on v.number between 1 and len(a.name) and type='P'
    where a.id in (2,3)
    order by id, number
    

    您会注意到ID 2和3中每个的第8个位置包含ASCII字符(63),它是文字问号(?),而不是您的特殊Unicode字符。所以你一碰到桌子栏就丢了它。

答案 1 :(得分:3)

N 用于搜索扩展的ascii字符

select * from testasci where name like  N'santosh♥'