mysql - 将 UDF 从 MS SQL Server 移植到 MySQL 会引发异常,不正确的双值

标签 mysql sql sql-server user-defined-functions

我在 MS SQL Server 2000 数据库上创建了一个函数,该函数将 10 进制数转换为 64 进制数,并且可以很好地满足我的目的。我还需要这个函数位于 MySQL 数据库中,我已经转换了它,但是它抛出了一个异常,表示

 Truncated double value 'B' 

举个例子,现在如果我将数字保持在 64 以下,它就可以很好地转换。 SQL函数

CREATE FUNCTION ToBase64(@value int)
RETURNS varchar(50)
AS
BEGIN
DECLARE @seq char(64)
DECLARE @result varchar(50)
DECLARE @digit char(1)

SET @seq = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
SET @result = SUBSTRING(@seq, (@value%64)+1, 1)

WHILE @value > 0
BEGIN
    SET @digit = SUBSTRING(@seq, ((@value/64)%64)+1, 1)

    SET @value = @value/64
    IF @value <> 0 SET @result = @digit + @result
END 

RETURN @result
END
GO

mySQL函数

DELIMITER $$
CREATE FUNCTION ToBase64( Pvalue int) RETURNS varchar(50)
DETERMINISTIC
BEGIN

DECLARE seq char(64);
DECLARE result varchar(50);
DECLARE digit char(1);

SET seq = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
SET result = SUBSTRING(seq, (Pvalue%64)+1, 1);

WHILE Pvalue > 0 do

    SET digit = SUBSTRING(seq, ((Pvalue/64)%64)+1, 1);
    SET Pvalue = Pvalue/64;

   IF Pvalue <> 0  THEN
        SET result = digit + result;
    END IF;

End While;

RETURN (result);
END

最佳答案

这可能是您的问题:

IF Pvalue <> 0  THEN
    SET result = digit + result;
END IF;

MySQL 使用 CONCAT() 进行字符串连接:

IF Pvalue <> 0  THEN
    SET result = CONCAT(digit, result);
END IF;

关于mysql - 将 UDF 从 MS SQL Server 移植到 MySQL 会引发异常,不正确的双值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46403252/

相关文章:

mysql - 尽管我使用 REPLACE INTO,但出现重复记录错误

sql - Node.js - 将 SQL 查询转换为 Knex.js

sql-server - 通过一些数据转换创建 Sql 服务器复制(期间或结束时)

sql - 连接和分组多个表

php - 在没有额外标记的情况下,在 SQL 中保留回车以供 HTML 显示?

mysql - 在另一台服务器上移动 PHP 应用程序时无法访问 MySQL View

MySQL 统计 10 万条记录条件需要 6 秒

sql - T-SQL解析XML赋予空白值

mysql - 如何使用 GROUP BY 显示多个对象,而不是每个分组仅显示一个对象?

mysql - 在 postgres 的不同列中获取联合的输出