MySQL UUID函數的詳解(轉)

來源:互聯網
上載者:User

標籤:

MySQL UUID函數的詳解

MySQL中可以有二類用於產生唯一值性質的工具:UUID()函數和自增序列,那麼二者有何區別呢?我們就此對比下各自的特性及異同點:

l  都可以實現產生唯一值的功能;

l  UUID是可以產生時間、空間上都獨一無二的值;自增序列只能產生基於表內的唯

一值,且需要搭配使其為唯一的主鍵或唯一索引;

l  實現方式不一樣,UUID是隨機+規則群組合而成的,而自增序列是控制一個值逐步增長的;

l  UUID產生的是字串類型值,固定長度為:36個字元,而自增序列產生的是整數類型值,長度由欄位定義屬性決定;

 

接下來,詳細講解下UUID()函數產生的值:

[email protected] : (none) 06:09:40> SELECT UUID(),UUID(),LENGTH(UUID()),CHAR_LENGTH(UUID())\G

*************************** 1. row ***************************

(註:其中 \G代表前一個匹配的結束   參考建:http://wenku.baidu.com/view/f5e5dcf07c1cfad6195fa711.html)

UUID(): de7ee638-4322-11e0-85ab-842b2b4a7e75

UUID(): de7ee642-4322-11e0-85ab-842b2b4a7e75

LENGTH(UUID()): 36

CHAR_LENGTH(UUID()): 36

1 row in set (0.00 sec)

 

從上面的執行結果部分的資訊看

l  同一個SQL語句中,多處調用UUID()函數得到的值不相同;

l  得到的隨機值由5個部分組成,且分隔字元位為:中劃線;

l  多次調用或執行得到的後2組值相同,若把mysqld伺服器關閉,重新啟動之後,會發現第四組的組與未重啟前的值發生變化,然後一直不變化,只要重新啟動mysqld服務就會發生變化。另外,對於同一台機器,第五組值始終不會發生變化;

l  字元個數為:36,占位元組數為:36(註:系統預設字元集編碼:utf8);

 

針對UUID產生的值組成部分,作如下解說:

l  前三組值是時間戳記換算過來的;

l  第四組值是暫時性保持時間戳記的唯一性。例如,使用夏令時;

l  第五組值是一個IEE 802的節點標識值,它是空間上唯一的。若後者不可用,則用一個隨機數字替換。假如主機沒有網卡,或者我們不知道如何在某系統下獲得機器地址,則空間唯一性就不能得到保證,即使這楊,出現重複值的機率還是非常小的。

 

UUID函數對複製的支援:

UUID函數屬於不確定性函數,為此不支援MySQL 複製的STATEMENT模式,但是支援MIXED、ROW二種模式,大家可以設定2組測試模式,以5.1.系列版本為例。

測試基於命令列模式複製:

tx_isolation = REPEATABLE-READ

binlog_format = STATEMENT

 

測試基於命令列/混合模式複製:

tx_isolation = REPEATABLE-READ

binlog_format = MIXED  OR ROW

 

在主伺服器上執行同一個SQL語句:

INSERT INTO  test_uuid(username) VALUES(UUID());

然後再比對主從伺服器上表中儲存的值,會發現基於命令列模式的:主從不一致,基於行/混合模式的:主從資料時一致;

 

建議:在複製模式下,需要用到UUID()函數,則一定要使用基於行/混合模式複製方式。

名詞解釋:

對於輸入參數相同,且同一時間執行或一個SQL中多處調用,而得到不同值得函數,我們就稱其為:不確定性函數

備忘:

在MySQL 5.1.*及更高版本有一個變種的UUID()函數,名稱:UUID_SHORT(),產生一個64位無符號的整數,例如:

[email protected] : (none) 02:46:42> SELECT UUID_SHORT()\G

*************************** 1. row ***************************

UUID_SHORT(): 6218676250261585921

1 row in set (0.00 sec)

 

後續加註:

UUID()函數產生的值,並不適合作為InnoDB引擎表的主鍵,至於詳細的原因,請閱讀文章InnoDB引擎表的主鍵選型(http://www.mysqlops.com/2011/09/10/innodb-primary.html)。

後續添加的:

在mysql中,可以使用uuid 來產生主鍵,但是用mysql的uuid()函數 ,產生的uuid是36位的,其中包含32個字元以及4個分隔字元(-),往往這個分隔字元對我們來說是沒有用的,可以使用mysql內建的replace函數去掉分隔字元

replace(uuid(),‘-‘,‘‘)   ---->將uuid()中的‘-’,去掉,即替換成空串;

此外

upper(replace(uuid(),‘-‘,‘‘))用於將字元轉換為大寫

文章來源:http://www.mysqlops.com/2011/03/01/mysql-uuid.html

MySQL UUID函數的詳解(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.