关于Mysql BigInt实现的研究

背景

手头有一个海思处理器基于 ARM v7的开发版,在上面构建了 Mysql 和 Go,PHP的服务,这个板子是个32位的处理器,按照经验32位的处理器int大小应该是 32 bit大小,所以在程序爆超int范围的时候我并不奇怪,但是惊人的发现Mysql似乎没有收到影响。于是有了下面的内容,做一个记录。

错误发生的场景

有一张表,用来存储我听过的音乐,用了Mysql的 bigint数据类型,随着数据量的上升,这个值超过了int32的上限,我的Golang 程序和 php程序都给我报告了一个错误,xxx out of range。唯独Mysql没有异常。
表结构如下

create table play_list
(
    id      bigint null,
    song_id bigint null,
    constraint play_list_pk
        unique (id, song_id)
);

研究

Mysql官网对数据类型的说明并没有标注会应为平台是32位还是64位而有什么不同。
https://dev.mysql.com/doc/refman/8.0/en/integer-types.html

在搜索一遍无果以后,我直接找到了Mysql 的源码
https://github.com/mysql/mysql-server/blob/5.7/strings/dtoa.c
https://github.com/mysql/mysql-server/blob/8.0/strings/dtoa.cc

看完源码答案就很明了了,Mysql自己封装了运算,统一转为32位进行处理,从而实现了类型兼容。

比较好奇的是也没有可能判断一下处理器类型使得处理性能在64位机器上更快一些了?Go和php也没有可能用类似方法处理一下int64的问题呢?

点赞