riwen

==26个日文片假名Access搜索(80040e14/内存溢出)的解决==


当字段内包含了26个日文字符任意一个多个,就会致在SQL句中包含了
[
字段] like '%aaaaa%' inStr(1,[字段],'aaaaa',1)>0
这样查询时,毫无道理的出
"Microsoft JET Database Engine
错误 '80040e14' 内存溢出"错误
其他Jet SQL函数命令未作测试,大概与字符搜索定位匹配相的都可能出

搜索相关资料得知被微工程师证实Accessbug,可能是系都是微东东
vbs inStr(1,日文平假名,"aaaaa",1)依然要出现错误
Microsoft VBScript
运行时错误 错误 ' 800a 0005' 无效的用或参数: 'instr'


没有搜索,几个字符出Access论坛网站搜索无法,何等痛苦
昨天一朋友大叫怪事,他的音数据无法搜索了,只有30000记录时是好的
毫无疑,日文片假名是,花几分把有包含上面的日文替"?"搜索利恢
找来论坛程序用群最大的dvBBS AC版本 7.0SP2 测试,个日文帖后 致无法搜索并且运行问题
线上去搜索 '80040e14' 内存溢出" 错误 多的是!

简单有效的解决:
对这26个字符编码和解,可能效率感不理想,测试下来问题不大,速度影响不是太大

编码:

Function Jencode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
  Jencode=""
  Exit function
end if
dim F,i,E
' F=array("
","","","","","","","","","",_
'             "
","","","","","","","","","","","",_
'             "
","","","")
  E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;","Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;","Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;","Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
  F=array(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_
    chr(-23118),chr(-23114),chr(-23112),chr(-23110),_
    chr(-23099),chr(-23097),chr(-23095),chr(-23075),_
    chr(-23079),chr(-23081),chr(-23085),chr(-23087),_
    chr(-23052),chr(-23076),chr(-23078),chr(-23082),_
    chr(-23084),chr(-23088),chr(-23102),chr(-23104),_
    chr(-23106),chr(-23108))
  Jencode=iStr
  for i=0 to 25
   Jencode=replace(Jencode,F(i),E(i))
  next
End Function

:

Function Juncode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
  Juncode=""
  Exit function
end if
dim F,i,E
' F=array("
","","","","","","","","","",_
'             "
","","","","","","","","","","","",_
'             "
","","","")
E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;","Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;","Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;","Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
  F=array(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_
    chr(-23118),chr(-23114),chr(-23112),chr(-23110),_
    chr(-23099),chr(-23097),chr(-23095),chr(-23075),_
    chr(-23079),chr(-23081),chr(-23085),chr(-23087),_
    chr(-23052),chr(-23076),chr(-23078),chr(-23082),_
    chr(-23084),chr(-23088),chr(-23102),chr(-23104),_
    chr(-23106),chr(-23108))
  Juncode=iStr
for i=0 to 25
  Juncode=replace(Juncode,E(i),F(i))'

next
End Function

注意,如果直接使用字符不方便(windows没装日文支持),掉的部分提供有 chr(-23804) ..这样的定

这样
1.
单输入保存,使用Jencode()26个字符先编码再保存(26个字符,经过全部测试87个平假名89个片假名最终认)

chr(-23116) 编码为  Jn1;
2.
,使用 Juncode() 函数行解,原日文片假名
3.
搜索关键,也要使用 Jencode() 编码后再放入 like
where [Topic] like '%Jencode(kewwords)%'  
使用
才能保搜索的编码过的数据字段内容匹配

==================================

PS:
也可以使用正表达式来改写上面的两个函数,效率要更高些
再就是如果 不使用日文,也不需要搜索日文,部分可以不用,保存数据直接把26个片假名字符替换为空字符或任一字符,比如""
引玉,如果有更本的真正的好方法,分享

:
----------------------------
平假名87 asc
-23391 --> -23316
unicode 3040 -309F

