- ベストアンサー
MySQLで正の数だけを保存したい
MySQLで「プラスもマイナスも可能な投票システム」を作っています。 既存の数字よりマイナスする数値が大きいと計算結果がマイナスになってしまうため、 これを防止する意味で「INT UNSIGNED」にしました。 私はこれによりマイナスになる数値で計算したらエラー表示をして計算できなくなることを 望んでいたのですが、現実には マイナスと表示されない代わりに「4294966795」という 数値がインサートされてしまいます。 計算結果がマイナスになる場合エラーを返して計算させないようにするためには、どうすれば よいでしょうか?宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
他の方の回答を求められてるので再度回答するのもなんですが、補足させてください。 私がリンクを貼るときは、内容を確認した上で初心者の方でも理解できやすいようにできるだけ平易に要点を説明してるものを紹介しています。 ただ、リンクをすべて遡って確認していなかったので今回のように大元のリンクが不適切なものがあったようですいませんでした。 ブログ主の方も動作の検証はしたが、リンクのチェックが甘かったのかも知れません。 で、本題ですが、5.1や5.6でもNO_UNSIGNED_SUBTRACTIONオプション自体は現在でも有効なはずです。 一応、5.1と5.6のマニュアルを貼っておきます。 http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html http://dev.mysql.com/doc/refman/5.6/en/server-sql-mode.html 尚、減算の結果0になるのはinsertやupdate時でselectの場合は負数が返ります。
その他の回答 (1)
- hogya
- ベストアンサー率67% (49/73)
以前のMySQLのバージョンのUNSIGNEDオプションでは減算の結果マイナスになる場合には0になっていました。 それと同様の動作であれば、下記を参考にしてみてください。 http://perl.no-tubo.net/2009/10/ そうではなく、マイナスになる場合にエラーを返すのであれば独自の仕様ですので、トリガーで実装することになると思います。
補足
有難うございます。 また、私の最初の投稿でMySQLのバージョンの記載をしていなかったこと、お詫び申し上げます。 MySQL5だとNO_UNSIGNED_SUBTRACTIONオプションを使っても4294966795になってしまいました。 ご参考のURLはさらに参考のURL→さらに参考のURLと続いており、最初のURLのプロガーはMySQL5での処理方法と記載しているにも関わらず、それぞれが参照とした大元のURLはMySQL4.0のオフィシャルページになっていました。 プロガーというものは検証も無しにただ記事を書くことが目的で確認もせず転用する方がいるようです。 MySQL5の処理方法としてプロガーが記載していればだれでも信じてしまいますよね。 いずれにしてもNO_UNSIGNED_SUBTRACTIONオプションはMySQL5には有効ではないようです。 トリガの使用も考えますが、出来ればSQLの設定で処理出来ればと考えておりますので、他の方からのご提案もお待ちしております。 hogya様。有難うございました。
お礼
2回もご回答頂きありがとうございました。 MySQLのマニュアルを見る限り、私の使用方法が誤りなだけと思います。別途挑戦させて頂きます。 有難うございました。
補足
再度ご回答頂きありがとうございます。 上記のマニュアルは確認させて頂きました。 私の経験不足からSQLについて十分な理解しないまま作業をしているのかもしれませんが、少なくとも下記の方法で実施した限りでは、4294966795になってしまいました。 SET SQL_MODE = 'NO_UNSIGNED_SUBTRACTION INSERT INTO ~ マニュアル通りなら0になりそうなものなのですが... SET SQL_MODE = の位置がまずかったのでしょうか。 後ほど再挑戦してみたいと思います。 今回の作業の結論としましては、SQL内部処理での対応はあきらめ、入力画面のPHP上で「負数になる数値を入力できない」ようにすることで対応することといたしました。 SET SQL_MODE = 'NO_UNSIGNED_SUBTRACTION については後ほど再挑戦してみたいと思います。 ご指導、本当にありがとうございました。