我正在尝试使用函数将 UUID 转换为二进制文件以提高数据库存储效率,使用我从这个 thread 获得的代码:
DELIMITER $$
CREATE FUNCTION BIN_TO_UUID(b BINARY(16), f BOOLEAN)
RETURNS CHAR(36)
DETERMINISTIC
BEGIN
DECLARE hexStr CHAR(32);
SET hexStr = HEX(b);
RETURN LOWER(CONCAT(
IF(f,SUBSTR(hexStr, 9, 8),SUBSTR(hexStr, 1, 8)), '-',
IF(f,SUBSTR(hexStr, 5, 4),SUBSTR(hexStr, 9, 4)), '-',
IF(f,SUBSTR(hexStr, 1, 4),SUBSTR(hexStr, 13, 4)), '-',
SUBSTR(hexStr, 17, 4), '-',
SUBSTR(hexStr, 21)
));
END$$
CREATE FUNCTION UUID_TO_BIN(uuid CHAR(36), f BOOLEAN)
RETURNS BINARY(16)
DETERMINISTIC
BEGIN
RETURN UNHEX(CONCAT(
IF(f,SUBSTRING(uuid, 15, 4),SUBSTRING(uuid, 1, 8)),
SUBSTRING(uuid, 10, 4),
IF(f,SUBSTRING(uuid, 1, 8),SUBSTRING(uuid, 15, 4)),
SUBSTRING(uuid, 20, 4),
SUBSTRING(uuid, 25))
);
END$$
DELIMITER ;
在我的本地服务器上(我正在使用带有 10.4.22-MariaDB 的 Windows XAMPP),它按预期工作。当我调用 UUID_TO_BIN(UUID(),0) 时,它会返回类似
0x11edbe57536d750480c2c025a57a3115
的内容。当我在我的生产服务器上尝试它时(我正在使用带有 10.5.16-MariaDB 的 linux),它返回像 这样的奇怪字符。当我尝试使用 BIN_TO_UUID(UUID_TO_BIN(UUID(),1),1) 返回 UUID 时,它确实将它返回到本地和生产服务器中的原始 UUID。
但我想要的是将 UUID_TO_BIN 结果存储为二进制和十六进制基本表示形式(不是一些奇怪的字符),就像在我的本地服务器中一样。
我预感这可能是因为数据库/表的字符集或排序规则不同。我的本地服务器数据库使用
utf8mb4_general_ci
而我的生产服务器使用 latin1_swedish_ci
.
我不敢更改数据库/表的字符集或排序规则,但不能完全确定这确实是原因。
请帮助我是什么让函数返回这个奇怪的字符?我应该怎么做才能让它在我的生产服务器中以二进制和十六进制表示形式返回? 非常感谢。