正如@Johan所提到的那样,您需要使用大写H(十六进制字符串,高位在前)以便与MySQL HEX / UNHEX函数兼容。
function uuid_to_bin($uuid){
return pack("H*", str_replace('-', '', $uuid));
}
一个更紧凑的反解UUID函数,仅使用
unpack()
和
join()
方法。
注意:你需要
命名解包数组参数/键以避免被覆盖!
function bin_to_uuid($bin){
return join("-", unpack("H8time_low/H4time_mid/H4time_hi/H4clock_seq_hi/H12clock_seq_low", $bin));
}
对于较旧的MySQL版本,其中缺少uuid_to_bin()
和bin_to_uuid()
函数:
DELIMITER $$
CREATE FUNCTION `fn_uuid_to_bin`(`s` CHAR(36)) RETURNS binary(16)
DETERMINISTIC
RETURN UNHEX(REPLACE(s, '-', ''))$$
DELIMITER ;
DELIMITER $$
CREATE FUNCTION `fn_bin_to_uuid`(`b` BINARY(16)) RETURNS char(36) CHARSET utf8mb4
DETERMINISTIC
BEGIN
DECLARE hex CHAR(32);
SET hex = HEX(b);
RETURN LOWER(CONCAT(LEFT(hex, 8), '-', MID(hex, 9,4), '-', MID(hex, 13,4), '-', MID(hex, 17,4), '-', RIGHT(hex, 12)));
END$$
DELIMITER ;