查询有汉字的行

happysophie 2010-12-01 03:29:48
单位英文WINDOWS2000服务器上的SQL 2000 SERVER是英文版,是商业ERP系统,其排序规则是Latin1_General_BIN。
我的机器装的是中文Windows2003SERVER,按照的是英文SQL 2000 SERVER。
在我机器上运行查询分析器,查询服务器上的某个数据表,假如这个表ITMB的字段为{ITEM,ITEM_DESC}
其中,ITEM全部为字母或数字组成的编码,ITEM_DESC是汉字描述
如果运行查询:SELECT * FROM ITMB WHERE ITEM_DSEC LIKE '%A%',能很顺利得到查询结果。

但如果需要查询包含某些汉字的记录时,得不到相应结果
比如:SELECT * FROM ITMB WHERE ITEM_DESC LIKE '%喷油泵%'

我在语句的后面加上:collate Chinese_PRC_CI_AS,collate LAatin1_General_BIN都不可以!
写成 N'%喷油泵%'也不行
到底怎么回事呢?
...全文
189 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
王向飞 2010-12-02
  • 打赏
  • 举报
回复
看看你服务器的排序规则
xman_78tom 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 happysophie 的回复:]

通过二进制查,不对。
我的语句
select cast('喷油泵' as varbinary(10))

select cast(ITEM_DESC as varbinary(10)),ITEM,ITEM_DESC
from ITMB where ITEM='10402376084'

结果是这样的:
第一个:0x3F3F3F
第二个:0x4144CFB5C1D0C5E7D3……
[/Quote]
这样才有正确的 unicode 编码
select cast(N'喷油泵' as varbinary(10))

不过从 lz 提供的 0x4144CFB5C1D0C5E7D3…… 看,中文的编码应该是 GBK 的,可以使用下面的办法获得

-- 创建 Chinese_PRC_CI_AS 的数据库
use master
go
create database db collate Chinese_PRC_CI_AS;
go

-- 在 db 下转换,获得 gbk 编码
use db
go
select cast('喷油泵' as varbinary(10));

-- 不过既然这样,可以直接在 db 下查询
select * from dbname..itmb where ITEM_DESC like '%喷油泵%';


这样表达,lz 应该能够理解吧。
happysophie 2010-12-02
  • 打赏
  • 举报
回复
别光同情了,还是帮想想办法吧
happysophie 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 abuying 的回复:]
SQL code
SELECT *
FROM ITMB
WHERE convert(nvarchar(max),ITEM_DESC) LIKE '%喷油泵%' collate Chinese_PRC_BIN
-- or LIKE N'%喷油泵%'
[/Quote]
转换为nvarchar后,反倒是乱码了!
只是转换为varchar,仍然查询不到!
happysophie 2010-12-02
  • 打赏
  • 举报
回复
通过二进制查,不对。
我的语句
select cast('喷油泵' as varbinary(10))

select cast(ITEM_DESC as varbinary(10)),ITEM,ITEM_DESC
from ITMB where ITEM='10402376084'

结果是这样的:
第一个:0x3F3F3F
第二个:0x4144CFB5C1D0C5E7D3CD 10402376084 AD系列喷油泵总成

我觉得输入的汉字“喷油泵”的编码肯定与保存在数据表中的汉字的编码不一样,但差在哪里,我也不知道,不知道怎样将编码一致!
xman_78tom 2010-12-02
  • 打赏
  • 举报
回复
select cast(N'喷油泵' as varbinary(10)) 获取的是 unicode 编码

在 排序规则是Chinese_PRC_CI_AS 的数据库下
select cast('喷油泵' as varbinary(10)) 获取的是 GBK 编码

对于 SQL Server
在排序规则是 Chinese_PRC_CI_AS 的数据库下执行的查询,字符编码规则为 GBK。因此客户端输入的汉字都会以 GBK 编码,可以被正确识别。

可惜的是 SQL Server 客户端不能像 oracle 客户端那样自定义字符编码,只能是在哪个数据库下查询,即遵循那个数据库的编码规则。
happysophie 2010-12-02
  • 打赏
  • 举报
回复
我用这条语句:select cast(N'喷油泵' as varbinary(10))
得到的结果是:0xB755B96CF56C

我打开我机器上的SQL(排序规则是Chinese_PRC_CI_AS),用语句查询得到:0xC5E7D3CDB1C3
同第二个:0x4144CFB5C1D0C5E7D3CD 10402376084 AD系列喷油泵总成
(数据库表)数据相比,已经靠谱了,但不是很准确。

我在我机器上的SQL试了一下,用汉字查询是可以的,干脆我把源数据从服务器上IMPORT到我的机器上,能够进行汉字查询了!反正不是实时查询,放我机器上查询得了。

可是,为什么会这样?
xman_78tom 2010-12-01
  • 打赏
  • 举报
回复
试试转换为二进制进行查询,如:


declare @t table (id int identity, s varchar(100));
insert into @t (s) values(CAST(N'AA喷油泵X' as varbinary(100)));
insert into @t (s) values('xxxx');
select id from @t
where CHARINDEX(CAST(N'喷油泵' as varbinary(10)),CAST(s as varbinary(100)))>0;

abuying 2010-12-01
  • 打赏
  • 举报
回复
SELECT * 
FROM ITMB
WHERE convert(nvarchar(max),ITEM_DESC) LIKE '%喷油泵%' collate Chinese_PRC_BIN
-- or LIKE N'%喷油泵%'
linjunf 2010-12-01
  • 打赏
  • 举报
回复
不懂帮顶。。感觉像字符编码问题 一个字符能查出来说明比较容易匹配 个人感觉
dawugui 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 happysophie 的回复:]
甚至我跑到服务器上,打开查询分析器,输入SELECT * FROM ITMB WHERE ITEM_DESC LIKE '%喷油泵%'

也得不到结果,奇怪!
[/Quote]很同情你了.帮顶.
happysophie 2010-12-01
  • 打赏
  • 举报
回复
甚至我跑到服务器上,打开查询分析器,输入SELECT * FROM ITMB WHERE ITEM_DESC LIKE '%喷油泵%'

也得不到结果,奇怪!
happysophie 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wufeng4552 的回复:]
SQL code
--try
SELECT *
FROM ITMB
WHERE ITEM_DESC LIKE '%喷油泵%' collate Chinese_PRC_BIN
[/Quote]
也试过了,还包括database_default
很奇怪的是,当我用Chinese_PRC_CI_AS试时,如果不查找“喷油泵”,而是写'%泵%',倒是能出结果,可是,根本不是名称包含'泵'的记录行,而是没有什么规律的记录行
happysophie 2010-12-01
  • 打赏
  • 举报
回复
这个表大约1万多行记录,每行的描述都是中文,查询显示完全正确,没有乱码现象。

这个数据库是商业数据库,不可能更改数据库的字段类型。
dawugui 2010-12-01
  • 打赏
  • 举报
回复
--1

SELECT * FROM ITMB

能否查询出有中文的记录?即中文显示是否正确?

--2
建议将字段更改为nvarchar型,插入,更新,查询数据时前面加N.
水族杰纶 2010-12-01
  • 打赏
  • 举报
回复
--try
SELECT *
FROM ITMB
WHERE ITEM_DESC LIKE '%喷油泵%' collate Chinese_PRC_BIN

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