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

Posted

技术标签:

【中文标题】将 UDF 从 MS SQL Server 移植到 MySQL 会引发异常不正确的双精度值【英文标题】:Porting a UDF from MS SQL Server to MySQL throws exception incorrect double value 【发布时间】:2017-09-25 10:41:53 【问题描述】:

我在 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

【问题讨论】:

【参考方案1】:

这可能是你的问题:

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

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

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

【讨论】:

@jasemilly:除了答案,注意SQL Server中的(@value / 64)和MySQL中的(Pvalue / 64),计算结果可能不一样。 是的,mySQL 和 SQL 的结果不同

以上是关于将 UDF 从 MS SQL Server 移植到 MySQL 会引发异常不正确的双精度值的主要内容,如果未能解决你的问题,请参考以下文章

将 MS SQL 存储过程移植到 MySQL

将数据从 MS Access 传输到 SQL Server

MS Sql Server 对象创建/更改脚本

将数据从 MS Sql Server 存储过程导出到 excel 文件

从 SQL Server 2008 迁移到 MS access 2007

如何通过编码将数据从 MS Access 导入 Sql Server [关闭]