MySQL 之使用uuid_short 报错 Out of range value for column 'id' at row 1 问题

这几天开发过程遇到一个关于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位

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

猜你喜欢

转载自blog.csdn.net/Alex_81D/article/details/103155431