2010年8月20日

[mysql 15377] Re: int column への2147483648

坂井です

sumiya さん、こんにちは。横から失礼します。

> 5.1.xになって、columnの型がunsignedに変わり、

の部分がとても気になりました。
バージョンアップをする過程のどこかで、signed int が

unsigned int になる操作が入ってしまったのだと推測し
ていますが、心当たりはあるでしょうか。

推測ついでにもうひとつ書くと、
おそらく 5.0.47 でも unsigned int にしたテーブルで
同様の操作をすると、同じ結果(0)になると思います。
処理結果のコードを見ると、Code:1264 の Warning が
帰ってきていませんか。メッセージはこんな感じです。

Out of range value adjusted for column 'c1' at row 1

これは、unsigned のカラムに負の数字を与えたときに
値がゼロに切り捨て(?)られたために出る警告です。

INSERT INTO t VALUES (-2147483648);

という文を、signed 型カラムのテーブルに対して実行すれば
-2147483648 が登録されるし、
unsigned型のテーブルに対して実行したら 0 になります。

この切り捨てが起きないようにする方法も、最近出た奥野さん
の本に出ていましたね。(SQL MODE の話)


Thank you
On Fri, 20 Aug 2010 08:23:53 +0900 (LMT)
Etsuo SUMIYA <sumiya-e@xxxxx> wrote:
> sumiyaといいますす。お世話になっております。
>
> From: Mikiya Okuno <mikiya.okuno@xxxxx>
> Subject: [mysql 15375] Re: int column への2147483648
> Date: Thu, 19 Aug 2010 21:50:03 +0900
> Message-ID: <4C6D287B.3010009@xxxxx>
>
> > bind[0].is_unsigned = 1にしましょう。
> > そうしないと符号付き32ビット整数の最大値=2147483647に
> > 引っかかってしまいます。
>
> うーん!そうだったんですか?確かに、マニュアルを見ると、記載があり
> ますが、サンプルコーディングには記載がないので、見落としました。
>
> アプリを修正してみたところ、動作しました。
>
> 実は、このアプリ、5.0.24aの頃から使っているアプリなんですが、手元
> の環境(5.0.47)では、show create table の結果は、
>
> CREATE TABLE `t` (
> `c1` int(11) default NULL
> ) ENGINE=MyISAM DEFAULT CHARSET=sjis
>
> int がsignedで定義され、先のアプリを実行すると、
>
> mysql> select * from t;
> +-------------+
> | c1 |
> +-------------+
> | 2147483647 |
> | -2147483648 |
> +-------------+
> 2 rows in set (0.03 sec)
>
> となり、書き込みが行えます。5.1.xになって、columnの型がunsignedに
> 変わり、is_unsigned = 1としないといけなくなったということでしょう
> か?
>
> アプリの修正を行います。ありがとうございました。
>
>
>


投稿者 xml-rpc : 2010年8月20日 22:10
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/97814
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。