なぜTINYINT(1)
ブール値として機能するのですか? 私が公式ドキュメントを理解した方法では、(1) は表示幅が 1 であることを意味するはずなので、保存56
すると5
. しかし、何らかの理由で、常にまたはのいずれ1
かを出力します0
。
もう 1 つのケースは、に格納56
するとINT(1)
、56
(少なくとも SQLFiddle によると) 出力されます。何が起きてる?
なぜTINYINT(1)
ブール値として機能するのですか? 私が公式ドキュメントを理解した方法では、(1) は表示幅が 1 であることを意味するはずなので、保存56
すると5
. しかし、何らかの理由で、常にまたはのいずれ1
かを出力します0
。
もう 1 つのケースは、に格納56
するとINT(1)
、56
(少なくとも SQLFiddle によると) 出力されます。何が起きてる?
MySQL 整数型の括弧内の (1) は、データ型によって受け入れられる値の範囲や格納方法とは関係ありません。表示のみです。
MySQL の型に対する私の回答も参照してください: BigInt(20) vs Int(20) など。
TINYINT は、TINYINT(1) または TINYINT(2) または TINYINT(64) と同じです。これは 8 ビットの符号付き整数データ型で、-128 から 127 までの任意の 8 ビット整数値を受け入れます。
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
便宜上、MySQL は BOOL のエイリアスをサポートしていますが、これはすぐに TINYINT(1) に置き換えられます。
mysql> create table b2 (i bool);
mysql> show create table b2;
CREATE TABLE `b2` (
`i` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
私が言ったように、(1) の使用はほとんど意味がありません。これは慣習にすぎないため、TINYINT(1) が表示された場合、列がブール値として使用されることを意図していると想定するのが合理的です。しかし、MySQL には、他の整数値を格納することを妨げるものは何もありません。
列に 0 または 1のみを受け入れさせたい場合は、BIT(1) を使用できます。
mysql> create table b3 (i bit(1));
mysql> insert into b3 values (0), (1);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into b3 values (-1);
ERROR 1406 (22001): Data too long for column 'i' at row 1
mysql> insert into b3 values (2);
ERROR 1406 (22001): Data too long for column 'i' at row 1
ただし、特定の列のストレージは最も近いバイトに切り上げられるため、これは TINYINT と比較してスペースを節約しません。
PS: @samdy1 からの回答にもかかわらず、TINYINT は文字列 '0'
を格納しないか'1'
、まったく格納しません。整数 0
または1
-128 から 127 までの他の整数を格納します。SQL で整数を引用する必要はありません。多くの開発者がそうしています。
TINYINT
-128
列には からまでの数値を格納できます127
。
TINYINT(1)
は少し奇妙ですが。それは(おそらくデータ型として機能することになっているため)、保存された(-128から127)値を保持しながら、何らかのコンテキストでのみBOOLEAN
返します。0
1
(修正:この奇妙な動作は SQL-Fiddle でのみ見られ、MySQL にローカルにアクセスするときは見られないため、おそらく SQL-Fiddle の奇抜さでありBOOLEAN
、MySQL の問題ではありません。
SQLフィドルを参照してください
CREATE TABLE test
( i TINYINT(1)
) ;
INSERT INTO test
(i)
VALUES
(0), (1), (6), (120), (-1) ;
どこで取得しますか (SQL-Fiddle でのみ、MySQL にアクセスする場合はそうではありません!):
SELECT i
FROM test ;
i
-----
0
1
1
1
1
しかし:
SELECT CAST(i AS SIGNED) i2
FROM test ;
i2
-----
0
1
6
120
-1
TINYINT(1)
エンジンはそれを知るのに十分スマートでBOOL
、同じです。ただしINT(1)
、基になるストレージ サイズではなく、表示幅にのみ影響します。表示幅は、値が表示幅より小さい場合にのみ機能します。その後、パディングされます。
http://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/
私が理解しているように、保持できるのはorTINYINT(1)
のみです(自分の経験から)。
したがって、or は orに変換されると想定できます。'0'
'1'
'0'
'1'
true
false