如何解决mysql最高位是1还是0,当列设计为signed int时
为什么存储负数时最高位是0?
- 以下是我的 SQL 演示:
create table test
(
a int not null primary key,b varchar(20) not null
);
insert into test values (-4,'aaa');
insert into test values (5,'bbb');
- 通过 hexdump 将 test.ibd 转为 txt
[root@xxxxx test2]# hexdump -C -v /usr/local/mysql/data/test2/test.ibd > test.txt
- /usr/local/mysql/data/test2/test.txt
-
那么,当存储负数时,为什么最高位是 0。
我很困惑它与 C/C++ 不同。
-
其他信息
mysql 版本:5.8 引擎:innodb
解决方法
首先,您的 create table
代码与您的数据不匹配,您需要将该列定义为 signed,而不是 unsigned(否则你显然不能存储负值)。
InnoDB 通过设置最高有效位来存储正signed整数:请注意,在您的示例中,值 5
存储为 80 00 00 05
,而不是 00 00 00 05
。负值仍使用补码表示,但最高有效位未设置。
所以要从字节值(解释为无符号整数)到有符号值,您可以将其视为从中减去偏移量 80 00 00 00
。例如。 7f ff ff fc
作为无符号整数将是 2 147 483 644,减去 2 147 483 648 将是 -4。此外,如果你只按字节排序,你会得到 7f ff ff fc
(-4
) ... 7f ff ff ff
(-1
) ... 80 00 00 00
({{ 1}}) ... 0
(80 00 00 05
).
请注意,无符号整数照常存储(例如,5
存储为 5
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。