将 UDF 从 MS SQL 服务器移植到 MySQL 会抛出异常不正确的双精度值
Porting a UDF from MS SQL Server to MySQL throws exception incorrect double value
我在 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;
我在 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;