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位

我之所以需要這個一定要小一點,是因爲項目業務需要,跟其他的無關,請大家別搞錯了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章