从DBI查询获取perl中文本字段的2种不同长度

时间:2013-04-11 18:28:23

标签: mysql perl dbi

我在存储为文本字段的mysql表中加密了数据。 一切最初都是用Windows perl编写的,并且仍然可以正常运行。 我的问题是我在Linux上运行相同的代码,当我查询表时,perl中的文本结果告诉我它更长(这会导致我的解密爆炸,因为它太长了)。

这种情况发生在运行相同的脚本,所以我知道没有代码差异 在OpenSuSE Linux 11.4 x64上运行的Mysql服务器是5.1.63。 Linux perl是v5.12.3 Windows perl是5.10.1 有问题的字段定义为text,utf8_general_ci,当我通过JDBC访问它时,数据报告128字节, 有问题的SQL很简单(修剪到这里重要的事情)

my $gatherSQL = "select 
                  table.encryptedText from action.theTable table
                  where table.custno=" . $dbHandle->quote($custno) 
  my $getHandle = $dbHandle->prepare($gatherSQL);
  $getHandle->execute();
  my $arrayRef = $getHandle->fetchall_arrayref();
  foreach my $myrow (@$arrayRef)
  {
    $type = $$myrow[0];
  }
  $getHandle->finish();
#DB Handle is opened with a simple  
my $workSQLhandle = DBI->connect("dbi:mysql:$dataDB:$dataServer:$dataPort", $userToUse, $pwToUse);
return($workSQLhandle);  

当我在Windows中运行代码(通过samba共享)时,我获得128字段的长度(解密) 从命令提示符运行的同一台机器上的相同代码告诉我相同的返回字符串是193个字符长(并且不会解密) 我对回来的结果进行了比较,结果相同,但perl告诉我一个比另一个长。

关于如何解决这个问题以及根本原因是什么的任何想法?

1 个答案:

答案 0 :(得分:1)

检查mysql / perl是否正在对文本进行一些翻译。例如select length(table.encryptedText)看看mysql认为长度是多少。加密文本往往看起来像二进制垃圾,如果你将它存储在TEXT类型的字段中,它将受到自动字符集转换。加密数据应该进入BLOB字段,否则它们与TEXT相同,但不是字符集敏感的。