|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
==26个日文片假名导致Access搜索(80040e14/内存溢出)的解决办法== ゴ ガ ギ グ ゲ ザ ジ ズ ヅ デ ド ポ ベ プ ビ パ ヴ ボ ペ ブ ピ バ ヂ ダ ゾ ゼ 当字段内包含了这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\\\' 没有搜索,因这几个字符出现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 30A0-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 ========================================================================== 这是在网上摘抄的,太多,看了还是不晓得解决,后来又继承翻了一把,发现一个工具,让我跌了一下眼镜,代码如下: <% \\\'检查有日文片假名的新闻 Server.ScriptTimeout=300 dim conn,str,rs, sql set conn=server.createobject("adodb.connection") set rs=server.createobject("adodb.recordset") str="provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath("data/xsjnews.asa") conn.open str sql="select newsid from news" rs.open sql,conn,1,1 on error resume next do until rs.eof sql="select newsid from news where (title like \\\'a\\\' or content like \\\'a\\\') and newsid = "& rs("newsid") Err=0 conn.execute(sql) if not Err=0 then Response.Write "错误新闻ID:" Response.Write rs("newsid") Response.Write "<br>" Err=0 \\\'sql = "delete * from news where newsid ="& rs("newsid") \\\'conn.execute(sql) end if rs.movenext loop rs.close conn.close response.write "查找完成" %> 返回类别: 教程 上一教程: ASP中CACHE技术的应用 下一教程: SQL7的IMAGE字段的文件下载到客户端 您可以阅读与"检查有日文片假名的新闻"相关的教程: · 26个日文片假名导致ACCESS搜索(80040E14/内存溢出)的解决办法 · 用asp.net和xml做的新闻更新系统(2) · 用asp.net和xml做的新闻更新系统(1) · 关于生成HTML文件的新闻系统 · IIS6.0下ASP的新增功能 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |