sql >> データベース >  >> Database Tools >> phpMyAdmin

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

    MySQL整数型の括弧内の(1)は、データ型によって受け入れられる値の範囲、またはデータ型の格納方法とは関係ありません。表示専用です。

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



    1. MySQLDBCCCHECKIDENT構文エラー

    2. SSMSプランからの不適切なカーディナリティ推定– redux

    3. クエリを更新すると、データベースのフィールドが空になります

    4. SSMS:スクリプトで文字列を選択するときは、同じリテラルを強調表示します