MySQL-使用UUID_SHORT( ) 的问题

文章目录

  • MySQL-使用UUID_SHORT( ) 的问题
    • 问题说明
    • 简单分析解决
      • 分析
      • 解决
    • 认真查了一些详细的资料
      • 官方资料
    • 补充BUG--Java数据接收错误

问题说明

app_msg的主键id 设置的类型为:bigint 20

使用插入语句:INSERT INTOapp_msg(id,...) VALUES (UUID_SHORT(),...)

然而系统报错:[Err] 1264 - Out of range value for column 'id' at row 1

在测试环境使用时没有问题,但是在准生产数据库使用时报错了

简单分析解决

分析

在两个数据库查看UUID_SHORT()生成的情况:

select UUID_SHORT()
--结果1:26047177025388691      这里生成了17位的UUID_SHORT
--结果2:18040425909390934036   这里生成了20位的UUID_SHORT

结果1为17位没问题,结果2位20位导致报错的时候超过最大值

解决

这里可以知道原因是在字段类型上面,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设置的时候没有**勾选无符号****这个选项导致的,勾选上就解决了。╮(╯▽╰)╭ 就是这么的简单的地方。

临时解决方式,使用时间错手动生成了一个19位以内的随机id:

FLOOR(REPLACE(unix_timestamp(current_timestamp(3)),'.',''))*10000+FLOOR(RAND()*10000)

认真查了一些详细的资料

官方资料

版本:MySQL 5.7

UUID_SHORT()

将“ 短 ”通用标识符作为64位无符号整数返回。返回的值 UUID_SHORT()与UUID()函数返回的字符串格式128位标识符 不同,并且具有不同的唯一性属性。UUID_SHORT()如果满足以下条件,则保证值 是唯一的:

  • 在server_id当前服务器的值介于0和255之间,您的设置主从服务器中是唯一的
  • 您不会在mysqld restarts 之间设置服务器主机的系统时间
  • UUID_SHORT()在mysqld重启 之间, 你平均每秒调用的次数少于1600万次

该UUID_SHORT()返回值的构造是这样的:

  (server_id & 255) << 56
+ (server_startup_time_in_seconds << 24)
+ incremented_variable++;
mysql> SELECT UUID_SHORT();-> 92395783831158784

UUID_SHORT() 不适用于基于语句的复制。

按照以上官方的说法,UUID_SHORT返回的值为64位无符号整数,也就是unsigned long long类型。而且,由于使用到了时间搓,这个的初始值会很大(通常都会到17位数字)。

但是,这并不保证其不会返回18,19,20位的数据,只能保证在2^64-1以内(最大达到20位数字);

目前没有查到说可以调整或初始设置UUID_SHORT() 的配置


2019-04-04 小杭 ミ(・・)ミ

补充BUG–Java数据接收错误

在数据库使用了无符号bigint类型之后,使用UUID_SHORT()进行生产id的时候,数据库是可以插入,没有问题的。

**但是,**由于使用的是JAVA的Long类型进行数据接收,这里有可能是会超出长度的。【数据为无符号long类型这里差了1位】

因为,JAVA本身的基本类型是不支持无符号类型的,所以这里的转换会有问题。

而且,由于是已经遇到了,上面开始的那个BUG,这里是肯定是会超出的。【UUID_SHORT的值是在mysql启动的时候自动配置的,所以相当的无奈╮(╯_╰)╭】

所以这里,特别说明记录一下,这个问题。

解决办法:目前还是使用 【自定义的ID生成】,或者 上面 的临时解决方式【时间戳拼接】
其实最好的还是使用32位的UUID比较的好


