免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5440 | 回复: 5
打印 上一主题 下一主题

perl使用DBI和Oracle通信乱码问题 [复制链接]

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-28 09:31 |只看该作者 |倒序浏览
  1. #!/usr/bin/perl -w

  2. USE strict;
  3. use DBI;
  4. use Encode;

  5. my $dbName = 'mytest';
  6. my $dbUser = 'test';
  7. my $dbUserPass = 'test123';

  8. my $dbh = DBI->connect("dbi:Oracle:$dbName", $dbUser, $dbUserPass) or die "can't connect to database " . $DBI::errstr;

  9. my $hostSql = qq{select hostname,username,password from t_hostserver where name like '生产%'};

  10. my ($hostname, $username, $passwd);
  11. my $selStmt = $dbh->prepare($hostSql);
  12. $selStmt->bind_columns(undef, \$hostname, \$username, \$passwd);

  13. $selStmt->execute();
  14. while( $selStmt->fetch() ){
  15.   print "$hostname\t\t$username\t\t$passwd\n";
  16. }

  17. $selStmt->finish;
  18. $dbh->disconnect;
复制代码
使用上面的代码在windows下执行,能够正确查询出数据。但是使用上面的代码在linux下执行,不能查询出数据。通过抓数据包和oracle session中的sql语句,发现sql语句中的“生成”都被替换成了问号。
请问问什么会这样?怎么能让代码在windows和linux下都能运行?

windows和linux下NLS_LANG均设置成了SIMPLIFIED CHINESE_CHINA.ZHS16GBK,和数据库的设置是一致的。
linux下的locale设置如下:
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

如果我将LANG设置成en_US,会报如下错误:
  1. perl: warning: Setting locale failed.
  2. perl: warning: Please check that your locale settings:
  3.         LANGUAGE = (unset),
  4.         LC_ALL = (unset),
  5.         LANG = "en_US"
  6.     are supported and installed on your system.
  7. perl: warning: Falling back to the standard locale ("C").
复制代码
这又是为什么啊?

新手提问,还望大家帮忙解惑。谢谢!!

论坛徽章:
0
2 [报告]
发表于 2011-07-28 12:10 |只看该作者
编码涉及到输入输出环境的方方面面。
为安全起见,你统一用UTF-8就得了。
windows也用UTF-8,用不了就去fuck bill.

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
3 [报告]
发表于 2011-07-28 12:42 |只看该作者
windows怎么使用UTF-8?

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
4 [报告]
发表于 2011-07-29 08:51 |只看该作者
顶一下!!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2011-07-29 16:13 |只看该作者
本帖最后由 apile 于 2011-07-29 16:17 编辑

应该设定一下environment variable就可以了...去查一下oracle的变量怎麽设定...另外有没有权限改字元...
参考参考下面的讨论..
http://www.programmer-club.com.tw/ShowSameTitleN/oracle/343.html

其实就是client encode与 server encode 不同的问题...
设定一下就好了...
另外看起来你的linux是utf-8,需要用 Encode module 去强迫把输出 转成 utf-8 . 输入转成 oracle db 编码,才能用..

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2011-07-31 07:05 |只看该作者
回复 3# syncpk99

windows一直都支持UTF-8,notepad默认就支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP