sql身份證約束
A. 建立sql資料庫,其中有個身份證的欄位,該用什麼數據類型。
設計用戶表時,身份證號為固定18位長,對該欄位最好採用char數據類型。
char類型對英文字元佔用1個位元組,對一個漢字佔用2個位元組,而且char存儲定長數據很方便,char欄位上的索引效率極高。
比如:定義char(10),那麼不論你存儲的數據是否達到了10個位元組,都要佔去10個位元組的空間,不夠的字元用空格去填。因為是固定長度,所以速度效率高。
(1)sql身份證約束擴展閱讀
char與varchar的比較:
1、數據存儲開銷
每個varchar列需要額外的兩個位元組,用於反映存儲的數據的長度。
每個可為NULL的char列,需要一些位元組(空點陣圖)來反應數據的為空性。無論實際數據的長度是多少,char按照定義的長度分配存儲空間。
2、NULL值
char列的NULL值佔用存儲空間,varcahr列的NULL值不佔用存儲空間。插入同樣數量的NULL值,varchar列的插入效率明顯高出char列。
3、插入數據
無論插入數據涉及的列是否建立索引,char的效率都明顯低於varchar。
4、更新數據
如果更新的列上未建立索引,則char的效率低於varchar,差異不大;建立索引的話,效率差異較大。
5、修改結構
對於增加列的寬度而言,char與varchar有非常明顯的效率差異,修改varcahr列基本上不花費時間,而修改char列需要花費很長的時間。
6、數據檢索
無論是否通過索引,varchar類型的數據檢索略優於char的掃描。
B. SQL 中身份證編碼與出生日期驗證
根據身份證號驗證出生日期:
alter table 你的表--修改表
/*添加約束 要麼刪掉你之前的生日約肆早含束 要麼把
約束裂笑開始到結束復制到你的約束里再改*/
add constraint CK_生日 check(
--約束開始
convert(datetime,replace(stuff(stuff(right (left(char之類類型的18位的身份證號,14),8),5,0,'-'),8,0,'-'),'0',''))=生日欄位
--約束結束
)
最後只要把中文替睜孫換掉就可以了