53

あるテーブルから blob col を選択し、それを base64 でエンコードして、別のテーブルに挿入したいと考えています。DB からアプリを介してデータをラウンドトリップせずにこれを行う方法はありますか?

4

8 に答える 8

62

私は同じものを探していましたが、MySQL 5.6 には、この機能をサポートする新しい文字列関数がいくつかあることを確認しました: TO_BASE64FROM_BASE64

于 2011-09-08T16:27:07.473 に答える
18

http://wi-fizzle.com/downloads/base64.sqlの関数には、エンコードされた文字列が 32 バイト (スペース) の場合、エラーが含まれます。例: BASE64_ENCODE(CONCAT(CHAR(15), CHAR(32)))。ここに修正された機能があります

DELIMITER $$

USE `YOUR DATABASE`$$

DROP TABLE IF EXISTS core_base64_data$$
CREATE TABLE core_base64_data (c CHAR(1) BINARY, val TINYINT)$$
INSERT INTO core_base64_data VALUES 
('A',0), ('B',1), ('C',2), ('D',3), ('E',4), ('F',5), ('G',6), ('H',7), ('I',8), ('J',9),
('K',10), ('L',11), ('M',12), ('N',13), ('O',14), ('P',15), ('Q',16), ('R',17), ('S',18), ('T',19),
('U',20), ('V',21), ('W',22), ('X',23), ('Y',24), ('Z',25), ('a',26), ('b',27), ('c',28), ('d',29),
('e',30), ('f',31), ('g',32), ('h',33), ('i',34), ('j',35), ('k',36), ('l',37), ('m',38), ('n',39),
('o',40), ('p',41), ('q',42), ('r',43), ('s',44), ('t',45), ('u',46), ('v',47), ('w',48), ('x',49),
('y',50), ('z',51), ('0',52), ('1',53), ('2',54), ('3',55), ('4',56), ('5',57), ('6',58), ('7',59),
('8',60), ('9',61), ('+',62), ('/',63), ('=',0) $$

DROP FUNCTION IF EXISTS `BASE64_ENCODE`$$

CREATE DEFINER=`YOUR DATABASE`@`%` FUNCTION `BASE64_ENCODE`(input BLOB) RETURNS BLOB
    DETERMINISTIC
    SQL SECURITY INVOKER
BEGIN
    DECLARE ret BLOB DEFAULT '';
    DECLARE done TINYINT DEFAULT 0;
    IF input IS NULL THEN
        RETURN NULL;
    END IF;
each_block:
    WHILE NOT done DO BEGIN
        DECLARE accum_value BIGINT UNSIGNED DEFAULT 0;
        DECLARE in_count TINYINT DEFAULT 0;
        DECLARE out_count TINYINT;
each_input_char:
        WHILE in_count < 3 DO BEGIN
            DECLARE first_char BLOB(1);

            IF LENGTH(input) = 0 THEN
                SET done = 1;
                SET accum_value = accum_value << (8 * (3 - in_count));
                LEAVE each_input_char;
            END IF;

            SET first_char = SUBSTRING(input,1,1);
            SET input = SUBSTRING(input,2);

            SET accum_value = (accum_value << 8) + ASCII(first_char);
            SET in_count = in_count + 1;
        END; END WHILE;

        -- We've now accumulated 24 bits; deaccumulate into base64 characters
        -- We have to work from the left, so use the third byte position and shift left
        CASE
            WHEN in_count = 3 THEN SET out_count = 4;
            WHEN in_count = 2 THEN SET out_count = 3;
            WHEN in_count = 1 THEN SET out_count = 2;
            ELSE RETURN ret;
        END CASE;

        WHILE out_count > 0 DO BEGIN
            BEGIN
                DECLARE out_char CHAR(1);
                DECLARE base64_getval CURSOR FOR SELECT c FROM core_base64_data WHERE val = (accum_value >> 18);
                OPEN base64_getval;
                FETCH base64_getval INTO out_char;
                CLOSE base64_getval;
                SET ret = CONCAT(ret,out_char);
                SET out_count = out_count - 1;
                SET accum_value = accum_value << 6 & 0xffffff;
            END;
        END; END WHILE;
        CASE
            WHEN in_count = 2 THEN SET ret = CONCAT(ret,'=');
            WHEN in_count = 1 THEN SET ret = CONCAT(ret,'==');
            ELSE BEGIN END;
        END CASE;

    END; END WHILE;
    RETURN ret;
END$$

DELIMITER ;
于 2012-08-27T08:33:06.160 に答える
13
SELECT `id`,`name`, TO_BASE64(content) FROM `db`.`upload`

これにより、blob 値がcontent列から base64 文字列に変換されます。次に、この文字列を別のテーブルに挿入することさえできます

于 2016-06-15T14:17:09.903 に答える
5

興味のある方のために、これまでのところ唯一の代替手段は次のとおりです。

1) これらの機能の使用:

http://wi-fizzle.com/downloads/base64.sql

2) sys_eval UDFが既にある場合(Linux)、これを実行できます。

sys_eval(CONCAT("echo '",myField,"' | base64"));

最初の方法は遅いことが知られています。2 番目の問題は、エンコーディングが実際には MySQL の「外部」で発生しているため、エンコーディングの問題が発生する可能性があることです (sys_* 関数で追加するセキュリティ リスクに加えて)。

残念ながら、UDF でコンパイルされたバージョン (より高速なはずです) も、MySQL のネイティブ サポートもありません ( Posgresql がサポートしています!)。

この機能は他の言語にも既に存在するため、MySQL 開発チームは実装に関心がないようです。

于 2011-08-17T06:12:45.373 に答える
5

リクエストされたものの、いいえのように見えますが、そのための UDF があります。

編集: またはそこに…これ. うーん。

于 2008-12-11T05:23:41.267 に答える
1

5.6未満でこれが必要な場合は、うまく機能しているように見えるこのUDFにつまずきました:

https://github.com/y-ken/mysql-udf-base64

于 2014-12-01T22:50:20.993 に答える