免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2350 | 回复: 13

求各位大哥大姐帮助字符集的问题【已解决】 [复制链接]

论坛徽章:
0
发表于 2013-06-13 15:17 |显示全部楼层
本帖最后由 szmadd 于 2013-06-14 13:05 编辑

我有个xml文件需要入库,字符集为gb2312,使用xml::libxml提取其中的内容,使用encode转换为gb2312,print显示正常没有乱码,但是在使用dbi用prepare的时候中文字符显示乱码,客户端和数据库的字符集为us7ascii,利用print出来的语句在sqlplus下插入数据库正常,求各位大佬给以帮助。

论坛徽章:
0
发表于 2013-06-13 16:01 |显示全部楼层
自己顶求帮助

论坛徽章:
0
发表于 2013-06-13 18:06 来自手机 |显示全部楼层
只有人看,没人回复啊

论坛徽章:
0
发表于 2013-06-13 19:32 |显示全部楼层
prepare?用啥显示的,你数据库用的啥编码

论坛徽章:
0
发表于 2013-06-13 21:00 |显示全部楼层
成功插入也是乱码回复 4# gonedone


   

论坛徽章:
0
发表于 2013-06-13 21:30 |显示全部楼层
http://www.newsmth.net/bbscon.ph ... =57467&ftype=11
看到了这篇文章,自己先研究一下。

论坛徽章:
0
发表于 2013-06-14 09:14 |显示全部楼层
仙子的关于编码的文章我也看了,对于输入和输出现在有点理解了,但目前程序的问题还么有解决。
下面附上我的程序
  1. #!/usr/bin/perl

  2. use XML::LibXML;
  3. use strict;
  4. use Config::General;
  5. use Data::Dumper;
  6. use DBI;
  7. use Encode;

  8. #获取数据库信息
  9. my $conf = new Config::General( -ConfigFile => "c:\\myperl\\fwqxx_in.ini");
  10. my %config = $conf -> getall;
  11. #发起数据库连接
  12. my $dbh = DBI->connect("DBI:Oracle:$config{DB_NAME}",$config{DB_USER},$config{DB_PASS},{RaiseError => 1,AutoCommit => 0});

  13. #载入分析xml文件
  14. my $prsr = XML::LibXML->new() or die "aaaaaa\n";
  15. my $doc = $prsr->parse_file("c:\\myperl\\ceshi.xml") or die "aaaaaa\n";
  16. my $root = $doc->documentElement();
  17. my @children = $root->childNodes();

  18. #读取每一行,并存入数据库
  19. foreach my $node (@children){
  20.     my @data_child = $node->childNodes;
  21.     my @datanames;
  22.     my @datadatas;
  23.     foreach my $data (@data_child){
  24.         my $dataname1 = $data->nodeName();
  25.         my $datadata1 = $data->textContent;
  26.         $datadata1 = '\''.$datadata1.'\'';
  27.         chomp ($datadata1);
  28.         chomp ($dataname1);
  29.         push (@datanames,$dataname1);
  30.         push (@datadatas,$datadata1);
  31.       
  32.     }
  33.     my $dataname = join(',',@datanames);
  34.     my $datadata = join(',',@datadatas);
  35.     $datadata = encode("ascii",$datadata);
  36.     #if undef($datadata){
  37.         
  38.         my $sql= sprintf "insert into maa_gzzzl (%s) values (%s)",$dataname,$datadata;
  39.         print $sql."\n";
  40.         my $sth = $dbh->prepare($sql);
  41.         $sth->execute;
  42.         $dbh->commit;
  43.         $sth->finish;
  44.     #}
  45. }


  46. $dbh->disconnect;
复制代码

论坛徽章:
0
发表于 2013-06-14 09:17 |显示全部楼层
我的数据库的字符集为us7ascii
我的客户端的字符集也为us7ascii
如果我使用
  1. $datadata = encode("ascii",$datadata);
复制代码
那么我print的结果和数据库插入的结果是一直的都是乱码,
如果我使用
  1. $datadata = encode("gb2312",$datadata);
复制代码
那么的哦print的结果是正常的,但是插入的结果就是乱码。

论坛徽章:
0
发表于 2013-06-14 10:37 |显示全部楼层
目前在perl程序里面增加了
  1. $ENV{NLS_LANG} = "american_america.us7ascii"
复制代码
插入的结果还是乱码,
查询
  1. $hash_ref = $dbh->ora_nls_parameters()
  2.   $database_charset = $hash_ref->{NLS_CHARACTERSET};
复制代码
查询的结果US7ASCII

论坛徽章:
0
发表于 2013-06-14 12:20 |显示全部楼层
首先,要将汉字存入数据库,而将数据库字符集设置为US7ASCII是不合适的。US7ASCII字符集只定义了128个符号,并不支持汉字。另外,由于在SQL*PLUS中能够输入中文,操作系统缺省应该是支持中文的,但在NLS_LANG中的字符集设置为US7ASCII,显然也是不正确的,它没有反映客户端的实际情况。
但实际显示却是正确的,这主要是因为Oracle检查数据库与客户端的字符集设置是同样的,那么数据在客户与数据库之间的存取过程中将不发生任何转换。具体地说,在客户端输入“东北”,“东”的汉字的编码为182(10110110)、171(10101011),“北”汉字的编码为177(10110001)、177(10110001),它们将不做任何变化的存入数据库中,但是这实际上导致了数据库标识的字符集与实际存入的内容是不相符的,从某种意义上讲,这也是一种不一致性,也是一种错误。而在SELECT的过程中,Oracle同样检查发现数据库与客户端的字符集设置是相同的,所以它也将存入的内容原封不动地传送到客户端,而客户端操作系统识别出这是汉字编码所以能够正确显示。
在这个例子中,数据库与客户端的设置都有问题,但却好象起到了“负负得正”的效果,从应用的角度看倒好象没问题。但这里面却存在着极大的隐患,比如在应用length或substr等字符串函数时,就可能得到意外的结果。另外,如果遇到导入/导出(import /export)将会遇到更大的麻烦。有些朋友在这方面做了大量的测试,如eygle研究了“源数据库字符集为US7ASCII,导出文件字符集为US7ASCII或ZHS16GBK,目标数据库字符集为ZHS16GBK”的情况,他得出的结论是 “如果的是在Oracle92中,我们发现对于这种情况,不论怎样处理,这个导出文件都无法正确导入到Oracle9i数据库中”、“对于这种情况,我们可以通过使用Oracle8i的导出工具,设置导出字符集为US7ASCII,导出后修改第二、三字符,修改 0001 为0354,这样就可以将US7ASCII字符集的数据正确导入到ZHS16GBK的数据库中”。我想对于这些结论,这样理解可能更合适一些:由于ZHS16GBK字符集是US7ASCII的超级,所以如果按正常操作,这种转换应该没有问题;但出现问题的本质是我们让本应只存储英文字符的US7ASCII数据库,非常规地存储了中文信息,那么在转化过程中出现错误或麻烦就没什么奇怪的了,不出麻烦倒是有些奇怪了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP