MySQL数据类型 - 签名无符号

时间:2016-11-22 06:39:45

标签: php mysql sqldatatypes

让我们考虑一下TINYINT。 W3Schools表示它的有符号范围是-128到127,无符号范围是0到255.

1)为什么它的范围是-128到127,为什么它的范围是-128到255.

2)这些范围是否意味着我不能取-129或256的值? (假设我正在填写一个表格,我有一个文本框)

3 个答案:

答案 0 :(得分:0)

有符号和无符号的范围与优化相同。 unsigned仅用于上限意味着它不允许负数。所以,当你知道你只需要正数时,总是使用ununsigned。

检查here

答案 1 :(得分:0)

tinyint值不是-128到255,这就是他们不说的原因。

创建表时,它是签名或未签名的。如果未指定,则默认值为-128至127.如果在创建表时指定unsigned,则其值为0到255。

  Insert into tbl_name (1, 2, 3)
  Values (1, 2, 3);

 Insert into tbl_name (1, 2, 3)
 Values (1, 2, 3);

第二个答案是“是”,你不能在tinyint中使用-129或256的值。检查此link以了解每个的上限和下限。

答案 2 :(得分:0)

TINYINT UNSIGNED通过8位(1字节)表示。信息理论的基本知识表明只有256个不同的值(256 = 2 ^ 8)可以用8位表示。

" tinyint"的8位是由MySQL 以两种方式之一解释的

TINYINT SIGNED,其中256个值被解释为为0..255,或

TINYINT(别名SIGNED,因为0是默认值),其中解释的范围是-128..127。

当最高位为SIGNED时,8位在UNSIGNED1之间相同地表示0..127。但当最高位为ENUM('red', 'yellow', 'green') 时,8位代表负数或更大的正数。

如果您愿意,您可以 256个值解释为' red',' yellow',' green',这正是使用不同数据类型时所发生的情况:

CHAR

8位字节的另一个解释为您提供Ascii字符。请参阅VARCHARTEXTTINYINT

由于SIGNED必须是UNSIGNEDTINYINT,因此 不能包含这两个值的SMALLINT SIGNED列:-111和222(在不同的行中)。如果您需要,请使用import slick.driver.PostgresDriver.api._ import slick.lifted._ import java.sql.{Date, Timestamp} /** A representation of the message decorated for Slick persistence * created_date should always be null on insert operations. * It is set at the database level to ensure time syncronicity * Id is the Twitter snowflake id. All columns NotNull unless declared as Option * */ class RawMessages(tag: Tag) extends Table[(String, Option[String], Timestamp)](tag, Some("rti"), "RawMessages") { def id = column[String]("id", O.PrimaryKey) def MessageString = column[Option[String]]("MessageString") def CreatedDate = column[Timestamp]("CreatedDate", O.SqlType("timestamp default now()")) def * = (id, MessageString, CreatedDate) } 。 (这导致讨论数字的16位表示。)