【mysql】BIGINT UNSIGNED字段被表示为float科学计数法 丢失精度问题

article/2025/6/6 2:48:41

1. 问题

我有如下 sql 查询:

rows, err := db.Query("SELECT COALESCE(creator, ?) FROM table1 LIMIT 1;", "")
if err != nil {return err
}
defer rows.Close()for rows.Next() {var dest stringif err = rows.Scan(&dest); err != nil {return err}fmt.Println("dest: ", dest)  // 值为 6.743046165522305e+16 ?
}

发现数据库存储的 creator 内容是 67430461655223049但是查询结果却被变成了一个科学计数法的 string: 6.743046165522305e+16 

creator 的类型明明是一个 BIGINT UNSIGNED 无符号整型:

`creator` BIGINT UNSIGNED NOT NULL DEFAULT 0

为什么会被扫描成一个 float 格式的字符串的呢?

2. sql 分析

增加一段打印,查看 go-sql-driver 驱动解析出的类型:

colTypes, _ := rows.ColumnTypes()
for _, ct := range colTypes {fmt.Printf("DB Type: %s, Scan Type: %v\n", ct.DatabaseTypeName(), ct.ScanType())
}

发现这个字段真的被驱动解析成了 float 类型:

DB Type: DOUBLE, Scan Type: float64

(1) 使用原本字段

尝试修改 sql 语句:

# sql
SELECT creator FROM table1 LIMIT 1;# 打印
DB Type: UNSIGNED BIGINT, Scan Type: uint64

原始 creator 类型是 uint 没错,那问题就出在了 COALESCE 上

