如何在MySQL中理解bigint是有符号的还是无符号的?

如何在MySQL中理解bigint是有符号的还是无符号的?

在MySQL中,bigint是指一种整型数据类型,常用于存储较大的整数。但是我们在创建表时需要指定其是否有符号。那么,bigint是有符号的还是无符号的呢?如何理解它们之间的区别呢?接下来,我们将详细介绍这两种类型的含义及应用。

阅读更多:MySQL 教程

什么是有符号和无符号?

在计算机中,所有的数据存储都是以二进制形式保存的。在二进制中,最高位表示符号位,0表示正数,1表示负数。因此,有符号数可以表示正数、负数和0。而无符号数则没有符号位,它只能表示非负整数,即0和正整数。

比如,下面的二进制数列,分别表示有符号数和无符号数:

十进制 二进制(有符号) 二进制(无符号)
-1 1111 1111 255
0 0000 0000 0
1 0000 0001 1
127 0111 1111 127
128 1000 0000 128
255 1111 1111 255

从上面的表格可以看出,有符号数和无符号数的二进制表示方法不同。但是,它们的最后都表示了相同的数值。相比之下,有符号数可以表示更广泛的数值范围,但是只能表示一半的非负整数。

MySQL中的bigint

在MySQL中,bigint是一种整型数据类型,可以存储大范围的整数。它通常使用8个字节(64位)来表示。当我们创建表时,可以在定义字段时使用UNSIGNED属性来指定该字段是否是无符号类型。

比如,我们定义一个名为id的bigint类型字段,它是有符号类型的:

CREATE TABLE test(
    id BIGINT(20) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的SQL语句中,BIGINT(20)表示该字段数据类型为bigint,20表示最大长度,即bigint类型的范围。NOT NULL表示该字段不能为空,PRIMARY KEY表示该字段为主键。

而如果我们要创建一个无符号的bigint类型字段,则可以在定义字段时加上UNSIGNED属性:

CREATE TABLE test(
    id BIGINT(20) UNSIGNED NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在MySQL中,如果没有明确指定该字段是否为无符号类型,则默认为有符号类型。有符号类型的范围为-9223372036854775808 ~ 9223372036854775807。而无符号类型的范围为0~18446744073709551615。

如何确定bigint是有符号还是无符号?

对于MySQL中的bigint类型,我们可以通过使用DESCRIBE命令或者查看INFORMATION_SCHEMA.COLUMNS系统表来确定它是有符号还是无符号的。

比如,我们查看上面定义的test表的结构:

DESCRIBE test;

执行结果如下:

Field Type Null Key Default Extra
id bigint(20) NO PRI NULL

可以看到,该表的id字段数据类型为bigint(20),而没有指定该字段的UNSIGNED属性。因此,该字段是有符号的。而如果该字段定义为无符号的,其Type将为bigint(20) unsigned。

有符号和无符号的差别及应用

有符号和无符号数的主要差别在于表示范围。由于有符号数需要用一个符号位来表示正负号,所以可以表示的负数范围比无符号数少1。比如,如果我们定义一个有符号的8位整数,它的范围将是-128到127;而同样长度的无符号整数的范围将是0到255,即可以表示的数值比有符号整数多了128。

在MySQL中,我们选择使用有符号数还是无符号数取决于具体的需求。如果我们需要存储正整数或者非负整数,可以使用无符号数来减少存储空间。而如果需要存储正负整数,则需要使用有符号数。

此外,当使用无符号数进行运算时,也需要注意其范围。如果出现负数,可能会导致结果不正确。

示例代码

接下来,我们将通过一些示例代码来说明bigint是有符号的还是无符号的。

首先,我们创建一张名为test的表,其中包含一个有符号的id字段和一个无符号的number字段:

CREATE TABLE test(
  id BIGINT(20) NOT NULL,
  number BIGINT(20) UNSIGNED NOT NULL,
  PRIMARY KEY (id)
);

然后,我们插入一些数据:

INSERT INTO test (id, number) VALUES (-1, 9223372036854775807), (1,18446744073709551615);

这里,我们插入了两条数据,分别是有符号的-1和无符号的18446744073709551615。其中,9223372036854775807是有符号bigint的最大值,而18446744073709551615是无符号bigint的最大值。

接着,我们可以使用SELECT语句查询出所有数据:

SELECT * FROM test;

执行结果如下:

id number
-1 9223372036854775807
1 18446744073709551615

我们可以看到,虽然使用了不同类型的数值,但是它们的二进制表示是相同的。这也是因为,无论是有符号数还是无符号数,它们都使用相同的二进制表示。而不同的是,它们所表示的范围不同。

结论

在MySQL中,bigint类型可以是有符号的或者无符号的,我们可以通过在定义字段时使用UNSIGNED属性来指定其类型。有符号数的范围为-9223372036854775808 ~ 9223372036854775807,而无符号数的范围为0~18446744073709551615。在选择使用有符号数还是无符号数时,需要根据具体需求来确定。此外,在进行运算时,需要注意其范围及可能出现的负数情况。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程