"Incorrect string value" 在 MySQL 用户函数中
"Incorrect string value" in MySQL user function
我需要此功能才能在 MySQL 中使用;我已经尝试了几个小时但没有结果。
DELIMITER //
CREATE FUNCTION `generateGUID`(
`playerid` BIGINT
) RETURNS text CHARSET utf8
READS SQL DATA
BEGIN
DECLARE temp text;
DECLARE i int UNSIGNED;
SET temp = '';
SET i = 0;
WHILE i < 8 DO
SET temp = CONCAT(temp, CHAR(playerid & 0xFF));
SET playerid = playerid >> 8;
SET i = i + 1;
END WHILE;
SET temp = MD5(CONCAT("BE", temp));
RETURN temp;
END//
DELIMITER ;
这是一个获取数字(Steam ID)和 returns 转换字符串的函数。
该函数来自 github 仓库,但它很旧,似乎作者没有更新它。
我得到:
Error de SQL (1366): Incorrect string value: '\x97' for column 'temp' at row 1
这个函数有什么作用?它显然计算了 BattlEye ID:
md5("BE" (2 bytes) + 64-bit SteamID (8 bytes))
在哪里...
WHILE i < 8 DO
SET temp = CONCAT(temp, CHAR(playerid & 0xFF));
SET playerid = playerid >> 8;
SET i = i + 1;
END WHILE;
...取的第一段是最低有效字节,它在字符串的开头结束。所以数字是“小端”。
这就变成了 GUID。
我们可以重建他。我们有技术.
生成二进制数据的函数是UNHEX
,我们必须向它提供一个用零填充的 16 字符序列。 LPAD
是我们的朋友。那么这个数字就是小端,我们就必须使用REVERSE
。其余的如下。
请注意,您根本不需要函数,只需要核心(返回的对象)。
DROP FUNCTION generateGUID;
DELIMITER //
CREATE FUNCTION `generateGUID`(
`playerid` BIGINT
) RETURNS text CHARSET utf8
READS SQL DATA
BEGIN
RETURN MD5(
CONCAT(
'BE',
REVERSE(
UNHEX(
LPAD(
HEX(playerid),
16,
'0'
)
)
)
)
);
END//
DELIMITER ;
测试:
select generateGUID(76532298015716211) -- found on an online generator
returns f276e058bbaaff85d23070c9bd43e2aa
符合预期。
我需要此功能才能在 MySQL 中使用;我已经尝试了几个小时但没有结果。
DELIMITER //
CREATE FUNCTION `generateGUID`(
`playerid` BIGINT
) RETURNS text CHARSET utf8
READS SQL DATA
BEGIN
DECLARE temp text;
DECLARE i int UNSIGNED;
SET temp = '';
SET i = 0;
WHILE i < 8 DO
SET temp = CONCAT(temp, CHAR(playerid & 0xFF));
SET playerid = playerid >> 8;
SET i = i + 1;
END WHILE;
SET temp = MD5(CONCAT("BE", temp));
RETURN temp;
END//
DELIMITER ;
这是一个获取数字(Steam ID)和 returns 转换字符串的函数。
该函数来自 github 仓库,但它很旧,似乎作者没有更新它。
我得到:
Error de SQL (1366): Incorrect string value: '\x97' for column 'temp' at row 1
这个函数有什么作用?它显然计算了 BattlEye ID:
md5("BE" (2 bytes) + 64-bit SteamID (8 bytes))
在哪里...
WHILE i < 8 DO
SET temp = CONCAT(temp, CHAR(playerid & 0xFF));
SET playerid = playerid >> 8;
SET i = i + 1;
END WHILE;
...取的第一段是最低有效字节,它在字符串的开头结束。所以数字是“小端”。
这就变成了 GUID。
我们可以重建他。我们有技术.
生成二进制数据的函数是UNHEX
,我们必须向它提供一个用零填充的 16 字符序列。 LPAD
是我们的朋友。那么这个数字就是小端,我们就必须使用REVERSE
。其余的如下。
请注意,您根本不需要函数,只需要核心(返回的对象)。
DROP FUNCTION generateGUID;
DELIMITER //
CREATE FUNCTION `generateGUID`(
`playerid` BIGINT
) RETURNS text CHARSET utf8
READS SQL DATA
BEGIN
RETURN MD5(
CONCAT(
'BE',
REVERSE(
UNHEX(
LPAD(
HEX(playerid),
16,
'0'
)
)
)
)
);
END//
DELIMITER ;
测试:
select generateGUID(76532298015716211) -- found on an online generator
returns f276e058bbaaff85d23070c9bd43e2aa
符合预期。