TINYINT(1)
がブール値として機能するのはなぜですか?私が公式ドキュメントを理解した方法では、(1)は表示幅が1であることを意味するはずなので、_56
_を格納すると、_5
_が出力されるはずだと思いました。しかし、何らかの理由で、常に_1
_または_0
_のいずれかを出力します。
また、_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には、他の整数値を格納することを妨げるものはありません。
列がonly0または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)
は少し奇妙です。これは(おそらくBOOLEAN
データ型として機能することになっているため)、一部のコンテキストでは_0
_と_1
_のみを返しますが、保存されたままです(-128〜127)値。
(訂正:この奇妙な動作はSQL-Fiddleでのみ表示され、MySQLにローカルでアクセスする場合は表示されないため、SQL-Fiddleの癖である可能性があります。 MySQLの問題ではなく、BOOLEAN
)と同等です。
SQL-Fiddleを参照してください
_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
_
これは、mysqlJdbc構成サブジェクトです。
Jdbc url構成プロパティ「tinyInt1isBit」を「true」(デフォルト)または「false」に設定することにより、mysql jdbcを構成してTinyInt(1)をブール値または整数に変換できます。
差出人: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
ドライバはデータ型TINYINT(1)をBITタイプとして扱う必要がありますか(サーバーはテーブルの作成時にBIT-> TINYINT(1)をサイレントに変換するため)?
デフォルト:true
エンジンは、TINYINT(1)
とBOOL
が同じであることを認識できるほど賢いです。ただし、INT(1)
は、基になるストレージサイズではなく、表示幅にのみ影響します。表示幅は、値が表示幅よりも小さい場合にのみ機能します。次に、パディングされます。
http://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/
私が理解しているように、TINYINT(1)
は'0'
または'1'
(自分の経験から)しか保持できません。
したがって、'0'
または'1'
はtrue
またはfalse
に変換されると想定できます。