CAST(1 AS SIGNED INTEGER)がMySQLでBIGINTを返すのはなぜですか?


8

私がそうするなら、私はCAST(1 AS SIGNED INTEGER)いつもBIGINT返されることになります、例えば:

$ mysql -u root -p --column-type-info
Enter password:

--- Copyright and help message snipped for brevity ---

mysql> select cast(1 as signed integer);
Field   1:  `cast(1 as signed integer)`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       LONGLONG            <== LONGLONG i.e. 64 bit integer
Collation:  binary (63)
Length:     1
Max_length: 1
Decimals:   0
Flags:      NOT_NULL BINARY NUM


+---------------------------+
| cast(1 as signed integer) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

そのキャストからの戻り値の型はLONG(32ビット整数)であると期待していました。

が含まれているテーブルから列を選択すると、INT実際には単なるLONG

mysql> describe contact;

+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| contact_id | int(11) | NO   | PRI | NULL    | auto_increment |

      == remainder of table snipped ==

mysql> select contact_id from contact where contact_id = 20;
Field   1:  `contact_id`
Catalog:    `def`
Database:   `centreon`
Table:      `contact`
Org_table:  `contact`
Type:       LONG                     <== LONG i.e. 32 bit integer
Collation:  binary (63)
Length:     11
Max_length: 2
Decimals:   0
Flags:      NOT_NULL PRI_KEY AUTO_INCREMENT NUM PART_KEY


+------------+
| contact_id |
+------------+
|         20 |
+------------+
1 row in set (0.00 sec)

mysql>

同じ列を符号付き整数にキャストすると、再び64ビット整数が返されます。

mysql> select CAST(contact_id as signed integer) from contact where contact_id = 20;
Field   1:  `CAST(contact_id as signed integer)`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       LONGLONG
Collation:  binary (63)
Length:     11
Max_length: 2
Decimals:   0
Flags:      NOT_NULL BINARY NUM


+------------------------------------+
| CAST(contact_id as signed integer) |
+------------------------------------+
|                                 20 |
+------------------------------------+
1 row in set (0.00 sec)

同様に報告された問題がここにあります:

http://bugs.mysql.com/bug.php?id=64084

しかし残念なことに、OPは正解を返さない。

これはCAST()関数のバグですか、それとも設計によるものですか?


キャスト()/変換()のためのドキュメントを見ると、それが唯一の64ビット整数が言及dev.mysql.com/doc/refman/5.7/en/...
Philᵀᴹ

@フィル-私は何度も何度も読んだ。なぜそれSIGNED [INTEGER]がセクションで言うのですか結果のタイプは次の値のいずれかになります。あるSIGNED INTEGERのコンテキストでCASTはない実際には32ビットの整数?
Kev

「MySQLは64ビット値の符号付きと符号なしの両方で算術をサポートしています。数値演算子(+や-など)を使用していて、オペランドの1つが符号なし整数の場合、結果はデフォルトで符号なしです(セクション12.6.1、「算術演算子」)これは、SIGNEDまたはUNSIGNEDキャスト演算子を使用して、値をそれぞれ符号付きまたは符号なし64ビット整数にキャストすることでオーバーライドできます。一部
Philᵀᴹ

@Phil-ええ、私もそれを読みSELECT 1+1ましたBIGINT。実際、それは期待どおりに動作します。つまり、結果は。しかし、それはまだ、なぜ離れて説明していないCAST()ドキュメントに振る舞う反するが、(私はそれを理解)と生産BIGINTへのキャストに尋ねても、SIGNED INTEGERまたはUNSIGNED INTEGER単一のスカラー値に。
Kev

私がここで見つけた最良のソリューション:BIGINT UNSIGNEDをINTに変換

回答:


0

あなたがhttps://www.w3schools.com/sql/func_mysql_cast.aspで見ることができるように

SIGNED値をSIGNED(符号付き64ビット整数)に変換します

UNSIGNED値をUNSIGNED(符号なし64ビット整数)に変換します

そして公式のMySQLドキュメントから:https : //dev.mysql.com/doc/refman/5.7/en/cast-functions.html

MySQLは、符号付きと符号なしの両方の64ビット値での算術をサポートしています。オペランドの1つが符号なし整数である数値演算子(+や-など)の場合、結果はデフォルトで符号なしになります(セクション12.6.1「算術演算子」を参照)。これをオーバーライドするには、SIGNEDまたはUNSIGNEDキャスト演算子を使用して、それぞれ値を符号付きまたは符号なし64ビット整数にキャストします。

したがって、SIGNEDまたはUNSIGNEDデータ型を使用すると、CAST出力は実際には64ビット整数になるように見えます。


-1

MySQLでは32ビットとしてIntストア。

MySQLは、符号付きと符号なしの両方の64ビット値での算術をサポートしています。オペランドの1つが符号なし整数である数値演算子(+や-など)の場合、結果はデフォルトで符号なしです。これをオーバーライドするには、SIGNEDまたはUNSIGNEDキャスト演算子を使用して、それぞれ値を符号付きまたは符号なし64ビット整数にキャストします。

これが、intがlong intを示している理由です:32ビット

そしてsigned intの場合、それはlong long intまたはBIG intを示しています:64 int

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.