• MySQL UUID函数的详解(转)


    MySQL UUID函数的详解

    MySQL中可以有二类用于生成唯一值性质的工具:UUID()函数和自增序列,那么二者有何区别呢?我们就此对比下各自的特性及异同点:

    l  都可以实现生成唯一值的功能;

    l  UUID是可以生成时间、空间上都独一无二的值;自增序列只能生成基于表内的唯

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

    l  实现方式不一样,UUID是随机+规则组合而成的,而自增序列是控制一个值逐步增长的;

    l  UUID产生的是字符串类型值,固定长度为:36个字符,而自增序列产生的是整数类型值,长度由字段定义属性决定;

    接下来,详细讲解下UUID()函数产生的值:

    oot@localhost : (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位无符号的整数,例如:

    root@localhost : (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

  • 相关阅读:
    清北学堂模拟赛d5t6 cube
    清北学堂模拟赛d5t5 exLCS
    清北学堂模拟赛d5t4 套路
    清北学堂模拟赛d3t2 b
    清北学堂模拟赛d4t2 b
    Android(java)学习笔记196:ContentProvider使用之内容观察者01
    Android(java)学习笔记195:ContentProvider使用之添加数据到联系人(掌握)
    Android(java)学习笔记194:ContentProvider使用之获得系统联系人信息02(掌握)
    Android(java)学习笔记193:ContentProvider使用之获得系统联系人信息01
    Android(java)学习笔记192:ContentProvider使用之虚拟短信
  • 原文地址:https://www.cnblogs.com/netcorner/p/4346179.html
Copyright © 2020-2023  润新知