MySQL中的字符串有兩個常用的類型:char和varchar,二者各有優勢,下面我們來詳細分析一下。
轉載加補充
在建立數據庫表結構的時候,為了給一個String類型的數據定義一個數據庫的數據庫類型,一般參考的都是char或者varchar,這兩種選擇有時候讓人很糾結,今天想總結一下它們兩者的區別,明確一下兩者的區別。
首先明確的是,char的長度是不可變的,而varchar的長度是可變的,也就是說,定義一個char[10]和varchar[10],如果存進去的是‘csdn’,那么char所占的長度依然為10,除了字符‘csdn’外,后面跟六個空格,而varchar就立馬把長度變為4了,取數據的時候,char類型的要用trim()去掉多余的空格,而varchar是不需要的。
盡管如此,char的存取數度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找;但是char也為此付出的是空間的代價,因為其長度固定,所以難免會有多余的空格占位符占據空間,可謂是以空間換取時間效率,而varchar是以空間效率為首位的。
再者,char的存儲方式是,對英文字符(ASCII)占用1個字節,對一個漢字占用兩個字節;而varchar的存儲方式是,對每個英文字符占用2個字節,漢字也占用2個字節。
兩者的存儲數據都非unicode的字符數據。
一般用 char 類型的 存放 固定的數據 如 身份證號(18) 電話號 性別 。。。。
用varchar 存放可變的數據 這個就太多了 。。。。
UniCode與非UniCode的區別
在數據庫中我們通常會遇到字符串與Unicode字符串,對於想我這樣的初學者很多人是有很多疑問的,對此我把這個問題整理一下,方便自己與大家對知識的掌握。
字符串:(1)Char:固定長度,長度為n個字節,取值范圍1~8 000,存儲大小是n個字節。
(2)Varchar:可變長度,n 的取值范圍為1-8 000 。max 指定最大存儲大小是 2^31-1 個字節。存儲大小是輸入數據的實際長度加兩個字節。所輸入數據的長度可以為0個字符。
(3)Text:長度可變,最大長度為2^31-1(2 147 483 647)個字符。
Unicode字符串:(1)Nchar:n 個字符的固定長度的Unicode字符數據。n值必須在1~4 000 之間。存儲大小為兩倍的n字節。
(2)Nvarchar:長度可變的Unicode字符數據。n 值在1~4 000 之間。max 指定最大存儲大小為2^30-1 個字節。存儲大小是所輸入字符個數的兩倍加兩個字節。所輸入數據的長度可以為0 個字符。
(3)Ntext:長度可變的Unicode數據,最大長度為2^31-1(1 073 741 823)個字符。存儲大小是所輸入字符個數的兩倍(以字節為單位)。
它們的用法是一樣的,但是Unicode支持的字符范圍更大,存儲 Unicode 字符所需要的空間更大。
Unicode 數據
Unicode 標准為全球商業領域中廣泛使用的大部分字符定義了一個單一編碼方案。所有的計算機都用單一的 Unicode 標准 Unicode 數據中的位模式一致地翻譯成字符。這保證了同一個位模式在所有的計算機上總是轉換成同一個字符。數據可以隨意地從一個數據庫或計算機傳送到另一個數據庫或計算機,而不用擔心接收系統是否會錯誤地翻譯位模式。
對於用一個字節編碼每個字符的數據類型,存在的問題之一就是此數據類型只能表示 256 個不同的字符。這就迫使對於不同的字母表(例如相對較小的歐洲字母表)采用多重編碼規格(或者代碼頁)。而且也不可能處理象日文漢字或韓國文字這樣具有數千個字符的字母表。
每個 Microsoft SQL Server 排序規則都有一個對表示 char、varchar 和 text 值中的每個字符定義位模式進行定義的代碼頁。可為個別的列和字符常量指派不同的代碼頁。客戶端計算機使用與操作系統區域設置相關聯的代碼頁解釋字符位模式。有很多種不同的代碼頁。一些字符出現在某些代碼頁上,但並不出現在其它的代碼頁上。某些字符在一些代碼頁上用一個位模式定義,而在其它的代碼頁上卻用另一個位模式定義。當您設計必須處理不同語言的國際性系統時,為了滿足不同國家/地區的語言需求,給所有的計算機挑選代碼頁就變得困難了。要保證每一台計算機與使用不同代碼頁的系統交互時都進行正確的翻譯也是困難的。
Unicode 規格通過采用兩個字節編碼每個字符使這個問題迎刃而解。轉換最通用商業語言的單一規格具有足夠多的 2 字節的模式 (65,536)。因為所有的 Unicode 系統均一致地采用同樣的位模式來代表所有的字符,所以當從一個系統轉到另一個系統時,將不會存在未正確轉換字符的問題。通過在整個系統中使用 Unicode 數據類型,可盡量減少字符轉換問題。