ぁあぃいぅうぇえぉお
かがきぎくぐけげこご
さざしじすずせぜそぞ
ただちぢっつづてでと
どなにぬねのはばぱひ
びぴふぶぷへべぺほぼ
ぽまみむめもゃやゅゆ
ょよらりるれろゎわゐ
ゑをん゛゜ゝゞ
------------------------------
片假名89 asc
-23135 -> -23059
unicode 30A 0-30FF

ァアィイゥウェエォオ
カガキギクグケゲコゴ
サザシジスズセゼソゾ
タダチヂッツヅテデト
ドナニヌネノハバパヒ
ビピフブプヘベペホボ
ポマミムメモャヤュユ
ョヨラリルレロヮワヰ
ヱヲンヴヵヶーヽヾ
================
修改的版本===========================

添加一个编码参数codeType
都使用一个函数
使用chr()不直接使用日文字符
这样~ 够简洁了吧?

疑点: 示日文是不会出的,保存到数据也不会出
只有SQL使用 like inStr 才会出 个与示无
有在vbs里使用 inStr(1,str,"aaa",1)这样按字符搜索也会
inStr(lcase(str),"aaa") 就不会出

如果一定得用  inStr(1,str,"aaa",1) 字符搜索
一定要在先inStr() jncode() 会出

一点问题没有! 注意到几点绝对

rs("TopicStr")=Jncode(TopicStr,true)  'encode
保存到数据
DisplayStr=Jncode(rs("TopicStr"),false) 'uncode       '
示到面的标题

Function Jncode(byVal iStr,codeType)
       if isnull(iStr) or isEmpty(iStr) or iStr="" then
              Jncode=""
              Exit function
       end if
       dim F,i,E
              E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;",_
                            "Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;",_
                            "Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;",_
                            "Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
              F=array(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_
                            chr(-23118),chr(-23114),chr(-23112),chr(-23110),_
                            chr(-23099),chr(-23097),chr(-23095),chr(-23075),_
                            chr(-23079),chr(-23081),chr(-23085),chr(-23087),_
                            chr(-23052),chr(-23076),chr(-23078),chr(-23082),_
                            chr(-23084),chr(-23088),chr(-23102),chr(-23104),_
                            chr(-23106),chr(-23108))
       if codyType then
               for i=0 to 25
               iStr=replace(iStr,F(i),E(i))'

               next
       else
        
      for i=0 to 25
                iStr=replace(iStr,E(i),F(i))'

               next
       end if
       Jncode=iStr
End Function

================
修改的版本2 改用unicode===========================

添加一个编码参数codeType
都使用一个函数
使用chr()不直接使用日文字符
这样~ 够简洁了吧?

疑点: 示日文是不会出的,保存到数据也不会出
只有SQL使用 like inStr 才会出 个与示无
有在vbs里使用 inStr(1,str,"aaa",1)这样按字符搜索也会
inStr(lcase(str),"aaa") 就不会出

如果一定得用  inStr(1,str,"aaa",1) 字符搜索
一定要在先inStr() jncode() 会出

一点问题都没有! 注意到几点绝对

rs("TopicStr")=Jncode(TopicStr,true)  'encode
保存到数据
DisplayStr=Jncode(rs("TopicStr"),false) 'uncode '
示到面的标题

Function Jncode(byVal iStr,codeType)
if isnull(iStr) or isEmpty(iStr) or iStr="" then
  Jncode="" : Exit function
end if
dim F,i,E
  E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;",_
    "Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;",_
    "Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;",_
    "Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
  F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_
    chrw(12466),chrw(12470),chrw(12472),chrw(12474),_
    chrw(12485),chrw(12487),chrw(12489),chrw(12509),_
    chrw(12505),chrw(12503),chrw(12499),chrw(12497),_
    chrw(12532),chrw(12508),chrw(12506),chrw(12502),_
    chrw(12500),chrw(12496),chrw(12482),chrw(12480),_
    chrw(12478),chrw(12476))
if codyType then
   for i=0 to 25 iStr=replace(iStr,F(i),E(i)) next
else
   for i=0 to 25 iStr=replace(iStr,E(i),F(i)) next
end if
Jncode=iStr
End Function


===========================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值