2019-04-16 小杭 ε=(´ο`*)))唉

MySQL-使用UUID_SHORT( ) 的问题相关推荐

  1. mysql gtid寻找位置_【MySQL】UUID与GTID以及如何根据GTID找寻filename和position

    Open Group于1997年10月发布,UUID遵从此协议. UUID被设计成一个在空间和时间上的唯一值.两次调用的UUID将产生两个不同的值,即使这些调用是在两个不连接的,彼此独立的计算机. 由 ...

  2. java short uuid_MySQL-使用UUID_SHORT( ) 的问题

    问题说明 表app_msg的主键id 设置的类型为:bigint 20 使用插入语句:INSERT INTOapp_msg(id,...) VALUES (UUID_SHORT(),...) 然而系统 ...

  3. mysql数据库uuid函数_[转载]MySQL UUID() 函数

    目录 文/温国兵 一 引子 在 MySQL 中,可以有如下几种途径实现唯一值: 自增序列 UUID() 函数 程序自定义 UUID 基于 16 进制,由 32 位小写的 16 进制数字组成,如下: a ...

  4. uuid表示时间的部分_技术译文 | UUID 很火但性能不佳?今天我们细聊一聊

    作者:Yves Trudeau Yves 是 Percona 的首席架构师,专门研究分布式技术,例如 MySQL Cluster,Pacemaker 和 XtraDB cluster.他以前是 MyS ...

  5. 新增对象时生成uuid传递到数据库_技术译文 | UUID 很火但性能不佳?今天我们细聊一聊...

    作者:Yves Trudeau Yves 是 Percona 的首席架构师,专门研究分布式技术,例如 MySQL Cluster,Pacemaker 和 XtraDB cluster.他以前是 MyS ...

  6. 技术分享 | UUID 很火但性能不佳?今天我们细聊一聊

    作者:Yves Trudeau 翻译:管长龙 Yves 是 Percona 的首席架构师,专门研究分布式技术,例如 MySQL Cluster,Pacemaker 和 XtraDB cluster. ...

  7. mysql uuid_short 为什么不存在_MySQL内置函数uuid和uuid_short

    有同学问到MySQL的uuid这个函数.简要介绍一下. 用法 简单看到,这个值,每次执行都是不同的. 生成规则 第1 2 3 段是与时间有关的. time_low.time_mid.time_high ...

  8. MySQL中的uuid()和uuid_short()函数

    在之前项目中,数据库生成UUID主键一般会用Java调用函数,最近发现在MySQL也有自带的uuid函数,分别是uuid()和uuid_short(),现对这两个函数进行演示和说明. 在 MySQL ...

  9. MySQL · 社区动态 · MariaDB 10.2 前瞻

    继 MariaDB 10.1 之后,对标 MySQL 5.7 的 MariaDB 10.2 版本也即将封板,那么我们就来看看新的版本有哪些新的功能吧. 之前的月报我们写过一篇关于 Window Fun ...

最新文章

  1. Windows Vista和XP系统功能大比拼
  2. Leetcode 62. Unique Paths
  3. CCS3的过渡、变换、动画以及响应式布局、弹性布局
  4. 机智云小程序启蒙:WebSocket网页控制
  5. 对图片进行压缩,水印,伸缩变换,透明处理,格式转换操作
  6. 友源社区APP论坛源码+网站源码
  7. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(9)...
  8. Python实现的NN神经网络算法完整示例
  9. xdg-open命令
  10. gxf------阿里云学生机部署Django项目2020
  11. 配置JDK、Tomcat环境、DNK环境
  12. 使用Curl对Kubernetes进行调试!
  13. 程序员为什么工资是用10k表示10000?
  14. Poi excel 导出 工具类参考
  15. maven本地仓库设置
  16. 记getsockopt有时偶然返回为零的异常
  17. BZOJ 4544: 椭圆上的整点
  18. 2022年,前端er们都在看哪些网站?(含面试、接活、学习、摸鱼等)
  19. 计蒜客:幼儿园买玩具(C++)
  20. 【创利树】电商的用户流失率是80%,你的用户流失率是多少呢?

热门文章

  1. 根据火车的出发时间和到达时间,编写程序计算整个旅途所用的时间。
  2. 超详细Seaborn绘图 ——(一)barplot
  3. java学习路线规划
  4. 设置EditText输入的文字全部变成大写或小写方案总结
  5. java ?: 三目运算符
  6. python服务启动调试的时候报错:SyntaxError: (“Non-ASCII character ‘\\xca‘ in file......解决办法
  7. 大数据需要学习哪些技术?
  8. mysql入门很简单系列视频-学习笔记
  9. 趣谈implicit instantiation of undefined template
  10. 如何在PowerPoint中更改文本的大小写