博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 之使用uuid_short 报错 Out of range value for column 'id' at row 1 问题
阅读量:2053 次
发布时间:2019-04-28

本文共 862 字,大约阅读时间需要 2 分钟。

这几天开发过程遇到一个关于MySQL报错的问题,最后归根揭底找到问题所在,分享一下心得

先看这个错误是怎么出来的:

我写了一个关于 uuid_short的函数,

结果发现执行这个函数的时候报错了  SELECT SEQNEXTVAL('MDM_KH_SEQ') AS ID FROM DUAL

原因分析

然后直接就报了这个错,网上说是因为这个字段值太大,字段类型放不下这个,所以果断改成bigint(50),一看还是不行,最后改成vachar(255),好了,但问题的根源不在这里,根源在于这个 uuid_short 长度的问题,

小编发现有的MySQL 获得的 uuid_short 是17位,有的是20位,长度竟然不一样,

select uuid_short() as id 

这里可以知道原因是在字段类型上面,bigint 20 对应的类型是 long long 类型 【长度为:(-2^63 ~ 2^63-1) 10^18 19位数字】;

而UUID_SHORT() 返回的是 unsigned long long 类型【长度为:(0 ~ 2^64-1) 10^19 20位数字】

解决方案

底下这个是在网上搜到别人说的,我是没找到这个设置

所以,原因是在MySQL设置的时候没有**勾选无符号****这个选项导致的,勾选上就解决了。╮(╯▽╰)╭ 就是这么的简单的地方。

我自己的临时处理方式是:

因为我们获取到的是20位,如果非要一个长度位17位的,可以截取一下

if(LENGTH(uuid_short())>=17,substring(uuid_short(), -17),(uuid_short()));

这个话的大意就是:

采用sql专用的 三目运算 ,切记括号不要丢了,很关键

如果 uuid_short() 获取的结果大于或者等于17位,就从后17位截取,否则取他本身的长度,这样可以临时保证你的uuid_short是17位

我之所以需要这个一定要小一点,是因为项目业务需要,跟其他的无关,请大家别搞错了

转载地址:http://apulf.baihongyu.com/

你可能感兴趣的文章
Prometheus hang 住问题定位解决
查看>>
别看 DNS 污染闹得欢,现在我用 CoreDNS 将它拉清单
查看>>
百度为什么掉队了
查看>>
Containerd 中的 Snapshot 到底是个什么鬼?
查看>>
Dockerd 资源泄露怎么办
查看>>
高性能 Nginx HTTPS 调优 - 如何为 HTTPS 提速 30%
查看>>
在 Kubernetes 中部署高可用 Harbor 镜像仓库
查看>>
容器网络一直在颤抖,罪魁祸首竟然是 ipvs 定时器
查看>>
阿里宣布拆中台,首当其冲就是优化数据中台架构?
查看>>
Cilium 源码解析:Node 之间的健康探测(health probe)机制
查看>>
前几天是谁说 WireGuard 不香的?看我今天怎么怼你
查看>>
配置 containerd 镜像仓库完全攻略
查看>>
iTerm 2 使用触发器和 expect 实现 ssh 自动登录
查看>>
Kubernetes Pod 突然就无法挂载 Ceph RBD 存储卷了。。
查看>>
解决 Kubernetes 部署 Metrics Server 无法访问 Apiserver 问题
查看>>
AWS 容器三大新品:K8s 发行版,免费镜像库和 “Game Changer”AWS Proton
查看>>
多平台容器镜像构建就看这一篇
查看>>
macOS Big Sur 使用全新虚拟化框架创建超轻量虚拟机!
查看>>
16 岁高中生成功在 iPhone 7 上安装 Ubuntu 20.04 桌面!
查看>>
两个程序都要用同一个端口,怎么解?
查看>>