将 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 Server 存储过程导出到 excel 文件