\"unsigned\" にハマりました・・・
最近、花粉症でティッシュが手放せないgusagiです。
今日は、つい先日にモジュールを作成している際にハマったことについて書きます。
XOOPSモジューでは、ユーザのIDをDBに保存するケースが結構あります。
フォーラムの書き込みだったら、誰が書き込んだか判るように保存する、という具合にです。
今回、{prefix}_usersテーブルの定義に合わせて、mediumint型で作成で作成したんですが、
発行しているSQLと別の値がDBに保存されていました。
デバッグ用にログを吐かせてみましたが、SQLでは確かにIDとして\"10000001\"という値を
セットしています。
ところが、DBに保存されている値は\"8388607\"。
あれこれプログラムを弄ってみたんですが、状況は変わらず。。。
「こりゃ、DB定義を変えてテストしてみるしかないか」なんて思いながら、テーブル作成用のSQLを
見たところ、対象のカラムの定義に\"unsigned\"が含まれていないことに気づきました・・・。
念のため、{prefix}_usersテーブルを確認してみると、そちらには\"unsigned\"と書かれています。
もしやと思いながら、テーブル定義を変更してみたところ、不具合は無事に解消されました。
今まで、カラムの最大値を超えた値をセットしたSQLはエラーとなると思いこんでいたため、
エラーではなく、定義の最大値がDB保存されるという動作は想定外でした。
通常のXOOPSの運用の場合、1からauto_incrementで値がセットされていくので、IDが\"8388607\"を
超えることは無いと思いますが、ちょっとしたハマりどころになりそうなところです。
今後モジュールを作る際には、\"unsigned\"も忘れないようにしようと思います:razz:
コメント (2)
WizMobileではお世話になります。
畑は違えど、メカ制御系でも良く符号付/なしでトラブることがあります。 インクリメントしないと分からないから、ある日突然、タッチパネルの表示が変になるんですよね。(笑)
あと、昔あったのが1ワードデータのIntel方式とMotorolla方式で上位下位が逆になるやつ。。 今でもたまに遭遇すると、変換が大変です。(涙)
制御系は触れたことがないのですが、やはり色々な仕様があるのですね^^;
「Intel方式とMotorolla方式で上位下位が逆」なんて、実際に知らないと対応も難しそうです。
自分も、まだまだ知らないことだらけなので、これからも精進していきたいものです^^;