各位乡亲父老,欢迎大家来捧场!江湖卖艺,生活不易!技艺交流(投稿、打广告、链接交换),请搓这里

  Access的又一个大BUG:Like模糊搜索时如遇日文或韩文字符则内存溢出

2022/3/21 16:20:12管理员 2681
- N +
这个BUG实在不新鲜,不过,还是很多人中招,而且,微软真最让人受不了,明明说了ACCESS是UTF-8的,偏偏使用LIKE搜索时,如果在表中,被搜索列上,含有日文字符,会产生溢出,而且,这个由来已久,微软却不修复,真的让人愤怒,并且这个BUG不只是搜索有可能替换的时候也会报(80040e14/内存溢出)的问题。

补充最新修改版,使用Unicode的字符代码,而不是非unicode(负数值,有时会出错)代码

ゴ ガ ギ グ ゲ ザ ジ ズ ヅ デ ド ポ ベ プ ビ パ ヴ ボ ペ ブ ピ バ ヂ ダ ゾ ゼ
当字段内包含了这26个日文字符任意一个多个时,就会导致在执行SQL语句中包含了
[字段] like '%aaaaa%' 或 inStr(1,[字段],'aaaaa',1)>0
这样的查询时,毫无道理的出现了
"Microsoft JET Database Engine 错误 '80040e14' 内存溢出"的错误
其他Jet SQL函数命令未作测试,大概与字符搜索定位匹配相关的都可能出错

搜索相关资料得知被微软工程师证实是Access的bug,可能是语法关系都是微软的东东
在vbs中 执行inStr(1,日文平假名变量,"aaaaa",1)依然要出现错误
Microsoft VBScript 运行时错误 错误 '800a0005' 无效的过程调用或参数: 'instr'
1、最笨的方法:删除含有日文或韩文的数据或只存储和显示,不要将此存储的字段作为查询条件来使用(如果确实无法删除当然另说)
这就不用解释了;
2、如果有条件换个数据库,用SQLLite这种轻量级数据库来避掉ACCESS的各种坑;
3、替换方法:
思路:就是存储进入数据库时把那26个日文替换成别的编码,在从数据库取出来后在反替换回来;
从网上找了个现成的函数:
编码:
Function Jencode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
Jencode=""
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))
    Jencode=iStr
    for i=0 to 25
      Jencode=replace(Jencode,F(i),E(i))
    
ext
End Function

解码:
Function Juncode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
    Juncode=""
    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))
    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)%' 使用
才能保证搜索的值和编码过的数据库字段内容匹配
1人赞 分享 二维码 赏一个
选择分享方式
移步手机端
文章手机二维码

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
选择打赏方式
微信赞助

打赏