热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SqlServer查询遇到特殊字符'ς',无法查询到记录

查询语句如下whereID2ς**只要条件字符中包含ς字符,就查询不到结果。
查询语句如下 where ID = '2ς**'
只要条件字符中包含ς 字符,就查询不到结果。

46 个解决方案

#1


引用楼主 xinhe1170679 的帖子:
查询语句如下 where ID = '2ς**' 
只要条件字符中包含ς 字符,就查询不到结果。

where CHARINDEX('ς',ID)>0

#2


try

where ID = N'2ς**' 

#3


where id =  N'2ς**' 

#4


还没遇到过。

#5


2,3楼的办法试试。

#6


谢谢大家,明天去试试

#7


为什么要加 N 呢

#8


引用 7 楼 xinhe1170679 的回复:
为什么要加 N 呢

Unicode编码,

#9



CREATE TABLE TBTEST(ID VARCHAR(10))
INSERT TBTEST VALUES('AFD2ς**')
INSERT TBTEST VALUES('2FDς**')
INSERT TBTEST VALUES('FDRE2ς**')
INSERT TBTEST VALUES('2ςFD**')
INSERT TBTEST VALUES('2ς**FD')
INSERT TBTEST VALUES('2ς*FD*')
INSERT TBTEST VALUES('24546564**')

SELECT * FROM TBTEST WHERE CHARINDEX('ς',ID)>0
/*ID         
---------- 
AFD2?**
2FD?**
FDRE2?**
2?FD**
2?**FD
2?*FD*

(所影响的行数为 6 行)

*/

#10


引用 9 楼 SQL77 的回复:
SQL code
CREATE TABLE TBTEST(ID VARCHAR(10))
INSERT TBTEST VALUES('AFD2ς**')
INSERT TBTEST VALUES('2FDς**')
INSERT TBTEST VALUES('FDRE2ς**')
INSERT TBTEST VALUES('2ςFD**')
INSERT TBTEST VALUES('2ς**FD')
INSERT TBTEST VALUES('2ς*FD*')
INSERT TBTEST VALUES('24546564**')

SELECT * FROM TBTEST WHERE CHARINDEX('ς',ID)>0
/*ID         
---------- 
AFD2?**
2FD?**
FDRE2?**
2?FD**


要进行精确查找,该怎么办?

#11


学习

#12


这个有点妙 学习

#13


引用 10 楼 xinhe1170679 的回复:
引用 9 楼 SQL77 的回复:
SQL code 
CREATE TABLE TBTEST(ID VARCHAR(10)) 
INSERT TBTEST VALUES('AFD2ς**') 
INSERT TBTEST VALUES('2FDς**') 
INSERT TBTEST VALUES('FDRE2ς**') 
INSERT TBTEST VALUES('2ςFD**') 
INSERT TBTEST VALUES('2ς**FD') 
INSERT TBTEST VALUES('2ς*FD*') 
INSERT TBTEST VALUES('24546564**') 

SELECT * FROM TBTEST WHERE CHARINDEX('ς',ID)>0 
/*ID        
---------- 
A…

用REPLACE 试试,将里面的特殊字符用空格代替,查询条件里也用空格代替!!

#14


9楼的测试根本就不对。

首先,ς这个字符,不被中文字符集所支持, 所以在中文操作系统上安装的sqlserver如果用默认排序规则chinese_rpc...,且用text,char,varchar之类数据类型,那么写入ς这个字符时,写入就是乱码。

9楼自己可以试一下,
SELECT * FROM TBTEST WHERE CHARINDEX('?',ID)>0
是不是跟你上面那句查到的结果一样?


楼主要想查到正确的结果, 做法无非两种:

1,存储数据时,不考滤排序规则,但用unicode方式编码,即字段用nvarchar,nchar,ntext之类,赋值时加N前辍,比如:
CREATE TABLE TBTEST(ID NVARCHAR(10))
INSERT TBTEST VALUES(N'AFD2ς**')
INSERT TBTEST VALUES(N'2FDς**')
INSERT TBTEST VALUES(N'FDRE2ς**')
INSERT TBTEST VALUES(N'2ςFD**')
INSERT TBTEST VALUES(N'2ς**FD')
INSERT TBTEST VALUES(N'2ς*FD*')
INSERT TBTEST VALUES(N'24546564**')

SELECT * FROM TBTEST WHERE CHARINDEX(N'ς',ID)>0

/*
AFD2ς**
2FDς**
FDRE2ς**
2ςFD**
2ς**FD
2ς*FD*

*/

DROP TABLE TBTEST



2,方法2,建表时及查询时,指定支持这个字符ς的排序规则。这个字符,是希腊字符,所以指定Greek排序规则即可。如

CREATE TABLE TBTEST(ID VARCHAR(10) COLLATE Greek_CI_AI)
INSERT TBTEST VALUES('AFD2ς**')
INSERT TBTEST VALUES('2FDς**')
INSERT TBTEST VALUES('FDRE2ς**')
INSERT TBTEST VALUES('2ςFD**')
INSERT TBTEST VALUES('2ς**FD')
INSERT TBTEST VALUES('2ς*FD*')
INSERT TBTEST VALUES('24546564**')

SELECT * FROM TBTEST WHERE CHARINDEX('ς' COLLATE Greek_CI_AI,ID)>0

