我不明白为什么

SELECT UUID();

返回如下内容:

3f06af63-a93c-11e4-9797-00505690773f

但是,如果我将其插入一个二进制(16)字段(UUID()函数),例如使用一个BEFORE insert触发器并运行一个select,它会返回如下结果:

0782ef48-a439-11

请注意,这两个UUID不是相同的数据.

我意识到二进制和UUID字符串看起来不一样,但所选数据不应该至少一样长吗?否则,它怎么可能同样可能是独一无二的呢?

将其存储为char(36)更好吗?我只需要它是唯一的,以防止重复插入.它从未被选中或用于连接.

编辑:

在触发之前会是这样的:

BEGIN

if NEW.UUID IS NULL THEN

NEW.UUID = UUID();

END IF

END

推荐答案

所以,作为对 comments 的回应.将36个字符的UUID存储为二进制(16)的正确方法是以如下方式执行插入:

INSERT INTO sometable (UUID) VALUES
       (UNHEX(REPLACE("3f06af63-a93c-11e4-9797-00505690773f", "-","")))

UNHEX,因为UUID已经是hexed值.我们修剪(REPLACE)语句中的破折号,将长度减少到32个字符(16个字节表示为HEX).显然,您可以在存储之前的任何时候执行此操作,因此不必由数据库处理.

您可以如下方式检索UUID:

SELECT HEX(UUID) FROM sometable;

以防有人遇到这个问题,不确定这是怎么回事.

记住:如果使用UUID Select 一行,use 100 on the condition:

SELECT * FROM sometable WHERE UUID = UNHEX('3f06af63a93c11e4979700505690773f');

literal notation(如Alexis Wilke所述):

SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;

And NOT 100on the column:

SELECT * FROM sometable WHERE HEX(UUID) = '3f06af63a93c11e4979700505690773f';

最后一个解决方案虽然有效,但要求MySQL在确定哪些行匹配之前先删除所有UUID.效率很低.

编辑:如果你使用的是MySQL 8,你应该看看SlyDave回答中提到的UUID函数.这个答案仍然是正确的,但它并没有优化UUID索引,而UUID索引可以通过这些函数本机完成.如果你在<;MySQL 8您可以实现Devon的polyfill,它在以前版本的MySQL上提供相同的功能.

Mysql相关问答推荐

MYSQL子查询

MySQL查询基于上次访问时间戳更新用户的问题

如何获得表中只有最大值行的一个列被另一个列分区?

版本升级到5.0.0后在QueryDSL中使用Enum时出错

MySQL如何在触发器内部 Select 多行然后插入它们

过滤值为0时如何在MySQL查询中设置条件?

MYSQL 8.0 - 从 INFORMATION_SCHEMA.COLUMNS 获取表列重新调整其他不相关的列

此更新查询是否有任何可能的重写选项?

为什么这个 NOT NULL 到 NULL 迁移会触发大量 I/O 操作?

无法在两个 mysql 表上执行内部联接

MySQL 添加一个 NOT NULL 列

MySQL 5.6 DATETIME 不接受毫秒/微秒

PHP PDO 与普通 mysql_connect

用序列号mysql更新列

MySQL SELECT 增量计数器

PHP MySQLI 防止 SQL 注入

MySQL 删除多列

MySQL中的行值增加和减少1

MySQL - 错误 1045 - 访问被拒绝

在 MySQL 中签名或未签名