数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
26个日文片假名导致Access搜索(80040e14/内存溢出)的解决办法

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

一简单有效的解决办法:
对这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(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

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




相关文章

相关软件