/*
AFD2ς**
2FDς**
FDRE2ς**
2ςFD**
2ς**FD
2ς*FD*

*/

DROP TABLE TBTEST



当然,上面两个例子都用的charindex,其它like,patindex都是一样的。

#15


引用 14 楼 fcuandy 的回复:
9楼的测试根本就不对。 

首先,ς这个字符,不被中文字符集所支持, 所以在中文操作系统上安装的sqlserver如果用默认排序规则chinese_rpc...,且用text,char,varchar之类数据类型,那么写入ς这个字符时,写入就是乱码。 

9楼自己可以试一下, 
SELECT * FROM TBTEST WHERE CHARINDEX('?',ID)>0 
是不是跟你上面那句查到的结果一样? 


楼主要想查到正确的结果, 做法无非两种: 

1,存储数据时,不考滤排序规则,但…


呵呵,兄弟是一样啊,因为它们的ASCII码值一样!!
按兄弟说的,输入值都得加N才会支持,学习!!!

#16


引用 14 楼 fcuandy 的回复:
9楼的测试根本就不对。 

首先,ς这个字符,不被中文字符集所支持, 所以在中文操作系统上安装的sqlserver如果用默认排序规则chinese_rpc...,且用text,char,varchar之类数据类型,那么写入ς这个字符时,写入就是乱码。 

9楼自己可以试一下, 
SELECT * FROM TBTEST WHERE CHARINDEX('?',ID)>0 
是不是跟你上面那句查到的结果一样? 


楼主要想查到正确的结果, 做法无非两种: 

1,存储数据时,不考滤排序规则,但…
受教

#17


学知识了。。。我顶~~~~~~~~~~

#18


受教

#19


感谢,又了解一个知识点

#20


留爪

#21


引用 14 楼 fcuandy 的回复:
方法2,建表时及查询时,指定支持这个字符ς的排序规则。这个字符,是希腊字符,所以指定Greek排序规则即可

学习了,请问这个字符在希腊文中代表什么啊?很想知道阿!

#22


CHARINDEX('ς',ID)>0

#23


引用 21 楼 orochi_gao 的回复:
引用 14 楼 fcuandy 的回复:
方法2,建表时及查询时,指定支持这个字符ς的排序规则。这个字符,是希腊字符,所以指定Greek排序规则即可

学习了,请问这个字符在希腊文中代表什么啊?很想知道阿!



其实就是希格姆, EXCEL中求合的那个符号,只不过这个是大写。 也就是 英文字母 M 逆时针转90度。

#24


14楼的不错,学习。

#25


where CHARINDEX('ς',ID)>0

#26


看出来了,14楼高人 

#27


引用 23 楼 fcuandy 的回复:
引用 21 楼 orochi_gao 的回复:
引用 14 楼 fcuandy 的回复: 
方法2,建表时及查询时,指定支持这个字符ς的排序规则。这个字符,是希腊字符,所以指定Greek排序规则即可 

学习了,请问这个字符在希腊文中代表什么啊?很想知道阿! 
 


其实就是希格姆, EXCEL中求合的那个符号,只不过这个是大写。 也就是 英文字母 M 逆时针转90度。

哦,谢了。

#28


来学习的

#29


又见FC

#30


学习了 

#31


应该是unicode的问题

#32


我们需要之中执着的精神。

#33


那个字符为双字节, 要用unicode的形式, 也就是在字符的前面加上前缀N, MSSQL就认为后面的串为双字节的
如 N'ABC', N'我爱你', N'2ς**' 等等

所以LZ只需在前面加个N就可以搞定了, 凡是双字节的都可以这样做, 当然单字节这样写也不会错

where ID = N'2ς**' 

#34


学习学习

#35


where ID like '%2ς%' 用这个试试吧。

#36


都是高人啊,而且楼上对技术的追求都是精益求精啊。

#37


学习!

#38


和好 学习下

#39


和好 学习下

#40


.

#41


学习

#42


好 学习

#43


高人。。。

#44


[Quote=引用 14 楼 fcuandy 的回复:]
9楼的测试根本就不对。 

首先,ς这个字符,不被中文字符集所支持, 所以在中文操作系统上安装的sqlserver如果用默认排序规则chinese_rpc...,且用text,char,varchar之类数据类型,那么写入ς这个字符时,写入就是乱码。 

9楼自己可以试一下, 
SELECT * FROM TBTEST WHERE CHARINDEX('?',ID)>0 
是不是跟你上面那句查到的结果一样? 


CREATE TABLE TBTEST(ID NVARCHAR(10))
INSERT TBTEST VALUES(N'AFD2ς**')
INSERT TBTEST VALUES(N'2FDς**')
INSERT TBTEST VALUES(N'FDRE2ς**')
INSERT TBTEST VALUES(N'2ςFD**')
INSERT TBTEST VALUES(N'2ς**FD')
INSERT TBTEST VALUES(N'2ς*FD*')
INSERT TBTEST VALUES(N'24546564**')

SELECT * FROM TBTEST WHERE CHARINDEX(N'ς',ID)>0

查询的时候+N查不出来,不+N才能查出来

#45


学习!!!

#46


收获不少,谢谢14楼了

推荐阅读
author-avatar
百变精灵_tb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有