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

このQ&Aのポイント
  • phpとphpmyadminを連携しており、入力した10桁の数字が異なる数字になってしまいます。
  • phpでは9つのフォームがあり、入力された値が2~10つ目のフィールドに格納されます。
  • phpmyadminの中身を確認すると、10桁の数字が常に「2147483647」となっています。どこが原因かわかりません。
回答を見る
  • ベストアンサー

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

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

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

データの有効精度なんて基本中の基本でしょう。 どんな解説書を読んでも最初の方で書かれているはずです。 今回のケースであれば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
質問者

お礼

ご指摘誠にありがとうございます。 ご回答いただいた通りにしましたところ、正常に格納されました。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

ちなみに・・・ 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
質問者

お礼

追記まで添えていただき、ありがとうございます。 無事解決いたしました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

fk710b
質問者

お礼

ご回答ありがとうございます。 と、なると、どのようにすれば解決するのでしょうか...すみません、知識が中途半端なもので解決方法をお教えいただければ幸いです。

fk710b
質問者

補足

関係ないとは思ったのですが、テスト感覚で、int(20)にしてみても、同じ結果でした。

関連するQ&A

  • accessのフィールドに10桁の数字は入らない??

    あるCSVからAccessのテーブルに読みこんだのですが 一部のフィールドで文字の欠落がありました。 元のCSVの内容どおりに、手入力で欠落した箇所に 値を入れようとしたのですが、どうも9ケタの数字は入るのですが 10桁の数字は入らないようでエラーが出ます。 ★メッセージは以下の通りです。  このフィールドに入力した値が正しくありません。  たとえば、数値型のフィールドに文字列を入力しました。 Accessの仕様として、数字の桁数制限があるのでしょうか? また、解決策は何かないでしょうか? XP2、ACCESS200です

  • N桁の数字を順に表示したい

    例えば (1~9)までの数字を4つの変数(配列の1要素ずつでもいい) に分けて格納して、各変数の数字がダブらないようした 4桁の数字を順に表示するときって if( $a!=$b and $a!=$c and $a!=$d and $b!=$c and $b!=$d and $c!=$d ){ echo $a.$b.$c.$d."<br>" } すればいいと思うのですけど 数が多くなるとものすごく大変なので もっといい方法があるのではないかと思うのですが? ありますでしょうか?

    • ベストアンサー
    • PHP
  • PHPの入力フォームのセッションによる値の受け渡し

    PHPの入力フォームに関するフォームの 値の受け渡しについての質問です フォームのフィールドの値の名前はtitleです で$_POSTで値を受け取って$_SESSIONに値を 格納、変数で出力という感じにしたいと思い こう書きました <?php session_start(); $_POST['title']=$_SESSION['tit']; $_SESSION['tit']=$title; ?> <html> <head> <title>test</title> </head> <body> <?php echo $title; ?> </body> </html> こう書いたのですが、値が表示されません 画面が真っ白になってなにも見えないです なにがおかしいのか教えてください issetはあえて使わず書いたのですが それがいけなかったのでしょうか?

    • 締切済み
    • PHP
  • 正規表現で半角数字1桁のみを全角数字に変換

    お世話になります。 JavaScript(JSP)で、 正規表現で半角数字1桁のみ(2桁以上は変換しない)を、 全角数字に変換する方法を教えてください。 たとえば、 ”hoge3hoge5”文字列内の、 半角数字1桁のみを、 正規表現で、全角数字1桁に、それぞれ変換   ↓ ”hoge3hoge5” あわせて、 半角数字が2桁以上、連続で続いている場合には 変換せずに、半角数字のままにしておきたいです。 ”hoge33hoge5”    ↓ 正規表現で、半角数字1桁のみを、全角数字1桁に変換 (半角数字2桁以上は変換しない) ”hoge33hoge5” 以上になります。 もしご存じの方がいらっしゃいましたら、 よろしくお願いします。

  • 5桁の数字…

    初めての質問でここでいいのかわかりませんが、教えてください。 5桁の数字が2つあり、それぞれa[1]…a[5]、b[1]…b[5]に格納する。 対応する桁どうし(a[1]とb[1])を比較して一致する桁の個数を求めるプログラムを擬似コードで表したいのです。 { 2つの桁の数を配列a,bに読み込む; count=0; i=i+1; while(i<=5) { if(a[i]==b[i])(??); else 誤ったデータの処理; } countの値を出力する; } ??の部分には何をいれればよいでしょう? また他のところでも間違いがあればご指摘お願いいたします。

  • 半角数字の入力ができなくなります

    ネットバンクから振込みをしようと相手方の口座番号を入力中、5桁までは入力できるのですが6桁目を入力しようとしても受け付けなくなりました。先月も同じ現象が起きましたが自然に治ってしまいました。こうなってしまうとカーソル位置を動かせなくなります。マウスポインタは動かせますがそれ以上の作業は受け付けなくなり強制的に電源を切り再起動するしかなくなります。再起動後にもう一度やってみましたが同じでした。ためしにメモ帳を開いて数字を入力しても同じ現象が起きますが固まるまではいかず、エクスプローラーのエラーメッセージが出て『はい』をクリックしていくとメモ帳は消えますがそのあとは別の作業が出来ます。ちなみにIMEの半角カタカナ、半角英数モードでこの現象が起き、直接入力モードでは起きません。機器は富士通のFMVでXPです。ノートンのインターネットセキュリティとスパイウエアブラスターを入れています。

  • charを使わずに4桁の数字以外を入力したらエラーを表示したいです

    http://oshiete1.goo.ne.jp/qa4515709.html 上記の質問の続きとなります。 C言語で4桁の数字を入力させ、4桁の数字以外が入力されたらエラーを表示し、 4桁の数字が入力されたら、各位の数についていくつかの計算を行いたいです。 回答者の方のアドバイスから、文字列として入力し、字数をstrlenで、各桁の数をisdigitで判別するという方法を教えていただき、 4桁の数字以外が入力されたらエラーを表示することはできましたが、そうすると今度は計算がうまくいかなくなってしまいました。 例えば文字列としてscanf("%s",a);のようにして「1234」という文字列を入力し、これを「1234」という数値として扱うことはできませんか? または、strlen,isdigitを使わずに数値が4桁の整数であるかどうかを判別することはできませんか? もし良い方法をご存知の方いましたら、解説をお願いします。

  • DBから抽出したデータにを別テーブルに挿入

    どなたか、知見のある方がいらっしゃいましたらご教授願います。 ●やりたい事  Mysqlデータから抽出した表をに対し、数字を画面で入力後に追加  ボタン押下でDBへInsertする ●現状のソース  //サーバーに接続  //クエリーの実行 $res_result = mysql_query($query,$link); echo "<form action='update1.php' method='POST'>"; while($rew = mysql_fetch_array($res_result)){  echo "<table border='1'>";  echo "<tr>";  echo "<td>";  echo $rew['area'];//→※1  echo "</td>";  echo "<td>";  echo "<input type='text' name='name'>";//→※2  echo "</td>";  echo "<tr>";  echo "</table>";  } echo ("<input type='submit' value='追加'>"); 上記の※1と※2の値を「torihikisaki」テーブルに格納したいのです。 'update1.php'に値を渡してInsert文を実行しようとおもったのですが 値の渡し方が良く分かりませんでした。イメージでは※1と※2を 配列で渡し、foreachで一行づつInsertを実行するのかと思っていました。 説明が下手で申し訳ないのですが、ご教授願いますようお願い致します。

    • ベストアンサー
    • PHP
  • 半角数字で入力されているかチェックしたいのですが。。。

    <br><br><font size="5">日付<font color = "#ff0000">(半角入力):</font>:</font> <input style=font-size="100%" width = "90" type="text" name="hiduke" size="20"></font><br> 上のログイン画面のコードで数字を入力して、 <?php //選択した日付 $_GET["hiduke"] = $hiduke; //日付の入力確認 if (!entchk($_GET)) { return; } // -- ページ内容の表示 switch ($hyouji) { default: gamen_ichiran(); } ?> </body> </html> <?php closedb(); ?> <?php // ================================================= // ----- /一覧表示画面 // ================================================= function gamen_ichiran() { global $conn; global $sinnsatuken; global $yoyakusha; global $hiduke; global $timeid; global $jikan; $array = cnv_formstr($_POST); extract($array, EXTR_SKIP); $sql = "SELECT * FROM yoyaku WHERE hiduke = '" . $hiduke . "' ORDER BY timeid, caid"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); $i = 0; while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { if ($row["yoyakusha"] != "×") { $jikan[$i] = getjikan($row["timeid"]); yoyakusha[$i] = $row["yoyakusha"]; $sinnsatuken[$i] = $row["caid"]; $i++; } } ?> <center> <font size = "5" color = "#DC143C">1日分予約確認画面</font> <br> <br><font size = "5"><font color ="#4682b4" ><b><?php print $hiduke; ?></b></font>の予約は以下のとおりです。</font> <br> <br> <table width = 600 border="1"> <td width = "150" align = "center" bgcolor="#ffd700"><font size = "5">時間</font></td> <?php for($j = 0; $j <= $i-1 ; $j++) { ?> <tr><td><center><font size = "5"><?php echo $jikan[$j] ?></font></center></td> <?php } ?> <?php } ?> </center> </font> </table> <?php // ================================================= // ----- 登録データチェック // ================================================= function entchk($array) { ?> <font size ="5" color = "#ff0000"> <?php $strerr = ""; if ($array["hiduke"] == "") { echo "<p> 日付が入力されていません!もう一度入力してください。<br><br><br>"; print "<a href = index.php>● 日付入力画面へ</a>\n"; $strerr = "1"; } if ($strerr == "1") { return FALSE; } else { return TRUE; } ?> </font> <?php } 日付を受け取る側で、半角入力されているかチェックしたいのですが、できずに困っています。 見やすいサイトや、いいやり方があったら教えてください。お願いします。

    • 締切済み
    • PHP
  • 文字を数字に変換したい

    こんにちは SQL文で困っています。 SQL = "select * from LIBL.APF" SQL = SQL & " WHERE AAAA = '" & aaaa & "'" を発行した時にエラーが出ます。 SQL = "select * from LIBL.APF" SQL = SQL & " WHERE AAAA = '1000'" 直接文字列を打つと同じエラーがでます。 SQL = "select * from LIBL.APF" SQL = SQL & " WHERE AAAA = 1000" 直接数字を打つと正常に動作します。 データーベースのフィールド属性が数字なのでこのエラーが出ていると思い syanoを数字フィールドにしようと aaaa=1000+0 などやってみたのですが、計算はできても、中身は1000という文字になっているようです。 AS/400のデーターベースをCAで参照しIIS5.0で表示させたいのでフィールド属性は変える事ができませんので、どうしてもaaaaを数字にしたいのですがどうしたら良いのかわかりません どなたかご教授お願いします。