CREATE PROCEDURE proc_name ([IN|OUT|INOUT] param_name type, ...)
[characteristic ...]
BEGIN
-- SQL 語句塊
END
CREATE FUNCTION func_name (param_name type, ...)
RETURNS return_type
[characteristic ...]
BEGIN
-- SQL 語句塊,必須有 RETURN
END
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
DELIMITER $$ ... 過程體 ... END $$ DELIMITER ;DECLARE var_name type [DEFAULT value]; 會話變量用 @var_name 直接引用,無需聲明-- 單行 和 /* 多行 */IFNULL() vs NVL()、DATE_ADD() 語法差異),遷移時需逐一驗證INSERT INTO debug_log VALUES (step, msg, NOW()) 追蹤流程算法特點:同輸入每次產出不同密文(引入時間種子),長度保留,可解密。弱點:不支持大小寫/中文、強度低、僅供教學。
CREATE FUNCTION fun_encrypt(inpass VARCHAR(10)) RETURNS VARCHAR(11)
BEGIN
DECLARE string_in VARCHAR(39) DEFAULT '_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE string_out VARCHAR(78) DEFAULT 'YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';
DECLARE offset TINYINT;
DECLARE outpass VARCHAR(30) DEFAULT '';
DECLARE len TINYINT;
DECLARE i TINYINT DEFAULT 0;
SET len = LENGTH(inpass);
IF len <= 0 OR len > 10 THEN RETURN ''; END IF;
SET offset = (SECOND(NOW()) % 39) + 1;
SET outpass = CONCAT(outpass, SUBSTRING(string_out, offset, 1));
SET string_out = CONCAT(string_out, string_out);
REPEAT
SET i = i + 1;
SET outpass = CONCAT(outpass,
SUBSTR(string_out, INSTR(string_in, SUBSTRING(inpass, i, 1)) + offset, 1)
);
UNTIL i >= len END REPEAT;
RETURN outpass;
END
CREATE PROCEDURE proc_encrypt(IN inpass VARCHAR(10), OUT outpass VARCHAR(11))
BEGIN
DECLARE string_in VARCHAR(39) DEFAULT '_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE string_out VARCHAR(78) DEFAULT 'YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';
DECLARE offset TINYINT;
DECLARE len TINYINT;
DECLARE i TINYINT DEFAULT 0;
SET len = LENGTH(inpass);
IF len <= 0 OR len > 10 THEN
SET outpass = '';
ELSE
SET offset = (SECOND(NOW()) % 39) + 1;
SET outpass = CONCAT('', SUBSTRING(string_out, offset, 1));
SET string_out = CONCAT(string_out, string_out);
REPEAT
SET i = i + 1;
SET outpass = CONCAT(outpass,
SUBSTR(string_out, INSTR(string_in, SUBSTRING(inpass, i, 1)) + offset, 1)
);
UNTIL i >= len END REPEAT;
END IF;
END
mysql> CALL proc_encrypt('zhouys', @a); SELECT @a;
+---------+
| @a |
+---------+
| U_PI6$4 |
+---------+
mysql> CALL proc_encrypt('zhouys', @a); SELECT @a;
+---------+
| @a |
+---------+
| 9P8UEGM |
+---------+
mysql> SELECT fun_decrypt('U_PI6$4'); -- 需配套實現解密函數
+----------------------+
| fun_decrypt('U_PI6$4') |
+----------------------+
| ZHOUYS |
+----------------------+
AES_ENCRYPT()/AES_DECRYPT() 或應用層成熟庫(OpenSSL/libsodium)ANALYZE PROCEDURE、監控 mysql.proc 表大小,防止緩存膨脹