在SQL Server数据库中

Sim*_*mon 15 sql t-sql sql-server

在我的数据库中,我有这个char .我想用查询找到它们

Select * 
from Sometable 
where somecolumn like '%?%'
Run Code Online (Sandbox Code Playgroud)

这让我没有结果.

我认为这是ANSI编码

The*_*war 14

使用N如下

 where col like N'%?%'
Run Code Online (Sandbox Code Playgroud)

为什么你认为,你需要N前缀:

前缀Unicode字符串常量,字母为N.如果没有N前缀,则将字符串转换为数据库的默认代码页.此默认代码页可能无法识别某些字符.

感谢马丁史密斯,早些时候,我只测试过一个字符,但它确实有效,但正如马丁指出的那样,它会返回所有字符.

以下查询工作并仅返回预期

select * from #demo where id  like N'%?%' 
COLLATE Latin1_General_100_BIN
Run Code Online (Sandbox Code Playgroud)

演示:

create table #demo
(
id nvarchar(max)
)

insert into #demo
values
(N'?'),
( N'?')
Run Code Online (Sandbox Code Playgroud)

要了解有关unicode的更多信息,请参阅以下链接

http://kunststube.net/encoding/

https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/


Mar*_*ith 6

这是Unicode替换字符符号.

它可以匹配UCS-2编码中的2,048个无效代码点中的任何一个(或U+FFFD符号本身的单个字符).

您可以使用范围和二进制collat​​e子句来匹配它们(演示).

WITH T(N)
AS 
(
SELECT TOP 65536 NCHAR(ROW_NUMBER() OVER (ORDER BY @@SPID))
FROM master..spt_values v1, 
     master..spt_values v2
)
SELECT N 
FROM T
WHERE N LIKE '%[' +  NCHAR(65533) + NCHAR(55296) + '-' + NCHAR(57343) + ']%' COLLATE Latin1_General_100_BIN
Run Code Online (Sandbox Code Playgroud)


jea*_*ean 5

您可以使用ASCII查找该char的ascii代码

Select ascii('?')
Run Code Online (Sandbox Code Playgroud)

并用于CHAR从该代码中检索char并将其组合在LIKE表达式中

Select * from Sometable
where somecolumn like '%'+CHAR(63)+'%'
Run Code Online (Sandbox Code Playgroud)

请注意,您使用的排序规则会影响结果.此外,它还取决于应用程序用于提供数据的编码(UTF-8,UNICODE等).还有你如何存储VARCHAR,或者NVARCHAR对你看到的内容有最后的发言权.

还有更多在这里在这个类似的问题

编辑 @Mark

试试这个简单的测试:

create table sometable(somecolumn nvarchar(100) not null)
GO

insert into sometable
values
 ('12345')
,('123?45')
,('12345')
GO

select * from sometable
where somecolumn like '%'+CHAR(63)+'%'
GO
Run Code Online (Sandbox Code Playgroud)

这只意味着存储的角色赢得了"?" 在这个测试中.

当你看到 这意味着你所看到的应用程序不太确定要打印出来的内容.

它也意味着OP可能需要找出使用查询的char是什么.另请注意,这意味着输出的字符串 可以由不同的字符组成.

CHAR(63)只是一个例子,但你是对的,在ASCII表中这将是一个标准的审讯.

编辑 @Bridge

现在没有时间深入挖掘它,但下面的测试不起作用

Select ascii('?'), CHAR(ascii('?')), UNICODE(N'?'), CHAR(UNICODE(N'?'))
GO

create table sometable(somecolumn nvarchar(100) not null)
GO

insert into sometable
values
 ('12345')
,('123?45')
,('12345')
,('12'+NCHAR(UNICODE(N'?'))+'345')
GO

select * from sometable
where somecolumn like '%'+CHAR(63)+'%'

select * from sometable
where somecolumn like '%'+NCHAR(UNICODE(N'?'))+'%'

GO
Run Code Online (Sandbox Code Playgroud)

  • 此字符超出ASCII范围 - 您需要使用`UNICODE`.查看运行结果:`选择ascii(' '),CHAR(ascii(' ')),UNICODE(N' '),NCHAR(UNICODE(N' '))` (4认同)