Paw*_*aws 5 mysql sql database
我正在尝试将UUID添加到我的一些MySQL数据库(MySQL 5.7.9)中的某些表中.首先,我首先添加一个列来接收UUID:
ALTER TABLE `mytable` ADD COLUMN `Uuid` BINARY(16) DEFAULT NULL;
Run Code Online (Sandbox Code Playgroud)
然后,对于表中已有的所有条目,我生成UUID(因为DB中的每个条目都会在其UUID字段中收到NULL值.
UPDATE `mytable` SET Uuid= unhex(replace(uuid(),'-','')) WHERE Uuid IS NULL;
Run Code Online (Sandbox Code Playgroud)
现在,问题在于我通过这样做得到一些非常奇怪的行为; 在我的一些数据库中,生成的每个UUID都是唯一的(如预期的那样).但是,在其他数据库上,所有生成的UUID都是相同的(不相似,相同).
我怀疑这是由MySQL查询优化器引起的,因为不同数据库实例之间的行为不一致(所有这些都在MySQL 5.7.9上).但是,我不知道如何解决这个问题.
所以,MySQL大师,我做错了什么?
我遇到了同样的问题,但解决方案是稍后对链接问题的回答。我有一个 utf8mb4 的默认字符集,理论上它在 sql 执行之前将 uuid() 的 utf8 结果隐式转换为常量字符串。将其他参数转换为 utf8 可以避免:
UPDATE `mytable` SET Uuid= unhex(replace(uuid(), _utf8'-', _utf8'')) WHERE Uuid IS NULL;
Run Code Online (Sandbox Code Playgroud)
后面的答案链接到相关(不是)错误报告。 这个 SO 问题看起来相关。
@TimBiegelsen链接中的解决方案有效。
我声明了一个根据 v4 标准生成 UUID 的函数。
CREATE FUNCTION uuid_v4()
RETURNS BINARY(16)
BEGIN
-- Generate 8 2-byte strings that we will combine into a UUIDv4
SET @h1 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
SET @h2 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
SET @h3 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
SET @h6 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
SET @h7 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
SET @h8 = LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0');
-- 4th section will start with a 4 indicating the version
SET @h4 = CONCAT('4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'));
-- 5th section first half-byte can only be 8, 9 A or B
SET @h5 = CONCAT(HEX(FLOOR(RAND() * 4 + 8)),
LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'));
-- Build the complete UUID
RETURN UNHEX(LOWER(CONCAT(@h1, @h2, @h3, @h4, @h5, @h6, @h7, @h8)));
END;;
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3085 次 |
| 最近记录: |