的解决办法,DBI操作MySQL的大器晚成都部队分建议

采纳perl连接mysql,这几个英特网有广大案例了,平日大家都以DBI下的DBD::MySQL那个模块进行.这里做八个mask弄贰个TIPS:Perl
DBI MySQL的字符集为UTF8Perl DBI 特殊字符写入时报错Perl DBI
连接自动重连或是连接超时1. 当MySQL的字符集是UTF8时亟待引入:

前言

use utf8;binmode(STDOUT, ':encoding(utf8)');binmode(STDIN, ':encoding(utf8)');binmode(STDERR, ':encoding(utf8)');

接手前辈的项目,没有接触、安装、使用过perl和DBD::Oracle,也未有有关的文书档案记录,茫茫然防不胜防~~。一起先发现那几个难题,就想着火速解决,就间接在google上搜报错消息,搜索的历程中开掘假如不搞明白来踪去迹笔者连实施方案都‘看不见’‘看不懂’。
所以依然要增补那上头的学识,再构思解决方案。以下内容正是自己一面上学风流罗曼蒂克边消除难题的历程,假若不足,请各位大佬指出。

指标:
解决perl连接mysql到数量后读取展现结果为乱码的难点.2.对于特殊字符的写入,最佳使用:

 

 my $sth=$dbh-prepare("insert into wubx.WeekEvent values(,,,,,,)"); $sth-execute($OId,$CId,qq/$Time/,$EventType,qq/$CDesc/,$PId,$RFlag);

报错

对此字符串有超大希望是客商提交的用qq//包裹,减少特殊字符变成SQL无法施行的意况.3.
假设老是两个数据库有交流的操作大概迁数据,要思索连连超时的意况.报错:
MySQL server has gone away 管理办法: 在DBD::mysql
4.012今后扶持DBI连接的自发性重连.需求设置:

图片 1

 $dbh-{mysql_auto_reconnect} = 1;

install_driver(Oracle) failed: Can’t locate DBD/Oracle.pm in @INC (@INC
contains:/home/as_user/PMS/Data-Update /usr/local/lib64/perl5
/usr/local/share/perl5 /usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at
(eval 12) line 3. Perhaps the DBD::Oracle perl module hasn’t been fully
installed, or perhaps the capitalisation of ‘Oracle’ isn’t right.
Available drivers: DBM, ExampleP, File, Gofer, Pg, Proxy, SQLite,
Sponge, mysql. at /home/as_user/PMS/Data-Update/SolexaDown.pl line 19

在最早的模块中不支持,轻巧的法子:

 

 $dbh-do('set SESSION wait_timeout=72000'); $dbh-do('set SESSION interactive_timeout=72000');

DBI相关知识

此方法适用别的语言连MySQL连接短时间错过或是Server的timeout时间设置太短.

参考:生手教程DBI相关

图片 2

图片 3

在perl中使用DBI的方法

1 #!/usr/bin/perl 
2 use DBI;                        #perl引入DBI模块
3 my $dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid", $user, $passwd);     #DBI根据输入的驱动程序对象的句柄调用对应的数据模块,返回一个数据库对象的句柄

 

以那时候候本人的脑公里冒出了八个难点

1.代码中利用use,那use怎么通晓DBI所在的目录,在哪个地方设置了,和@INC有哪些关联???

2.DBI哪些激活DBD::Oracle,寻觅的渠道是怎么,在何地,怎么设置,和@INC有哪些关联???

上述难题或许会在配置DBI,DBD::Oracle中找到答案,所以本身就先查询学习了布署进程

安装DBI 

perl DBI官网: 
,在官方网址中可以跳转到下载路线 

配备方式DBD::Oracle

参考:Linux景况布置DBD::Oracle模块

要点

  1. DBD::Oracle模块不是Oracle官方开拓的,由Pythian
    Group公司费用,网站为
    。当然能够去CPAN(Comprehensive Perl Archive
    Network,Perl模块集中库

  2. 先装DBI,再装DBD模块,在安装DBD::Oracle中,即便装在一向不Oracle
    Database的主机上,则必要安装Oracle Instant Client来举行长间隔数据库连接

3.在设置教程中,建议要安顿Orcale_HOME目录,我们得以在根目录下输入vi
.bashrc命令,就可以看到Oracle_HOME的计划音信

在安装DBD::Oracle过程中,设置Oracle_HOME变量这一步犹如与小编的题材2关于(但绝非清晰的涉及卡塔尔,但和难题1一点关系都不曾,当时就打结perl中有设置相应的参数,细心查阅实行脚本的始发,开掘存使用到FindBin,想着不打听那就去读书一下。幸运的是,在求学的进程中解决了本身的报错。

perl的FindBin模块(非看不可参照他事他说加以考察的网址,很有赞助)

要点1:

参考:Perl使用FindBin模块解决脚本中的路线难点

固然脚本路线在/home/as_user/PMS/testt.pl,在目录/home/as_user/PMS下运作该脚本

图片 4

即$bin表示路线/home/as_user/PMS,$Script表示testt.pl

 

要点2:

参考:理解use_require_do使用格局

use
是在暗中同意的@INC里面去追寻对应的模块,意气风发旦模块不在@INC中,那么use是不可能引进的。同不日常候use引进的称呼无需后缀名,默许可时也一定要找.PM文件

 

要点3:

参考:查阅Perl模块安装路线

@INC是perl的一个非正规列表标量,存款和储蓄着近些日子版本的Perl模块的路子。编写翻译脚本时,Perl会依照@INC存储的门道去查询客户所调用的模块,能够用命令‘perl
-V’来查看具体模块的目录,也同样可以用BEGIN代码块对@INC进行操作。个中.表示脚本的当前目录。

图片 5

 

总结

在学习了‘配置DBD::Oracle方法’
以致‘perl的FindBin模块’的相干知识后,再回到报错,报错说在@INC路线下Can’t
locate
DBD/Oracle.pm,既然找不到,那么大家要在实践脚本中设置DBD/Oracle.pm的路线。设置的艺术是行使
FindBin模块。

举个例证:执行脚本SolexaDown.pl的目录为
/home/as_user/PMS/Data-Update,在此个目录下的/lib目录下存在
DBD/Oracle.pm,即存在路径/home/as_user/PMS/Data-Update/DBD/Oracle.pm。那么小编在olexaDown.pl脚本的伊始,应该写上

use FindBin '$Bin';
use lib "$Bin/lib";

那样一来,perl推行SolexaDown.pl脚本时就会找到DBD/Oracle.pm了。报错解决了~~

 

至于难点

use查找援用的模块 和 DBI激活对应的DBD 都以因此@INC下的不二法门去追寻的,之所以说DBI激活对应的DBD也是通过@INC的基于:小编意识DBI有个available_drivers方法,perl
DBI手册上有写到
“该方法通过@INC中的目录找寻全体的DBD::*模块再次回到二个有所可用驱动器的列表。暗中认可情况下,如若某个驱动器被先前目录中其它大器晚成律名字的驱动器覆盖,将会回来二个警戒,能够经过设置$quiet为true屏蔽”,这启示了自身,再依照DBI的源码,作者发掘了事实上的代码
grep { -d “$_/auto/DBD/$driver” }
@INC。笔者懒的精心看源码,$_实际指什么就没深究,风趣味的能够留心研商一下,DBI源码是用perl写的。设置@INC的法子在链接 查阅Perl模块安装路线中能够找到,作者就不列举了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注