Как упомянул @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 ;