mysql is uuid()在语句中只计算一次?

ktecyv1j  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(447)

考虑一下:

  1. select uuid() from my_table;

返回不同的UUID:

  1. "fc28ee4e-a147-11e8-93aa-0242ac120002"
  2. "fc28ee7d-a147-11e8-93aa-0242ac120002"
  3. "fc28ee84-a147-11e8-93aa-0242ac120002"
  4. "fc28ee8c-a147-11e8-93aa-0242ac120002"
  5. "fc28ee9b-a147-11e8-93aa-0242ac120002"

但是

  1. select replace (uuid(), '-', '') from my_table;

返回相同的uuid:

  1. "38d37436a14811e893aa0242ac120002"
  2. "38d37436a14811e893aa0242ac120002"
  3. "38d37436a14811e893aa0242ac120002"
  4. "38d37436a14811e893aa0242ac120002"
  5. "38d37436a14811e893aa0242ac120002"

为什么在replace函数中uuid是相同的?
我在尝试用一条语句插入行时遇到了这个问题,使用uuid作为主键,结果出现了一个重复键错误。

  1. INSERT INTO my_Table (id, updated_at)
  2. SELECT unhex(replace (uuid(), '-', '')), sysdate() FROM another_table

最奇怪的是,写这条语句的同事每次插入都会得到不同的uuid。怎么会?
我试过用heidisql和phpmyadmin。
版本信息:

  1. "innodb_version" "5.7.21"
  2. "protocol_version" "10"
  3. "slave_type_conversions" ""
  4. "tls_version" "TLSv1,TLSv1.1"
  5. "version" "5.7.21"
  6. "version_comment" "MySQL Community Server (GPL)"
  7. "version_compile_machine" "x86_64"
  8. "version_compile_os" "Linux"

难看的变通方法
使用多个子字符串的concat代替replace:

  1. SELECT unhex(concat(substring(uuid(), 1, 8), substring(uuid(), 10, 4), substring(uuid(), 15, 4), substring(uuid(), 20, 4), substring(uuid(), 25, 12)))

这是可行的,但是生成的id不再是唯一的。所以罪魁祸首似乎真的是replace函数。我仍然想了解最初的问题。

46scxncf

46scxncf1#

我今天遇到了同样的问题(mysql 5.7),并找到了一篇关于它的老文章(2005)。这似乎是我的校勘
https://dev.mysql.com/doc/refman/8.0/en/set-names.html
使用

  1. set names utf8;

帮了我的剧本。
用于测试唯一性

  1. SELECT COUNT(DISTINCT u)
  2. FROM (SELECT uuid() as u from my_table) as A

相关问题