1. 程式人生 > 其它 >MySQL事務處理及字符集和校對順序

MySQL事務處理及字符集和校對順序

技術標籤:java程式設計java

一、事務處理
事務處理:是一種機制,管理必須成批執行的MySQL操作,以保證資料庫不包含不完整的操作結果。用來維護資料庫的完整性。

利用事務處理,可以保證一組操作不會中途停止,或作為整體執行或完全不執行(除非明確指示)。如果沒有發生錯誤,整組語句寫入資料庫,如發生錯誤,則進行回退,以恢復資料庫到某個已知且安全的狀態。

事務處理的幾個重要術語:

·事務:一組SQL語句;

·回退:撤銷指定SQL語句的過程;

·提交:將未儲存的SQL語句結果寫入資料庫表;

·保留點:事務處理中設定的臨時佔位符,可以對它釋出回退(與回退整個事務處理不同);

管理事務處理的關鍵:將SQL語句組分解為邏輯塊,並明確規定資料何時應該回退,何時不應回退。

start transaction:標識事務的開始

1、使用rollback

rollback命令用來回退(撤銷)MySQL語句,如下:

select * from ordertotals;
start transaction;
delete from ordertotals;
select * from ordertotals;
rollback;
select * from ordertotals;

解析:用rollback語句回退start transaction之後的所有語句,最後一條select語句顯示該表不為空。

PS:

rollback只能在一個事務處理內使用(在執行一條start transaction命令之後)。

事務處理用來管理select、insert和update語句;不能回退select語句(沒意義);不能回退create或drop操作(即使事務中使用這兩條語句,如果執行回退,它們也不會被撤銷)。

2、使用commit

一般MySQL語句都是直接針對資料庫表執行和編寫,也就是隱含提交,即提交(寫或儲存)操作是自動的;但在事務處理塊中,提交不會隱含地進行。為進行明確的提交, 使用commit語句,如下:

start transaction;
delete from orderitems where order_num = ‘20010’;

delete from orders where order_num = ‘20010’;
commit;
解析:從系統中完全刪除訂單20010,涉及更新兩個資料庫表,所以使用事務處理塊來保證訂單不被部分刪除。commit語句僅在不出錯時寫出更改。如果第一條delete起作用,但第二條失敗,則delete不會提交(被自動撤銷)。

PS:當commit或rollback語句執行後,事務會自動關閉(將來的更改會隱含提交)。

3、使用保留點

複雜的事務處理可能需要部分提交或回退;

為了支援回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符,如果需要回退,可以回退到某個佔位符,這些佔位符稱為保留點,為了建立佔位符,可以使用savepoint語句,比如:savepoint deletel;

解析:每個保留點都取標識它的唯一名字,以便回退時MySQL知道要回退到何處。如為回退到本例給出的保留點,可以使用:rollback to deletel;

PS:保留點越多越好,這樣可以更靈活的回退;保留點在事務處理完成後自動釋放,或也可以用release savepoint明確的釋放保留點。

4、更改預設提交行為

預設的MySQL行為是自動提交所有更改,即該SQL語句都是針對表執行的,而且立即生效;為指示MySQL不自動提交更改,可以使用:set autocommit = 0;

autocommit標誌決定是否自動提交更改,不管有沒有commit語句;即設定autocommit=0(假)指示MySQL不自動提交更改(直到autocommit被設定為真為止)。

PS:autocommit標誌是針對每個連線,而不是伺服器。

二、字符集和校對順序
資料庫表被用來儲存和檢索資料,不同的語言和字符集需要以不同的方式儲存和檢索。因此MySQL需要適應不同的字符集,適應不同排序和檢索資料的方法。

常見的術語:

·字符集:字母和符號的組合

·編碼:為某個字符集成員的內部表示

·校對:為規定字元如何比較的指令

1、檢視字符集

檢視所支援的字符集完整列表,可以使用:show character set;

這條語句顯示所有可用的字符集以及每個字符集的描述和預設校對。

為檢視所支援校對的完整列表,可使用:show collation;

此語句顯示所有可用的校對,以及它們適用的字符集。

PS:通常系統管理在安裝時定義一個預設的字元集合校對,也可在建立資料庫時,指定預設的字符集和校對;為了確定所用字元集合校對,可使用以下語句:

show variables like ‘character%’;

show cariables like ‘collation%’;

PS:事實上,字符集很少是伺服器範圍(甚至資料庫範圍);不同表甚至不同列,都可能需要不同字符集,而且兩者都可以在建立表時指定。

2、指定字符集和校對

為了給表指定字符集和校對,可使用如下語句:

create table mytable
(   columnn1     int,
    columnn2     varchar(10)
) default character set hebrew
  collate hebrew_general_ci;
  
解析:建立一個包含兩列的表,並且指定字符集和校對順序。

 

MySQL預設使用的字符集和校對:

·如果指定character set和collate兩者,則使用這些值;

·如果只指定character set,則使用此字符集及其預設的校對;

·如果既不指定character set,也不指定collate,則使用資料庫預設。

 

PS:MySQL允許對每個列設定字符集和校對,例句如下:

create table mytable
(
columnn1 int,
columnn2 varchar(10),
columnn3 varchar(10) character set latin1 collate latin1_general_ci
) default character set hebrew
collate hebrew_general_ci;

校對在對用order by子句檢索出來的資料排序時起重要的作用,如果你需要用與建立表時不同的校對順序排序特定的select語句,可以在select語句自身中進行,比如:

select * from customers
order by lastname,firstname collate latinl_general_cs;

select使用collate指定一個備用的校對順序(為區分大小寫校對),這樣將影響到結果排序的次序。COLLATE還可以用於GROUP BY、HAVING、聚集 函式、別名等。

PS:如果絕對需要,串可以在字符集之間進行轉換,使用cast()或 convert()函式。
![image](https://img-blog.csdnimg.cn/img_convert/dba2cb79d1c995eb0370236354df505f.png)
[**最新2020整理收集的一些高頻面試題(都整理成文件),有很多幹貨,包含mysql,netty,spring,執行緒,spring cloud、jvm、原始碼、演算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友請加Q君樣:909038429**](https://jq.qq.com/?_wv=1027&k=LTrB46U1)
/./*歡迎加入java交流Q君樣:909038429一起吹水聊天