如何在MariaDB 10.1版本中生成UUID/GUID?
解决MariaDB 10.1中生成BINARY(16) GUID的替代方案
我明白你现在的困境:MariaDB 10.1没有MySQL的random_bytes(16)函数,但你需要给BINARY(16)列生成GUID(甚至设为默认值)。下面是几个经过验证的可行方案:
1. 利用内置UUID()转换为BINARY(16)
MariaDB自带的UUID()函数能生成标准字符串格式的UUID(例如550e8400-e29b-41d4-a716-446655440000),我们可以通过去掉分隔符再转二进制的方式,得到适合BINARY(16)列的值:
-- 生成适配BINARY(16)的GUID SELECT UNHEX(REPLACE(UUID(), '-', '')) AS binary_guid;
要是想把这个设为列的默认值,注意MariaDB 10.1不允许直接将函数作为BINARY列的默认值,这时候可以用触发器来实现插入时自动赋值:
-- 创建触发器,插入时自动填充BINARY(16)列(仅当值为NULL时) DELIMITER // CREATE TRIGGER before_insert_your_table BEFORE INSERT ON your_table_name FOR EACH ROW BEGIN IF NEW.your_binary_column IS NULL THEN SET NEW.your_binary_column = UNHEX(REPLACE(UUID(), '-', '')); END IF; END // DELIMITER ;
2. 自定义类似random_bytes(16)的函数
如果你更偏好直接生成纯随机的16字节二进制数据,而不是标准UUID结构,可以自己写一个自定义函数:
DELIMITER // CREATE FUNCTION custom_random_bytes(length INT) RETURNS BINARY(255) DETERMINISTIC BEGIN DECLARE result BINARY(255) DEFAULT ''; DECLARE i INT DEFAULT 0; WHILE i < length DO SET result = CONCAT(result, CHAR(FLOOR(RAND() * 256))); SET i = i + 1; END WHILE; RETURN result; END // DELIMITER ;
调用它生成16字节二进制值的方式很简单:
SELECT custom_random_bytes(16) AS binary_guid;
同样,要设为默认值的话,把触发器里的赋值语句换成SET NEW.your_binary_column = custom_random_bytes(16);就行。
小提示
- 用
UUID()转换的方式生成的是符合标准UUID规范的二进制值(包含版本和变体信息),而自定义函数生成的是完全随机的16字节数据,你可以根据业务需求选择。 - 触发器里的
IS NULL判断很重要,这样手动指定列值时,不会被触发器覆盖。
内容的提问来源于stack exchange,提问作者Joe Phillips
相关产品推荐
相关产品推荐

