· 8 years ago · Mar 07, 2018, 12:34 PM
1DELIMITER $$
2
3USE `YOUR DATABASE`$$
4
5DROP TABLE IF EXISTS core_base64_data$$
6CREATE TABLE core_base64_data (c CHAR(1) BINARY, val TINYINT)$$
7INSERT INTO core_base64_data VALUES
8('A',0), ('B',1), ('C',2), ('D',3), ('E',4), ('F',5), ('G',6), ('H',7), ('I',8), ('J',9),
9('K',10), ('L',11), ('M',12), ('N',13), ('O',14), ('P',15), ('Q',16), ('R',17), ('S',18), ('T',19),
10('U',20), ('V',21), ('W',22), ('X',23), ('Y',24), ('Z',25), ('a',26), ('b',27), ('c',28), ('d',29),
11('e',30), ('f',31), ('g',32), ('h',33), ('i',34), ('j',35), ('k',36), ('l',37), ('m',38), ('n',39),
12('o',40), ('p',41), ('q',42), ('r',43), ('s',44), ('t',45), ('u',46), ('v',47), ('w',48), ('x',49),
13('y',50), ('z',51), ('0',52), ('1',53), ('2',54), ('3',55), ('4',56), ('5',57), ('6',58), ('7',59),
14('8',60), ('9',61), ('+',62), ('/',63), ('=',0) $$
15
16DROP FUNCTION IF EXISTS `BASE64_ENCODE`$$
17
18CREATE DEFINER=`YOUR DATABASE`@`%` FUNCTION `BASE64_ENCODE`(input BLOB) RETURNS BLOB
19 DETERMINISTIC
20 SQL SECURITY INVOKER
21BEGIN
22 DECLARE ret BLOB DEFAULT '';
23 DECLARE done TINYINT DEFAULT 0;
24 IF input IS NULL THEN
25 RETURN NULL;
26 END IF;
27each_block:
28 WHILE NOT done DO BEGIN
29 DECLARE accum_value BIGINT UNSIGNED DEFAULT 0;
30 DECLARE in_count TINYINT DEFAULT 0;
31 DECLARE out_count TINYINT;
32each_input_char:
33 WHILE in_count < 3 DO BEGIN
34 DECLARE first_char BLOB(1);
35
36 IF LENGTH(input) = 0 THEN
37 SET done = 1;
38 SET accum_value = accum_value << (8 * (3 - in_count));
39 LEAVE each_input_char;
40 END IF;
41
42 SET first_char = SUBSTRING(input,1,1);
43 SET input = SUBSTRING(input,2);
44
45 SET accum_value = (accum_value << 8) + ASCII(first_char);
46 SET in_count = in_count + 1;
47 END; END WHILE;
48
49 -- We've now accumulated 24 bits; deaccumulate into base64 characters
50 -- We have to work from the left, so use the third byte position and shift left
51 CASE
52 WHEN in_count = 3 THEN SET out_count = 4;
53 WHEN in_count = 2 THEN SET out_count = 3;
54 WHEN in_count = 1 THEN SET out_count = 2;
55 ELSE RETURN ret;
56 END CASE;
57
58 WHILE out_count > 0 DO BEGIN
59 BEGIN
60 DECLARE out_char CHAR(1);
61 DECLARE base64_getval CURSOR FOR SELECT c FROM core_base64_data WHERE val = (accum_value >> 18);
62 OPEN base64_getval;
63 FETCH base64_getval INTO out_char;
64 CLOSE base64_getval;
65 SET ret = CONCAT(ret,out_char);
66 SET out_count = out_count - 1;
67 SET accum_value = accum_value << 6 & 0xffffff;
68 END;
69 END; END WHILE;
70 CASE
71 WHEN in_count = 2 THEN SET ret = CONCAT(ret,'=');
72 WHEN in_count = 1 THEN SET ret = CONCAT(ret,'==');
73 ELSE BEGIN END;
74 END CASE;
75
76 END; END WHILE;
77 RETURN ret;
78END$$
79
80DELIMITER ;
81
82sys_eval(CONCAT("echo '",myField,"' | base64"));
83
84SELECT `id`,`name`, TO_BASE64(content) FROM `db`.`upload`