web-dev-qa-db-ja.com

TINYINT(1)がブール値として機能するのに、INT(1)は機能しないのはなぜですか?

TINYINT(1)がブール値として機能するのはなぜですか?私が公式ドキュメントを理解した方法では、(1)は表示幅が1であることを意味するはずなので、_56_を格納すると、_5_が出力されるはずだと思いました。しかし、何らかの理由で、常に_1_または_0_のいずれかを出力します。

また、_56_をINT(1)に格納すると、_56_が出力されます(少なくともSQLFiddleによると)。何が起きてる?

14
argoneus

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で整数を引用する必要はありません。なぜこれほど多くの開発者が引用するのか、私はしばしば戸惑います。

21
Bill Karwin

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
_
8
ypercubeᵀᴹ

これは、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

6
JianrongChen

エンジンは、TINYINT(1)BOOLが同じであることを認識できるほど賢いです。ただし、INT(1)は、基になるストレージサイズではなく、表示幅にのみ影響します。表示幅は、値が表示幅よりも小さい場合にのみ機能します。次に、パディングされます。

http://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/

3
Lance Hudson

私が理解しているように、TINYINT(1)'0'または'1'(自分の経験から)しか保持できません。
したがって、'0'または'1'trueまたはfalseに変換されると想定できます。

0
samdy1