SqlServer 查询遇到特殊字符 'ς',无法查询到记录 trywhere ID = N'2ς**' 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 where id = N'2ς**' 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?**FD2?*FD*(所影响的行数为 6 行)*/ 用REPLACE 试试,将里面的特殊字符用空格代替,查询条件里也用空格代替!! 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ς**FD2ς*FD**/DROP TABLE TBTEST2,方法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ς**FD2ς*FD**/DROP TABLE TBTEST当然,上面两个例子都用的charindex,其它like,patindex都是一样的。 呵呵,兄弟是一样啊,因为它们的ASCII码值一样!!按兄弟说的,输入值都得加N才会支持,学习!!! 其实就是希格姆, EXCEL中求合的那个符号,只不过这个是大写。 也就是 英文字母 M 逆时针转90度。 那个字符为双字节, 要用unicode的形式, 也就是在字符的前面加上前缀N, MSSQL就认为后面的串为双字节的如 N'ABC', N'我爱你', N'2ς**' 等等所以LZ只需在前面加个N就可以搞定了, 凡是双字节的都可以这样做, 当然单字节这样写也不会错where ID = N'2ς**' where ID like '%2ς%' 用这个试试吧。 [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才能查出来 如何读取注册表 一道关于T-SQL语言程序设计的题目 以下这句想获取月份:请高手帮助改一下。(存储过程) 求SQL语句(随机组合),期待你的回答!!!! 同时导入多个文本 一个很简单的问题,关于SQL语句的语法 进程未能在“Subscriber”上进行生成.请指教怎样解决 关于存储过程中构造一个字段排序的问题! 不好意思,请斑竹手下留情,俺谢一位这儿的人:) 在线等待,急, 为什么不能连接到远程的 analyse service 一个复杂的sql语句,求优化方案 下拉框为何不显示数据?
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 行)*/
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都是一样的。
呵呵,兄弟是一样啊,因为它们的ASCII码值一样!!
按兄弟说的,输入值都得加N才会支持,学习!!!
如 N'ABC', N'我爱你', N'2ς**' 等等所以LZ只需在前面加个N就可以搞定了, 凡是双字节的都可以这样做, 当然单字节这样写也不会错where ID = N'2ς**'
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才能查出来