0

テキスト フィールドとして格納されている mysql テーブルに暗号化されたデータがあります。すべてはもともと Windows perl で書かれており、今でも問題なく動作します。私の問題は、Linuxで同じコードを実行していて、テーブルをクエリすると、perlのテキスト結果が長いことを示していることです(長すぎるため、復号化が失敗します)。

これは同じスクリプトを実行しているときに発生するため、コードに違いはないことがわかります。
Mysql サーバーは、OpenSuSE Linux 11.4 x64 上で動作する 5.1.63 です。Linux perl は v5.12.3 Windows perl は 5.10.1 問題のフィールドはテキスト 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 は一方が他方より長いと言っています。

これに対処する方法と根本的な原因について何か考えはありますか?

4

1 に答える 1

1

おそらくmysql/perlがテキストの翻訳を行っているかどうかを確認してください。たとえばselect length(table.encryptedText)、mysql が考えている長さを確認します。暗号化されたテキストはバイナリのゴミのように見える傾向があり、それを TEXT 型のフィールドに格納している場合は、自動文字セット変換の対象になります。暗号化されたデータは、それ以外は TEXT と同じですが、文字セットに依存しない BLOB フィールドに入れる必要があります。

于 2013-04-16T15:16:20.787 に答える