`

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 ***************************

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引擎表的主键选型

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    利用mysql实现的雪花算法案例

    - 利用MySQL的内置函数结合时间戳、自增序列等生成ID。 - 创建触发器,每当插入新行时,自动计算并设置ID。 需要注意的是,由于JavaScript的最大整数限制在53位,所以如果要与前端交互,建议调整算法,使得ID不超过...

    Mysql面试题详解MySQL常见面试题汇总(建议收藏!!!)

    MySQL 面试题详解 一、索引相关 1. 索引的定义和作用:索引是一种数据结构,可以帮助我们快速地进行数据的查找。索引的主要作用是帮助服务器避免排序和临时表,将随机 IO 变为顺序 IO,提高数据的检索速度。 2. ...

    SQLServer和MySql语法和关键字的区别详解

    25. **唯一标识符**: MySQL 中的 `uuid()` 函数与 SQLServer 中的 `GUID()` 功能相似。 26. **输出参数**: MySQL 中的 `OUT` 参数对应 SQLServer 中的 `OUTPUT`,并且在 MySQL 中 `OUT` 放在变量前,而在 SQLServer ...

    C++连接mysql数据库

    ### C++连接MySQL数据库知识点详解 #### 一、引言 在软件开发中,数据库连接是必不可少的一个环节。本文将详细介绍如何使用C++语言来连接MySQL数据库,主要介绍两种方式:利用ADO(ActiveX Data Objects)连接以及...

    MYSQL迁移达梦数据库的程序信创适配

    - **UUID()函数替换**:达梦提供了guid和newid作为替代,或自定义一个UUID函数。 - **视图、函数、存储过程的手动迁移**: - 存储过程中的声明部分调整(多个declare改为单个declare)。 - 注释掉异常处理语句...

    MySQL 随机密码生成代码

    MySQL 随机密码生成代码详解 随机密码生成是一个常见的需求,特别是在数据库应用中,需要生成随机密码来确保数据安全。在 MySQL 中,可以使用存储函数来生成随机密码。今天,我们将详细介绍如何使用 MySQL 生成随机...

    MySQL 开发规范

    ### MySQL开发规范详解 #### 一、索引设计原则 **1.1 低选择性的列不加索引** - **举例**:如性别、是否删除等字段,这类字段值域很小,通常只有几种固定的值,加索引反而可能会降低查询效率。 - **目的**:避免...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    这种策略对应MYSQL的uuid()函数,SQL Server的newid()函数,ORACLE的rawtohex(sys_guid())函数等。 uuid.hex uuid.hex是一种基于uuid的主键生成策略。这种策略和uuid策略类似,但建议使用uuid替换。 在JPA中,...

    分页查询sql

    #### 三、ROW_NUMBER()函数详解 `ROW_NUMBER()`函数是SQL Server提供的一个窗口函数,用于为结果集中的每一行分配一个唯一的数字。它可以与`OVER()`子句一起使用,以定义分配行号的方式。 - **基本语法**: ```...

    C++连接数据库的实例

    ### C++连接数据库的实例详解 #### 一、引言 在现代软件开发中,数据库操作是必不可少的一部分。C++作为一种强大的编程语言,在处理复杂的系统级任务时具有显著优势。本文将详细介绍一个C++程序如何连接到数据库并...

    java方面的知识总结

    - **ajax异步请求详解**:Ajax技术允许网页在不重新加载整个页面的情况下,动态地更新部分网页内容。通常涉及使用JavaScript和XMLHttpRequest对象进行后台数据交互。 #### MySQL - **查询语句书写顺序**:`SELECT` ...

    django基础配置

    ### Django基础配置详解 #### 一、环境与配置文件概览 Django 是一款非常流行的 Python Web 开发框架,以其高效、简洁著称。对于初学者来说,掌握 Django 的基本配置至关重要。本篇将详细介绍如何配置 Django 的...

    详解Java的MyBatis框架中动态SQL的基本用法

    例如,MySQL中可以使用`UUID()`函数或自增列等方式生成主键。在示例中,通过`nextval('student')`函数生成一个主键,并将其设置到实体类的`studentId`属性上。`<selectKey>`标签的`keyProperty`属性指定了结果应该...

    hibernate精华

    【Hibernate 知识点详解】 Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库交互,简化了数据库应用程序的开发。以下是对 Hibernate 核心概念和操作的详细说明: 1....

    SQL开发规范

    ### SQL开发规范详解 #### 一、概述 SQL开发规范是指在进行数据库开发过程中为了确保代码的一致性、可读性和高效性所遵循的一系列规则和标准。良好的SQL开发规范不仅可以提升开发团队的工作效率,还能有效减少后期...

    hibernate小结

    - 可以使用`uuid`、`native`、`assigned`等多种主键生成策略。 #### 六、一对一关联映射 1. **一对一关联映射简介**: - 一对一关联可以通过实体ID共享的方式来实现。 - 映射方式如下所示: ```xml <!-- ...

    hibernate参考文档

    ### Hibernate参考文档知识点详解 #### 一、简介与入门指南 **标题:** hibernate参考文档 **描述:** hibernate_reference为英文版文档,建议初学者先阅读中文资料再进行深入学习。 - **1.1 简介** Hibernate...

    数据库开发规范

    ### 数据库开发规范详解 #### 一、数据库设计规范 1. **所有数据库对象名必须使用小写字母并用下划线分割** - **解释**:为了保持一致性,所有的数据库对象名(如表名、视图名、字段名等)都应该使用小写字母,...

    hibernate-note学习笔记

    ### hibernate-note学习笔记知识点详解 #### 一、对象持久化 **1.1 概述** 对象持久化是指将程序中的对象状态保存到非易失性存储中(如硬盘或磁盘等),以便在系统重启后仍能保留这些状态。这种技术常用于将对象的...

Global site tag (gtag.js) - Google Analytics