1. 程式人生 > 實用技巧 >使用AES/CBC/PKCS7Padding方式加解密

使用AES/CBC/PKCS7Padding方式加解密

一、儲存過程和函式

儲存過程和函式是在資料庫中定義一些SQL語句的集合,然後直接呼叫這些儲存過程和函式來執行已經定義好的SQL語句。

儲存過程和函式可以避免開發人員重複的編寫相同的SQL語句。而且,儲存過程和函式是在MySQL伺服器中儲存和執行的,可以減少客戶端和伺服器端的資料傳輸。

1.儲存過程

(1)基本語法:

CREATE PROCEDURE proc_name ( [proc_parameter] )
[characteristics ...] routine_body

CREATE PROCEDURE:用來建立儲存函式的關鍵字;proc_name:為儲存過程的名稱;預設在當前資料庫中建立。

避免與MySQL的內建函式的名字一樣。

proc_parameter:指定儲存過程的引數列表;列表的形式如下:

[IN | OUT | INOUT ] param_name type

  1)IN:輸入引數;

  2)OUT:輸出引數;

  3)INOUT:即可以輸入也可以輸出;

  4)param_name:表示引數名稱;

  5)type:表示引數的型別,可以是MySQL資料庫中的任意型別。

Characteristic:儲存過程的某些特徵設定,分別介紹:
  1)COMMENT'string': 用於對儲存過程的描述,其中string為描述內容,comment為關鍵字。

  2)LANGUAGE SQL: 指明編寫這個儲存過程的語言為SQL語言。這個選項可以不指定。

  

  • No sql:表示不包含sql語句
  • Reads sql data :表示儲存過程只包含讀資料的語句
  • Modifies sql data :表示儲存過程只包含寫資料的語句

  5)sql security:這個特徵用來指定儲存過程使用建立該儲存過程的使用者(definer)的許可來執行,還是使用呼叫者(invoker)的許可來執行。預設是definer.

Routine_body:儲存過程的主體部分,包含了在過程呼叫的時候必須執行的sql語句。以BEGIN開始,以END結束。

如果儲存過程體中只有一條sql語句,可以省略begin-end標誌。

1.2 資料準備

mysql>
CREATE TABLE t_user -> ( -> USER_ID INT NOT NULL AUTO_INCREMENT, -> USER_NAME CHAR(30) NOT NULL, -> USER_PASSWORD CHAR(10) NOT NULL, -> USER_EMAIL CHAR(30) NOT NULL, -> PRIMARY KEY (USER_ID), -> INDEX IDX_NAME (USER_NAME) -> ) -> ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入資料:

INSERT INTO t_user (USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL)
VALUES
 (1,'林炳文','1234567@','[email protected]'),
 (2,'123','123','fff'), 
(3,'1214gbdb','123456','[email protected]'),
(4,'fsjdjhihi','1234567','[email protected]'),
(5,'fajkjiiuhi','123456','[email protected]'),
(6,'hiouoewh','12345678','[email protected]'),
(7,'fdasfdsaf','1234567','[email protected]'),
(8,'林林之間','123456','[email protected]'),
(9,'林炳文Evan...','123456','ling2008@com'),
(10,'ff23e林','123456@','[email protected]');

1. 3 IN、OUT、INOUT引數

帶IN的儲存過程

mysql> CREATE PROCEDURE SP_SEARCH(IN p_name CHAR(20))
    -> BEGIN
    -> IF p_name is null or p_name='' THEN
    -> SELECT * FROM t_user;
    -> ELSE
    -> SELECT * FROM t_user WHERE USER_NAME LIKE p_name;
    -> END IF;
    -> END
    -> //

因為;會衝突,因此將//設定為結束執行符號。

mysql> delimiter //

PS:可以使用“DELIMITER;” 恢復預設結束符;DELIMITER也可定義其他符號作為結束符,但避免使用反斜槓“\”,因為“\”是SQL中的轉義字元。

呼叫:

//呼叫並輸出結果 
CALL SP_SEARCH('林炳文')

帶OUT的儲存過程

mysql> CREATE PROCEDURE SP_SEARCH2(IN p_name CHAR(20),OUT p_int INT)
    -> BEGIN
    -> IF p_name is null or p_name='' THEN
    -> SELECT * FROM t_user;
    -> ELSE
    -> SELECT * FROM t_user WHERE USER_NAME LIKE p_name;
    -> END IF;
    -> SELECT FOUND_ROWS() INTO p_int;
    -> END//

呼叫輸出:統計帶林開頭的人數;

mysql> CALL SP_SEARCH2('林%',@p_num);
    -> SELECT @p_num;

帶INOUT的儲存過程

mysql> CREATE PROCEDURE sp_inout(INOUT p_num INT)
    -> BEGIN
    -> SET p_num=p_num*10;
    -> END//

//呼叫並輸出結果

mysql> SET @p_num=2;
    -> call sp_inout(@p_num);
    -> SELECT @p_num;
    -> //

2、 儲存過程體

儲存過程體中可以使用各種sql語句和過程式語句的組合,來封裝資料庫應用中複雜的業務邏輯和處理規則,以實現資料庫應用的靈活程式設計。

下面主要介紹幾個用於構造儲存過程體的常用語法元素。

2.1 區域性變數

在儲存過程體中可以宣告區域性變數,用來儲存儲存過程體中臨時結果。