(2) 使用 CAST(COALESCE(creator, ?) 

尝试使用 CAST 函数,将类型手动转换为 uint:

# sql
SELECT CAST(COALESCE(creator, ?) AS UNSIGNED) FROM table1 LIMIT 1;# 打印
DB Type: UNSIGNED BIGINT, Scan Type: uint64# 查询结果
67430461655223048

类型对了,但是发现读出的数据不对了!

应该是 67430461655223049,查询出来变成了 67430461655223048,牙白!丢精度了!

因为:驱动想用 float64 去接收的,但我强制将它转成了 uint,在某些环境下可能会丢失精度。

float64 无法精确表示所有 uint64 范围内的整数,特别是超过 2^53 的数字,就会发生舍入误差。

(3) 使用 COALESCE(CAST(creator AS CHAR), ?)

也就是说,它想用 float,我不能强制转为 uint,那我可以强制转为 string 啊!

# sql
SELECT COALESCE(CAST(creator AS CHAR), ?) FROM table1 LIMIT 1;# 打印
DB Type: VARCHAR, Scan Type: sql.NullString# 查询结果
67430461655223049

ok 结果正确

(4) 使用 COALESCE(creator, '')

在尝试不同的 sql 语句过程中我发现,当我使用 COALESCE(creator, ?) 并传入空字符串作为参数,和直接写死 COALESCE(creator, ‘’) 的行为是不同的,会直接影响字段类型的解析结果:

# sql
SELECT COALESCE(creator, ?) FROM ..# 被解析为float
DB Type: DOUBLE, Scan Type: float64# sql
SELECT COALESCE(creator, '') FROM ..# 被解析为string
DB Type: VARCHAR, Scan Type: string

这是由于: MySQL 在执行查询时会为每个字段生成元信息(metadata),包括字段名、字段类型、是否可能为 NULL、是否是数字类型等。

当使用 COALESCE(creator, ?) 并传参 "" 时,驱动不知道 ? 的实际类型是什么,它会尝试根据 creator(BIGINT UNSIGNED)和参数的默认类型进行推断。go-sql-driver 就会把参数当作 float64 来处理(因为它是数值型),整个 COALESCE(...) 表达式被推断为 DOUBLE 类型。

BUT!这种写法存在隐患:

  • 类型推导不稳定:MySQL可能在某些版本/配置下将其推导为DOUBLE,导致科学计数法(6.743046165522305e+16)
  • 依赖驱动行为:不同版本的go-sql-driver/mysql可能解析出不同Go类型(string/float64)

(5) 使用  IFNULL(CAST(creator AS CHAR), '')

还有一种写法:

# sql
SELECT IFNULL(CAST(creator AS CHAR), ?) FROM table1 LIMIT 1;# 打印
DB Type: VARCHAR, Scan Type: sql.NullString# 查询结果
67430461655223049

也是可以的。

但是 IFNULL 不是标准 SQL,仅限于 MySQL 环境下使用。如果你希望代码兼容其他数据库(如 PostgreSQL),应该优先使用 COALESCE。

3. 解决

最佳写法:

rows, err := db.Query("SELECT COALESCE(CAST(creator AS CHAR), ?) FROM table1 LIMIT 1;", "", "89448245134135417")# 打印
DB Type: VARCHAR, Scan Type: sql.NullString

CAST 直接将字段按映射成了 string 类型,当其值为 NULL 时,被表示为一个空字符串~

4. 几种 sql 写法对比

方案
类型安全
精度保证
推荐
SELECT creator
✅uint64
❌不能处理NULL值
COALESCE( creator , ?)
❌ 变为float64
❌可能出现科学计数法表示
COALESCE(creator, '')
❌ 可能string也可能变为float64
❌依赖驱动版本
CAST(COALESCE(creator, ?) AS UNSIGNED)
✅uint64
❌ 会将float转为uint丢失精度
❌丢失精度
COALESCE(CAST(creator AS CHAR), ?)
✅sql.NullString
IFNULL(CAST(creator AS CHAR), ?)
✅sql.NullString
不是标准SQL不够通用


http://www.hkcw.cn/article/UpoWJTEVdq.shtml

相关文章

05 APP 自动化- Appium 单点触控 多点触控

文章目录 一、单点触控查看指针的指针位置实现手势密码: 二、多点触控 一、单点触控 查看指针的指针位置 方便查看手势密码-九宫格每个点的坐标 实现手势密码: 执行手势操作: 按压起点 -> 移动到下一点 -> 依次移动 -> 释放&am…

aardio 图像识别

今天终于学会了编程中的 OCR 技术!原来计算机真的能识别图片里的文字,这种让程序 "看懂" 图像的能力太神奇了,赶紧把学习过程记录下来。 一、初识OCR:让程序读懂图片文字 (一)简单识别实验 OC…

【北邮 操作系统】第十二章 文件系统实现

一、文件的物理结构 1.1 文件块、磁盘块 类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同 内存与磁盘之间的数据交换(即读/写操作、磁盘I/0)都是以“块”为单位进行的。即…

VS2022下C++ Boost库安装与使用使用

一.Boost概述 1.简介 Boost 是一个广泛使用的 C 库集合,提供了许多高质量、可移植、高效的工具和组件,被视为 C 标准库的延伸。自 1998 年成立以来,Boost 已成为 C 社区的核心资源,许多 Boost 库通过实践验证后被纳入 C 标准&am…

Unity-UI组件详解

今天我们来学习Unity的UI的详解,这部分的内容相对较少,对于程序员来说主要的工作是负责将各种格式的图片呈现在显示器上并允许操作这些图片。 本篇帖子的理论依据依然是官方开源的UGUI代码,网址为:GitHub - Unity-Technologies/u…

化工厂爆炸事件看制造业AI转型

一、事件警示:化工制造安全风险不容忽视 近日,某化学有限公司发生事故。涉事工厂主体工程建设有2座硝化装置区,1座加氢装置区,均属于危险工艺生产装置。硝化反应通常属于强放热反应,原料及产物具有爆炸危险性&#xf…

Ubuntu系统安装与配置NTP时间同步服务

Ubuntu系统安装与配置NTP时间同步服务 一、NTP服务介绍NTP服务简介工作原理系统环境准备检查当前时间状态二、方案选择:systemd-timesyncd vs ntpd三、使用systemd-timesyncd时间同步1. 方案介绍2. 配置优化3. 应用配置4. 验证状态5. 检查当前时间状态6. 查看当前实践四、使用…

【小红书】API接口,获取笔记核心数据

小红书笔记核心数据API接口详解 - 深圳小于科技提供专业数据服务 深圳小于科技(官网:https://www.szlessthan.com)推出的小红书笔记核心数据API接口,为开发者提供精准的笔记互动数据分析能力,助力内容运营与商业决策。…

ElasticStack技术之logstash介绍

一、什么是Logstash Logstash 是 Elastic Stack(ELK Stack)中的一个开源数据处理管道工具,主要用于收集、解析、过滤和传输数据。它支持多种输入源,如文件、网络、数据库等,能够灵活地对数据进行处理,比如…

InternLM2/LM2.5/ViT/VL1.5/VL2.0笔记: 核心点解析

00 前言 本文主要是记录一下关于多模态大模型InternLM/InternVL系列的一些要点的理解。还是那句话,好记性,不如烂笔头。本文当成个人笔记用,行文风格和先前写的LLaVA系列一致。本文的重点是讲解多模态模型InternVL 1.5,但是Intern…

帝可得 - 设备管理

一. 需求说明 设备管理主要涉及到三个功能模块,业务流程如下: 新增设备类型: 允许管理员定义新的售货机型号,包括其规格和容量。 新增设备: 在新的设备类型定义后,系统应允许添加新的售货机实例,并将它们分配到特定的…

建设指南 | Cloud Apps + AI Apps端到端智能应用开发平台

在“云AI”作为基础设施的时代,研发、运维、信息化等部门,通常会面临的棘手问题都有哪些: 算力资源难以统一调度和管理;AI算法研发环境搭建复杂;不同模型部署方式繁杂,统一监控难;AI应用开发效…

【灵动Mini-F5265-OB】vscode+gcc工程创建、下载、调试

【前言】 【灵动Mini-F5265-OB】在官方的例程中提供了mdk、IAR的开发环境,使用起来非常方便。有位大佬也提供了一个gcc的示例,但是我使用vscode的keil插件进行工程创建,但是提示pack是对不上的。所以我决定重新创建我的vscode来创建开发环境。…

【AI论文】VF-Eval:评估多模态大型语言模型(MLLM)在生成人工智能生成内容(AIGC)视频反馈方面的能力

摘要:多模态大型语言模型(MLLMs)最近在视频问答领域得到了广泛研究。然而,现有的大多数评估都侧重于自然视频,而忽视了合成视频,例如人工智能生成的内容(AIGC)。与此同时&#xff0c…

Docker 镜像(或 Docker 容器)中查找文件命令

在 Docker 镜像(或 Docker 容器)中运行如下两个命令时: cd / find . -name generate.py它们的含义如下,我们来一行一行详细拆解,并结合例子讲解: ✅ 第一行:cd / ✅ 含义 cd 是“change dire…

DiskGenius专业版v6.0.1.1645:分区管理、数据恢复、备份还原,一应俱全!

各位小伙伴,大家好!今天阿灿给大家带来一款超好用的分区工具,DiskGenius专业版。这款工具堪称电脑管理界的“瑞士军刀”,功能强大,现在出了新版本v6.0.1.1645,简繁中文单文件便携版,使用超方便。…

‌CDGP|数据治理的低效性:企业AI落地的另一大挑战

在数字化转型的浪潮中,人工智能(AI)已成为推动企业创新发展的重要力量。然而,尽管AI技术具有巨大的潜力和优势,但许多企业在尝试落地AI项目时却面临着重重挑战。其中,数据治理的低效性尤为突出,…

linux学习第19、20天(父子进程)

ps ajx -->查看pid,ppid,gid,sid 父子进程 父子进程相同: 刚fork后,data段、text段、堆,栈、环境变量、全局变量、进程工作目录位置、信号处理方式 父子进程不同: 进程id、返回值、各自的…

AI写作革命:重塑创作未来

人工智能写作技术:革新创作方式的智能利器 人工智能写作技术(AI写作技术)是指利用自然语言处理(NLP)、机器学习(ML)等人工智能技术,辅助或自动化完成文本的创作、编辑与优化。这一技…

法律大语言模型(Legal LLM)技术架构

目录 摘要 1 法律AI大模型技术架构 1.1 核心架构分层 1.2 法律知识增强机制 2 关键技术突破与对比 2.1 法律专用组件创新 2.2 性能对比(合同审查场景) 3 开发部署实战指南 3.1 环境搭建流程 3.2 合同审查代码示例 4 行业应用与挑战 4.1 典型场景效能提升 4.2 关…