汉字的模糊匹配问题

[复制链接]
查看11 | 回复9 | 2005-2-28 12:57:00 | 显示全部楼层 |阅读模式
当要求汉字进行模糊匹配的时候,由于oracle是采用存储的字节流进行查找的,所以有存在着一个汉字的后半截和另一个汉字的前半截拼起来正好构成某个汉字。这样则存在着模糊匹配出现错误的可能性。碰巧,今天我在生产数据库应用中遭遇了好几个。

SQL> selectPRODUCTION_SERVICE fromcompany whereview_name = '泰兴市佰信纺织有限公司';

PRODUCTION_SERVICE
------------------------------------------------------------------------------------------------------------------------
牛仔布;色织布;弹力牛仔布;竹节牛仔布;彩色牛仔布;提花牛仔布;牛仔服;牛仔裤;纱卡;灯蕊绒;
SQL>
SQL> selectcount(*)
fromcompany
where view_name = '泰兴市佰信纺织有限公司'
and PRODUCTION_SERVICE like '%'||'蟹'||'%';
234
COUNT(*)
----------
1

SQL> select PRODUCTION_SERVICE, dump(PRODUCTION_SERVICE),dump( '蟹')
2fromcompany
where view_name = '泰兴市佰信纺织有限公司'
34;
PRODUCTION_SERVICE
------------------------------------------------------------------------------------------------------------------------
DUMP(PRODUCTION_SERVICE)
------------------------------------------------------------------------------------------------------------------------
DUMP('蟹')
---------------------
牛仔布;色织布;弹力牛仔布;竹节牛仔布;彩色牛仔布;提花牛仔布;牛仔服;牛仔裤;纱卡;灯蕊绒;
Typ=1 Len=84: 197,163,215,208,178,188,59,201,171,214,175,178,188,59,181,175,193,166,197,163,215,208,178,188,59,214,241,1
89,218,197,163,215,208,178,188,59,178,202,201,171,197,163,215,208,178,188,59,204,225,187,168,197,163,215,208,178,188,59,
197,163,215,208,183,254,59,197,163,215,208,191,227,59,201,180,191,168,59,181,198,200,239,200,222,59
Typ=96 Len=2: 208,183
SQL> select1 fromdualwhere'仔服'like'%'||'蟹'||'%';
1
----------
1
SQL>

原文参考
http://blog.itpub.net/post/330/3766
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
SQL> select 1 from dual where '仔服' like '%'||'蟹'||'%';
no rows selected
Elapsed: 00:00:00.00

怎么没选出来呀?〉
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
我的字符集是 us7ascii


不同字符集是不一样的
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
有点意思


回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
C:\>set NLS_LANG=AMERICAN_AMERICA.us7ascii
C:\>sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on Mon Oct 25 17:48:39 2004
Copyright (c) 1982, 2002, Oracle Corporation.All rights reserved.
SQL> conn sys/admin as sysdba
Connected.
SQL> select 1 from dual where '仔服' like '%'||'蟹'||'%';
1
----------
1
SQL>
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
呵呵,那以后有类似的应用就要小心了.
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
最初由 biti_rainy 发布
[B]我的字符集是 us7ascii


不同字符集是不一样的 [/B]

我觉得关键是由于ascii字符集没有真正支持中文。
SQL> select value$ from sys.props$ where name = 'NLS_CHARACTERSET';
VALUE$
---------------------------------------------------------------------
ZHS16GBK
SQL> select 1 from dual where '仔服' like '%'||'蟹'||'%';
未选定行
SQL> select dump('仔服') from dual;
DUMP('仔服')
-----------------------------
Typ=96 Len=4: 215,208,183,254
SQL> select dump ('蟹') from dual;
DUMP('蟹')
---------------------
Typ=96 Len=2: 208,183
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
>select 1 from dual where '仔服' like '%'||'蟹'||'%';
1
----------
1
>select value$ from sys.props$ where name = 'NLS_CHARACTERSET';
VALUE$
----------------------------------------------------------------
----------------------------------------
ZHS16GBK
我觉得这和数据库版本有关系。我的数据库是oracle816,可能oracle在后续版本中修正了这个BUG
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
最初由 cgh_chen 发布
[B]>select 1 from dual where '仔服' like '%'||'蟹'||'%';
1
----------
1
>select value$ from sys.props$ where name = 'NLS_CHARACTERSET';
VALUE$
----------------------------------------------------------------
----------------------------------------
ZHS16GBK
我觉得这和数据库版本有关系。我的数据库是oracle816,可能oracle在后续版本中修正了这个BUG [/B]

SQL*Plus: Release 8.0.6.0.0 - Production on Tue Oct 26 10:14:46 2004
(c) Copyright 1999 Oracle Corporation.All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> select 1 from dual where '仔服' like '%'||'蟹'||'%';
no rows selected
SQL> select value$ from sys.props$ where name = 'NLS_CHARACTERSET';
VALUE$
--------------------------------------------------------------------------------
ZHS16CGB231280
那我的806怎么也没有啊



回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
一般的说来,中文的字符集应该是正常的
不是中文的字符集,则oracle在匹配的时候不能判别这相临字节是不是同一个字符
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行