2017-09-25 8 views
0

MS SQL Server 2000データベースで基数10の数値を基数64に変換して自分の目的に適した関数を作成しました。また、私はそれはしかし、それは私が64を下回る数を維持している場合例えばMS SQL ServerからMySQLにUDFを移植すると例外の間違ったdouble値が返される

Truncated double value 'B' 

例は、今では罰金に変換という例外がスローされます変換されているMySQLデータベースにあるように、この機能を必要としています。 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 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/' 
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 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'; 
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 

答えて

0

はこれがあなたの問題になることがあります。@jasemilly

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

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

MySQLは文字列の連結のためのCONCAT()を使用してSQL Serverの '(@value/64)'とMySQLの '(Pvalue/64)'には注意が必要ですが、計算結果が異なる場合があります。 – wchiquito

+0

はい、結果はmySQLとSQLで異なります – jasemilly

関連する問題