"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 符合预期。