سؤال
أريد أن حدد النقطة عمود من جدول واحد, base64 في ترميز وأدخله في آخر الجداول.هل هناك أي طريقة للقيام بذلك دون تنطلق الجولة البيانات DB و من خلال التطبيق ؟
المحلول
وكنت أبحث عن الشيء نفسه، ورأيت للتو أن الخلية 5.6 وقد اثنين من وظائف سلسلة جديدة تدعم هذه الوظيفة: <لأ href = "http://dev.mysql.com/doc/refman/5.6 /en/string-functions.html#function_to-base64 "يختلط =" noreferrer "> TO_BASE64 و <لأ href =" http://dev.mysql.com/doc/refman/5.6/en/string- functions.html # function_from-base64 في "يختلط =" noreferrer "> FROM_BASE64 .
نصائح أخرى
وظائف من http://wi-fizzle.com/downloads/base64.sql تحتوي على بعض الأخطاء عند ترميز سلسلة 32-بايت (الفضاء) ، السابق BASE64_ENCODE(CONCAT(CHAR(15) ، شار(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 ;
SELECT `id`,`name`, TO_BASE64(content) FROM `db`.`upload`
هذا سيتم تحويل قيمة النقطة من المحتوى عمود إلى base64 السلسلة.ثم يمكنك أن تفعل مع هذه السلسلة كل ما تريد حتى أدخله في جدول آخر
ويبدو أنه ليس، على الرغم من أنه طلب ، وهناك UDF ل ذلك.
وتحرير: أو هناك ... <لأ href = "http://209.85.173.132/search؟q=cache:Wzk4yszgatQJ:www.phpobjectgenerator.com/plog/file_download/25+mysql+mime+encode&hl=en&ct=clnk&cd = 6 & GL = لنا "يختلط =" noreferrer "> هذا . هتاف اشمئزاز.
لالمهتمين، وهذه هي البدائل الوحيدة حتى الآن:
1) استخدام هذه الوظائف:
http://wi-fizzle.com/downloads/base64.sql
2) إذا كان لديك بالفعل sys_eval UDF و (لينكس) يمكنك القيام بذلك:
sys_eval(CONCAT("echo '",myField,"' | base64"));
ومن المعروف أن الطريقة الأولى أن يكون بطيئا. مشكلة مع واحد الثاني، هو أن الترميز هو في الواقع يحدث "الخارجية" ماي، والتي يمكن أن يكون لها مشاكل الترميز (إلى جانب المخاطر الأمنية التي تقوم بإضافتها مع وظائف * sys_).
للأسف لا توجد UDF جمعت إصدار (التي ينبغي أن تكون أسرع) ولا دعم أصلي في الخلية (<لأ href = "http://www.postgresql.org/docs/9.0/static/functions-string.html" > Posgresql يعتمد عليه !).
ويبدو أن الخلية فريق التطوير ليست مهتمة في تنفيذه كما هذه الوظيفة موجود بالفعل في لغات أخرى، والذي يبدو سخيفة جدا بالنسبة لي.
ولكن تنفيذ أخرى مخصصة التي لا تتطلب الجدول الدعم:
drop function if exists base64_encode;
create function base64_encode(_data blob)
returns text
begin
declare _alphabet char(64) default 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
declare _lim int unsigned default length(_data);
declare _i int unsigned default 0;
declare _chk3 char(6) default '';
declare _chk3int int default 0;
declare _enc text default '';
while _i < _lim do
set _chk3 = rpad(hex(binary substr(_data, _i + 1, 3)), 6, '0');
set _chk3int = conv(_chk3, 16, 10);
set _enc = concat(
_enc
, substr(_alphabet, ((_chk3int >> 18) & 63) + 1, 1)
, if (_lim-_i > 0, substr(_alphabet, ((_chk3int >> 12) & 63) + 1, 1), '=')
, if (_lim-_i > 1, substr(_alphabet, ((_chk3int >> 6) & 63) + 1, 1), '=')
, if (_lim-_i > 2, substr(_alphabet, ((_chk3int >> 0) & 63) + 1, 1), '=')
);
set _i = _i + 3;
end while;
return _enc;
end;
drop function if exists base64_decode;
create function base64_decode(_enc text)
returns blob
begin
declare _alphabet char(64) default 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
declare _lim int unsigned default 0;
declare _i int unsigned default 0;
declare _chr1byte tinyint default 0;
declare _chk4int int default 0;
declare _chk4int_bits tinyint default 0;
declare _dec blob default '';
declare _rem tinyint default 0;
set _enc = trim(_enc);
set _rem = if(right(_enc, 3) = '===', 3, if(right(_enc, 2) = '==', 2, if(right(_enc, 1) = '=', 1, 0)));
set _lim = length(_enc) - _rem;
while _i < _lim
do
set _chr1byte = locate(substr(_enc, _i + 1, 1), binary _alphabet) - 1;
if (_chr1byte > -1)
then
set _chk4int = (_chk4int << 6) | _chr1byte;
set _chk4int_bits = _chk4int_bits + 6;
if (_chk4int_bits = 24 or _i = _lim-1)
then
if (_i = _lim-1 and _chk4int_bits != 24)
then
set _chk4int = _chk4int << 0;
end if;
set _dec = concat(
_dec
, char((_chk4int >> (_chk4int_bits - 8)) & 0xff)
, if(_chk4int_bits > 8, char((_chk4int >> (_chk4int_bits - 16)) & 0xff), '\0')
, if(_chk4int_bits > 16, char((_chk4int >> (_chk4int_bits - 24)) & 0xff), '\0')
);
set _chk4int = 0;
set _chk4int_bits = 0;
end if;
end if;
set _i = _i + 1;
end while;
return substr(_dec, 1, length(_dec) - _rem);
end;
ويجب تحويل محارف بعد فك: convert(base64_decode(base64_encode('ёлка')) using utf8)
إذا كنت بحاجة إلى هذا < 5.6, أنا تعثرت عبر هذا UDF التي يبدو أنها تعمل بشكل جيد:
وخلق تشفير الجدول (VARCHAR اسم المستخدم (20)، ثنائي متغير كلمة المرور (200))
وتضاف إلى قيم تشفير ( 'راجو "، aes_encrypt (' كومار '،' مفتاح ')) حدد *، الزهر (aes_decrypt (كلمة السر، 'مفتاح') كما شار (40)) من تشفير حيث اسم المستخدم = 'راجو'؛