---
# System prepended metadata

title: SQL Common
tags: [Common, SQL]

---

# SQL Common
###### tags: `SQL` `Common`
## 資料型態
**char**
固定長度，不足補空格
可儲存長度按照bytes計算
中文英文數字符號佔bytes可能不同

**varchar**
儲存長度為實際輸入長度
可儲存長度按照byte計算
中文英文數字符號佔byte可能不同

**varchar2(oracle)**
基本跟varchar但空字串則會轉成null

**nchar**
與char不同處為
可儲存長度按照字元計算
每個字元都是用Unicode編碼，皆固定2Bytes
較佔空間，可存難字
	
**nvarchar**
與varchar不同處為
可儲存長度按照字元計算
每個字元都是用Unicode編碼，皆固定2Bytes
較佔空間，可存難字



**example : '嗨hello'**
**用char(10)儲存:**  
會用掉10個欄位、占用10bytes，儲存的字為:嗨hello_ _ _ _ ，後面會有4個欄位塞滿空白

**用varchar(10)儲存:** 
用掉7個欄位，hello用掉5個+嗨用掉2個。占用7bytes

**用nchar(10)儲存:**  
用掉10個欄位，占用20bytes，儲存的字為:嗨hello_ _ _ _ ，後面會有4個欄位塞滿空白

**用nvarchar(10)儲存:**  
用掉6個欄位，嗨hello每個字個用掉一個欄位。占用12bytes


## 資料正規化
目的是減少資料庫中資料冗餘，增進資料的一致性，
並增加資料查找或新增的效能，避免系統儲存空間上的浪費。


**第一正規化**
為了要排除"重複群"的出現，所採用的方法是要求資料庫的每個列的值域都是由原子值組成；
每個欄位的值都只能是單一值。為了達成1NF會需要定義主鍵來識別第一正規劃後的資料

**第二正規化**
須符合第一正規化
要求資料表的欄位要和資料表內的所有欄位有完全依賴關係，如果沒有則不符合。
 
例如
客戶id 商品數量 商品id 商品名稱 
商品數量與客戶id跟商品id有完全依賴的關係
商品名稱則與商品id有部分依賴的關係因此商品名稱需要另外開一個table	

**第三正規化**
須符合第二正規化
每個非鍵值欄位不可與其他非鍵值欄位相依(不可以是兩三個欄位的計算結果之類)

補充

1.外鍵的特性，在刪除時要先刪擁有外鍵的欄位才能刪除外鍵的table資料，查詢速度提高，
但可能會造成系統的複雜度變高，因此要不要設定還是依照專案特性來決定
2.主鍵的組成可能會有連續號碼、uuid、guid、時間，但可能會有其他衍生問題
例如:1.連續號碼key容易被爬蟲2.uuid、guid難記憶、占空間、叢集索引要另外建置


## ACID

**Atomicity（原子性）**：
一個事務（transaction）中的所有操作，或者全部完成，或者全部不完成，不會結束在中間某個環節。事務在執行過程中發生錯誤，會被回滾 (數據管理)")（Rollback）到事務開始前的狀態，就像這個事務從來沒有執行過一樣。即，事務不可分割、不可約簡。

**Consistency（一致性）**：
在事務開始之前和事務結束以後，資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設、"觸發器 (資料庫)")、級聯回滾等。

**Isolation（隔離性）**：
資料庫允許多個並發事務同時對其數據進行讀寫和修改的能力，隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別，包括未提交讀（Read uncommitted）、提交讀（read committed）、可重複讀（repeatable read）和串行化（Serializable）。

**Durability（持久性）**：
事務處理結束後，對數據的修改就是永久的，即便系統故障也不會丟失。


 