我有一个表,其中一列可能包含包含扩展的数据
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
答案 0 :(得分:4)
问题是您输入的字符根本不在ASCII范围内。 VARCHAR(20)
是数据的错误列数据类型。
修正:
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♥'