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ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶーヽヾ --------------------------------------------------------------------- 错误情况:ACCESS数据库含有某些特定日文字符时,like检索可能会出错的几种情况: ======================== conn.open " driver={microsoft access driver (*.mdb)};dbq= " & DatabaseToQueryrs.open StrSQL,conn, 1 , 1 出错 ======================== 错误描述: [Microsoft][ODBC Microsoft Access Driver] 内存溢出错误编号: - 2147467259 错误类型:Microsoft OLE DB Provider for ODBC Drivers 错误 ' 80004005' [Microsoft][ODBC Microsoft Access Driver] 内存溢出 / idealtutor / admin / teacherList.asp,行410连接方式与打开方式 ======================== conn.open " driver={microsoft access driver (*.mdb)};dbq= " & DatabaseToQueryrs_str.open StrSQL,conn, 1 , 1 出错 ======================== 错误描述: ODBC 驱动程序不支持所需的属性。错误编号: - 2147217887 错误类型:Microsoft OLE DB Provider for ODBC Drivers (0x80040E21) / syl / access - syl - str.asp, 第 442 行连接方式与打开方式 ======================== conn.open " driver={microsoft access driver (*.mdb)};dbq= " & DatabaseToQueryrs_str.open StrSQL,conn, 1 , 3 出错 ======================== 错误描述: [Microsoft][ODBC Microsoft Access Driver] 内存溢出错误编号: - 2147217913 错误类型:Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)连接方式与打开方式 ======================== conn.open " Provider=Microsoft.Jet.OLEDB.4.0; Data Source= " & DatabaseToQueryrs_str.open StrSQL,conn, 1 , 1 出错 ======================== 错误描述: 内存溢出错误编号: - 2147217900 错误类型:Microsoft JET Database Engine (0x80040E14)连接方式与打开方式 ======================== conn.open " Provider=Microsoft.Jet.OLEDB.4.0; Data Source= " & DatabaseToQueryrs_str.open StrSQL,conn, 1 , 3 出错 ======================== 错误描述: 内存溢出错误编号: - 2147217900 错误类型:Microsoft JET Database Engine (0x80040E14)