这几天开发过程遇到一个关于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位
我之所以需要这个一定要小一点,是因为项目业务需要,跟其他的无关,请大家别搞错了