MySQL UUID函数详解

页面导航:首页 > 数据库 > Mysql > MySQL UUID函数详解

MySQL UUID函数详解

来源: 作者: 时间:2016-02-05 10:57 【

MySQL UUID函数详解MySQL中有二类用于生成唯一值的工具:UUID()函数和自增序列,那么二者有何区别呢?我们就此对比下各自的特性及异同点:1 都可以实现生成唯一值的功能 2 UUID是可以生
MySQL UUID函数详解
 
MySQL中有二类用于生成唯一值的工具:UUID()函数和自增序列,那么二者有何区别呢?我们就此对比下各自的特性及异同点:
 
1. 都可以实现生成唯一值的功能.
 
2.UUID是可以生成时间、空间上都独一无二的值.自增序列只能生成表内的唯一值,且需要搭配使其为唯一的主键或唯一索引.
 
3. 实现方式不一样,UUID是随机+规则组合而成的,而自增序列是控制一个值逐步增长.
 
4.UUID产生的是字符串类型值,固定长度为:36个字符,而自增序列产生的是整数类型值,长度由字段定义属性决定.
 
接下来,详细讲解下UUID()函数产生的值:
 
[email protected] > SELECT UUID(),UUID(),LENGTH(UUID()),CHAR_LENGTH(UUID())\G;

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

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)

 

 
从上面的执行结果部分的信息看:
 
1. 同一个SQL语句中,多处调用UUID()函数得到的值不相同;
 
2.得到的随机值由5个部分组成,且分隔符位为:中划线;
 
3. 多次调用或执行得到的后2组值相同,若把d服务器关闭,重新启动之后,会发现第四组的组与未重启前的值发生变化,然后一直不变化,只要重新启动mysqld服务就会发生变化。另外,对于同一台机器,第五组值始终不会发生变化;
 
4.字符个数为:36,占字节数为:36(注:默认字符集编码:utf8);
 
针对UUID产生的值组成部分,作如下解说:
 
1. 前三组值是时间戳换算过来的;
 
2. 第四组值是暂时性保持时间戳的唯一性。例如,使用夏令时;
 
3. 第五组值是一个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(),可以生成一个17-64位无符号的整数.
 
例如:
 
[email protected] > SELECT UUID_SHORT()\G;

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

UUID_SHORT(): 6218676250261585921

1 row in set (0.00 sec)

 


Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<