• ベストアンサー
  • 困ってます

DBに半角数字10桁入力すると別数字になります

  • 質問No.7067132
  • 閲覧数292
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 96% (29/30)

phpとphpmyadminを連携しており、フィールドはid(AUTO_INCREMENT)を含め、11項目作成しています。
phpでは9つのフォームがあり、入力された値が2~10つ目のフィールド(すべてint(10))に格納され、11こ目のフィールドはdateで取得した値が入ります。

php上で、生成されたsql文をechoで表示させると、入力したとおりになっているのですが、phpmuadminの中身を見てみると、10桁フルで入力した値が、決まって「2147483647」となっており、困っています。

変数もechoで細かく見てみましたが、どこもおかしなところはありません。
DBに格納された数字のみがおかしなことになっています。

さらに、いろいろ試してみたところ、
1234564757はそのまま
2222222222は2147483647
2222222229は2147483647
4545454545は2147483647
1111111112はそのまま
1111111111はそのまま
2222はそのまま(9桁までの数字の連続なら正常)
のような感じで、1の場合は10桁でも変な数字にならず、ほかの数字が連続するときまって2147483647になるようです。

11桁からはプログラムによりエラーが出て再入力を求めるようにしており、11桁以上の場合は正常にエラーが出るので、おかしくなるのは、10桁のときのみです。

格納寸前の変数も直後の変数や$sqlもおかしなところは全くないので、何が狂わせているのかがわからずにいます。

php:5.3.8
mysql:5.5.16
phpmyadmin:3.4.5
Apache:2.2.21 (Win32)


つたない説明で分かりづらいかもしれませんが、大変困っておりますので、
何かアドバイス等があれば是非ご教授いただければ幸いです。

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 51% (3827/7415)

データの有効精度なんて基本中の基本でしょう。
どんな解説書を読んでも最初の方で書かれているはずです。

今回のケースであればdecimalで精度を確保するか、
intではなくbigintで有効範囲をおおめにとる。
極端な話文字列型でもってしまう・・・などの対応が考えられます。

create table num (d9 decimal(9,0),d10 decimal(10,0),d11 decimal(11,0),i int,b bigint,str varchar(30));
insert num values
(1234564757,1234564757,1234564757,1234564757,1234564757,1234564757)
,(2222222222,2222222222,2222222222,2222222222,2222222222,2222222222)
,(4545454545,4545454545,4545454545,4545454545,4545454545,4545454545)
,(9876543210,9876543210,9876543210,9876543210,9876543210,9876543210)
,(12312312312,12312312312,12312312312,12312312312,12312312312,12312312312);
select * from num;
お礼コメント
fk710b

お礼率 96% (29/30)

ご指摘誠にありがとうございます。
ご回答いただいた通りにしましたところ、正常に格納されました。
投稿日時:2011/10/13 10:16

その他の回答 (全2件)

  • 回答No.3

ベストアンサー率 51% (3827/7415)

ちなみに・・・

int(20)は、zerofill(ゼロで桁揃え)するときの埋める桁数です。
unsignedすればマイナスがない分2倍近く確保できますが
基本的にその桁数の精度になるわけではありません。

create table num2(val1 int(20),val2 int(20) unsigned zerofill );

insert num2 values(1,1)
,(1234564757,1234564757)
,(2222222222,2222222222)
,(99999999999,99999999999);
select * from num2;
お礼コメント
fk710b

お礼率 96% (29/30)

追記まで添えていただき、ありがとうございます。
無事解決いたしました。
投稿日時:2011/10/13 10:17
  • 回答No.1

ベストアンサー率 23% (3656/15482)

オーバーフローして符号付き 32ビット整数に収まっていないから, とか?
補足コメント
fk710b

お礼率 96% (29/30)

関係ないとは思ったのですが、テスト感覚で、int(20)にしてみても、同じ結果でした。
投稿日時:2011/10/12 17:24
お礼コメント
fk710b

お礼率 96% (29/30)

ご回答ありがとうございます。

と、なると、どのようにすれば解決するのでしょうか...すみません、知識が中途半端なもので解決方法をお教えいただければ幸いです。
投稿日時:2011/10/12 16:57
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