0

列のデータ型のパラメーターは正確に何をしますか? 基本的に:

TINYINT(1) を試してみたところ、1 または 0 しか保持されていないように見えました。少なくとも 0 ~ 9 を表示/保存しないのはなぜですか?


編集: 問題は MySQL の問題ではなく、CakePHP による予期しない動作であることが判明しました。詳細については、私の回答をお読みください。元の質問を以下に残しておくと、役立つ回答が理にかなっています。


私がやったこと:

コマンドを使用してMySQLテーブルを作成しました

CREATE TABLE table_name (
    ... irrelevant columns
    transaction_type TINYINT(1) NOT NULL COMMENT 'identifier from 0-5 (for now)'
);

transaction_type 列に 0 と 1 以外の値を格納できなかったため、すぐに完全に混乱しました。

いくつかの調査の結果、to TINYINT(またはその他の整数データ型) のパラメーターは、文字の表示幅にすぎないとかなり自信を持って判断しました。私はこれが2つのことを意味することを理解しました:

  • TINYINT の境界内にある限り、挿入された値全体を格納する必要があります。
  • 1 文字しか表示されないので、表から選択すると 0 ~ 9 の値が表示されるはずです。

これらの仮定の少なくとも 1 つ (またはパラメーター全体に対する私の理解) が間違っているに違いないと考えています。なぜなら、その列に 1 より大きい値を挿入しようとすると、常に 1 が表示されるからです。

次に試しました:

ALTER TABLE table_name CHANGE transaction_type transaction_type TINYINT;

突然、好きな値を挿入できるようになりました。ただし、上記のコマンドでテーブル全体が変更されたにもかかわらず、以前の挿入の値は 1 のままであり、実際に 1 として格納されているのではないかと疑っています。

表示幅を誤解していますか、それとも何か他のことを完全に間違っていますか?

余談ですが、整数列がテーブルでどのように表示されるかを気にしない場合、パラメーターを指定する理由はありますか? つまり、INT(11) は INT よりも優れていますか?

おそらく私にとってもっと役立つはずの同様の質問: MySql: Tinyint (2) vs tinyint(1) - 違いは何ですか?

表示幅を説明する最も明確な情報源: http://matt.thomm.es/archive/2006/11/28/mysql-integer-columns-and-display-width

4

3 に答える 3

3

MySQL は BOOL を TINYINT(1) にエイリアスするため、CakePHP は TINYINT(1) がブール型であるべきであると想定していることが判明しました。したがって、「真」の値 (1 より大きい値など) は 1 に割り当てられ、「偽」の値はゼロに割り当てられます。

疲れた旅行者への警告: TINYINT(1) を使用する場合、CakePHP は警告なしに値を変更することがあります。

古い CakePHP のバグはこちら

于 2013-08-07T23:08:11.853 に答える