DECLARE var_name[,…] type [DEFAULT value] 
Var_name:指定區域性變數的名稱 
Type:用於宣告區域性變數的資料型別 
default子句:用於為區域性變數指定一個預設值。若沒有指定,預設為null.

如:

Declare cid int(10);

使用說明:

區域性變數只能在儲存過程體的begin…end語句塊中宣告。
區域性變數必須在儲存過程體的開頭處宣告。
區域性變數的作用範圍僅限於宣告它的begin..end語句塊,其他語句塊中的語句不可以使用它。
區域性變數不同於使用者變數,兩者區別:區域性變數宣告時,在其前面沒有使用@符號,並且它只能在begin..end語句塊中使用;

而使用者變數在宣告時,會在其名稱前面使用@符號,同時已宣告的使用者變數存在於整個會話之中。

2.2 set語句

使用set語句為區域性變數賦值

Set var_name=expr
Set cid=910;

2.3 select... into 語句

把選定列的值直接儲存到區域性變數中,語法格式

Select col_name[,…] into var_name[,…] table_expr 
Col_name:用於指定列名 
Var_name:用於指定要賦值的變數名 
Table_expr:表示select語句中的from字句及後面的語法部分 

說明:儲存過程體中的select…into語句返回的結果集只能有一行資料。

2.4 定義處理程式

是事先定義程式執行過程中可能遇到的問題。並且可以在處理程式中定義解決這些問題的辦法。這種方式可以提前預測可能出現的問題,並提出解決方法。

DECLARE handler_type HANDLER FOR condition_value[,…] sp_statement 
handler_type:CONTINUE | EXIT | UNDO 
Condition_value:Sqlwarning | not found | sqlexception

3. 儲存過程和函式的區別

儲存過程,儲存過程實現的功能比較複製,功能強大,可以執行包括修改表等一系列資料庫操作。

儲存函式,實現的功能針對性比較強。

返回值上的不同

儲存過程:可以返回多個值,也可以不返回值,只是實現某種效果或動作。

儲存函式:必須有返回值,而且只能有一個返回值。

引數不同

儲存過程:儲存過程的引數型別有三種,in,out,inout。

儲存函式:引數型別只有一種,類似於in引數,呼叫函式時需要按照引數的型別指定值即可。

語法結構

儲存過程,儲存過程宣告時不需要指定返回型別。

儲存函式,函式宣告時需要指定返回型別,且在函式體中必須包含一個有效的return語句。

呼叫方式

儲存過程,用call語句進行呼叫

儲存函式,嵌入在sql中使用的,可以在select中呼叫

4. 事務

事務必須滿足的四個條件:

  1. atomicity原子性
  2. consistency一致性
  3. lsolation隔離性
  4. durability永續性
控制事務處理

rollback,回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改

commit,會提交事務,並使已對資料庫進行的所有修改稱為永久性的

savepoint identifier,允許在事務中建立一個儲存點,一個事務中可以有多個savepoint

rollback to identifier,把事務回滾到標記點

事務處理主要有兩種方法

begin, rollback, commit來實現

  1. begin,start transaction開始一個事務
  2. rollback事務回滾
  3. commit事務確認

直接用set來改變mysql的自動提交模式

  1. set autocommit = 0禁止自動提交
  2. set autocommit = 1開始自動提交

4.1 innodb使用事務

從Mysql5.5版本開始,InnoDB是預設的表儲存引擎。

innodb是事務型資料庫的首選引擎,支援事務安全表。

MySql中 delimiter

預設下,delimiter是分號,在命令列客戶端中,如果有一行命令以分號結束,那麼回車後,mysql將會執行該命令。

(告訴mysql直譯器,該段命令是否已經結束了,mysql是否可以執行了。)

什麼是儲存引擎:資料庫儲存引擎是資料庫底層軟體元件。資料庫管理系統使用資料引擎進行建立,查詢,更新和刪除資料的操作。

mysql的核心就是儲存引擎。

innodb儲存引擎

  • 它為mysql提供了具有提交,回滾和崩潰恢復能力的事務安全儲存引擎。
  • 對於處理巨大資料量的資料擁有很好的效能
  • innodb儲存引擎支援外來鍵完整性約束
  • innodb被用在眾多需要高效能的大型資料庫站點上

設定儲存引擎:

  1. 設定伺服器的儲存引擎
  2. 在配置檔案my.ini中的mysqld下面設定需要的儲存引擎
  3. default-storage-engine=InnoDB
  4. 重啟mysql伺服器
建立表(單個)設定儲存引擎
create table mytest(
 id int primary key,
 name varchar(10)
) engine = innodb default charset = utf8;

altertabletablenameengine=engineName

5. 管理與維護

管理使用者

 USE mysql;
 select user from user;

許可權表:儲存賬號的許可權資訊表:user,db,host,tables_priv,columns_privprocs_priv 。

各個許可權表的作用

tables_priv表用來對錶設定操作許可權;columns_priv表用來對錶的某一列設定許可權;procs_priv表可以對儲存過程和儲存函式設定操作許可權。

使用CREATE USER語句建立新使用者

語法格式:

CREATE USERuser”@“host” [IDENTIFIED BY “password”];

使用DROP USER 語句刪除使用者

語法格式:

 DROP USER user[, user];
 例:使用DROP USER刪除賬戶"rose"@"localhost":
 DROP USER "rose"@"localhost";

示例:

檢視日誌檔案的路徑
show variables like 'log_error';
 
建立新的日誌資訊表
flush logs;
 
建立新的日誌資訊表
mysqladmin -uroot -p flush-logs