むはぁ、夕べは思いのほか手間がかかった・・・
お客さんのサーバの移行を行なったのだが、一部のDBテーブルの移行がうまくいかなくて。
後日対応でもかまわないテーブルだったのだが、状況が謎だらけでその確認だけでもずいぶん時間をとってしまった。
状況としては、varchar(1024) で指定されているレコード項目に、旧サーバでは 2000バイトを超えるデータが登録されているというもの。
そのため、それをそのまま新サーバに移そうとすると当然のごとくエラーとなってしまうわけだ。
DBMS は PostgreSQL。
DB登録を行なう Perl プログラムの中でも、length($hoge) > 1024 なら・・・というチェックをかけているのだが、ここも旧サーバのほうでは 2000バイトを超える文字列がエラーにならず突破してまっている。(EUC の文字数でいうと、1000文字くらい))
もちろん、まったく同じソースを新サーバに持っていくと、このエラーチェックに 2000バイトの文字列は引っかかる。
むーん・・・
もしかして、これがずいぶん昔に話題になった「日本語化パッチの弊害」なのか?
Shift_JIS を扱えるようにする日本語化パッチを Perl に当てると、length や substr が「バイト数ではなく文字数(ダブルバイト文字も 1)でカウントされるようになる」というアレ。
Perl の問題は知ってたんだけど(確か、昔の Turbo Linux の Perl がそういうパッチが当たってる奴じゃなかったっけ?)、PostgreSQL でもエラーにならないってことは、そういうパッチがあるってこと?
旧サーバのほうは、もうずいぶん古いサーバで、僕が管理をしているわけではないので PostgreSQL や Perl にそういうパッチがあたっているかは知らないのだが、とりあえず他に原因が思いつかんし・・・
・・・ということで、昨日は久しぶりの午前様となったのであった。とほほ。