這幾天開發過程遇到一個關於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位
我之所以需要這個一定要小一點,是因爲項目業務需要,跟其他的無關,請大家別搞錯了