1. 程式人生 > >數據庫基本經常使用類型解析

數據庫基本經常使用類型解析

使用 固定 出現 lin 正常 money 範圍 字符數 字符集

int、bigint、smallint 和 tinyint
使用整數數據的精確數字數據類型。
bigint
從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數據(全部數字)。

存儲大小為 8 個字節。


int
從 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型數據(全部數字)。存儲大小為 4 個字節。int 的 SQL-92 同義字為 integer。


smallint
從 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型數據。

存儲大小為 2 個字節。
tinyint
從 0 到 255 的整型數據。存儲大小為 1 字節。
凝視
在支持整數值的地方支持 bigint 數據類型。可是,bigint 用於某些特殊的情況,當整數值超過 int 數據類型支持的範圍時,就能夠採用 bigint。

在 SQL Server 中,int 數據類型是基本的整數數據類型。


在數據類型優先次序表中,bigint 位於 smallmoney 和 int 之間。
僅僅有當參數表達式是 bigint 數據類型時,函數才返回 bigint。SQL Server 不會自己主動將其他整數數據類型(tinyint、smallint 和 int)提升為 bigint。

char、varchar、nchar、nvarchar類型解說:

一、基本差別:

1、char、varchar

char(n): 定長數據類型,n為能存儲的最大字節長度(取值範圍1~8000),當存入字符數少於n的時候,末尾用空格不足。

當存入字符數超過n的時候,數據庫階段n之後的字符截斷。

varchar(n): 變長數據類型,n為能存儲的最大字節長度(取值範圍1~8000)。當存儲字符占用字節少於n時,以實際使用為準;超過n時,截斷。

這裏為什麽說n是來限定存儲的字節呢?

原因在於當使用char或varchar來存儲數據是:字符為由於字符,占一個字節。字符中文字符時,一個中文字符普通情況下占兩個字節。要存入的字符為中英文混合時。按實際使用的字節計算。如‘中文ABC’存儲占用字節為:2*2+3:。以下舉個樣例:

declare @var1 varchar(6), @var2 varchar(5);

set @var1=‘中文AB‘;

set @var2=‘中文AB‘;

select @var1, @var2;

運行結果例如以下:

| 未知列1 | 未知列2 |

---------------------------------------

| 中文AB | 中文A |

原因在於“中文AB”使用varchar類型來存儲時占用字節為:2*2+2=6。 第二個varchar(5)限定了最長為5個字節所以會把超出部分截斷,既‘B’丟失。

2、ncahr、nvarchar

nchar(n): 定長數據類型。存儲字符為Unicode編碼類型,每一個字符占兩個字節,n為能存儲的最大字符數(取值範圍1~4000【想想最大值為什麽是4000?】),當存入字符數少於n的時候,末尾用空格不足。當存入字符數超過n的時候。數據庫階段n之後的字符。

nvarchar(n): 變長數據類型,存儲字符為Unicode編碼類型,每一個字符占兩個字節,n為能存儲的最大字符數(取值範圍1~4000),當存儲字符占用字節少於n時,以實際使用為準;超過n時,截斷。

相同以一個樣例來說明,nvarchar(n)括號裏的n指的是字符限定數。

declare @var1 nvarchar(4), @var2 nvarchar(3);

set @var1=‘中文AB‘;

set @var2=‘中文AB‘;

select @var1, @var2;

運行結果例如以下:

| 未知列1 | 未知列2 |

---------------------------------------

| 中文AB | 中文A |

二、使用情況:

【本段摘自http://www.cnblogs.com/ebaidu/archive/2007/08/14/854778.html僅供學習使用】

非常多開發人員進行數據庫設計的時候往往並沒有太多的考慮char, varchar類型,有的是根本就沒註意,由於存儲價格變得越來越廉價了,忘記了最開始的一些基本設計理論和原則,這點讓我想到了如今的年輕人,大手一揮一把人民幣就從他手裏溜走了。事實上我想無論是做人也好。做開發也好,細節的把握直接決定非常多東西。當然另一部分人是根本就沒弄清楚他們的差別,也就隨便選一個。在這裏我想對他們做個簡單的分析。當然假設有不正確的地方希望大家不吝賜教。

1、CHAR。CHAR存儲定長數據非常方便,CHAR字段上的索引效率級高,比方定義char(10),那麽不論你存儲的數據是否達到了10個字節。都要占去10個字節的空間,不足的自己主動用空格填充,所以在讀取的時候可能要多次用到trim() 。

2、VARCHAR。

存儲變長數據 。但存儲效率沒有CHAR高。 假設一個字段可能的值是不固定長度的,我們僅僅知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。

VARCHAR類型的實際長度是它的值的實際長度+1。為什麽“+1”呢?這一個字節用於保存實際使用了多大的長度。

從空間上考慮。用varchar合適;從效率上考慮。用char合適。關鍵是依據實際情況找到權衡點。

3、TEXT。text存儲可變長度的非Unicode數據,最大長度為2^31-1(2,147,483,647)個字符。

4、NCHAR、NVARCHAR、NTEXT。

這三種從名字上看比前面三種多了個“N”。它表示存儲的是Unicode數據類型的字符。我們知道字符中。英文字符僅僅須要一個字節存儲就足夠了,但漢字眾多,須要兩個字節存儲,英文與漢字同一時候存在時easy造成混亂。Unicode字符集就是為了解決字符集這樣的不兼容的問題而產生的,它全部的字符都用兩個字節表示,即英文字符也是用兩個字節表示。 nchar、 nvarchar的長度是在1到4000之間。

和char、varchar比較起來。nchar、nvarchar則最多存儲4000個字符,不論是英文還是漢字;而char、varchar最多能存儲8000個英文,4000個漢字。能夠看出使用nchar、nvarchar數據類型時不用操心輸入的字符是英文還是漢字,較為方便,但在存儲英文時數量上有些損失。

補充:char(n)在讀取是知道字符串的長度,能夠一次讀出。而varchar(n)就像C語言中的字符串處理方式一樣,在末尾用‘\0‘來表示結尾。所以不能一次性讀出。須要一個一個字符讀出才幹知道在哪裏結束。

所以char類型的讀取速度比varchar類型的讀取速度快。


所以一般來說。假設含有中文字符,用nchar/nvarchar,假設純英文和數字,用char/varchar
我把他們的差別概括成:
CHAR, NCHAR 定長,速度快,占空間大。需處理
VARCHAR。NVARCHAR。TEXT 不定長,空間小,速度慢,無需處理
NCHAR、NVARCHAR、NTEXT處理Unicode碼

【本段摘自http://wenku.baidu.com/view/eee97bf5f61fb7360b4c652b.html僅供學習使用】

varchar在SQL Server中是採用單字節來存儲數據的,nvarchar是使用Unicode來存儲數據的.中文字符存儲到SQL Server中會保存為兩個字節(一般採用Unico編碼)。英文字符保存到數據庫中,假設字段的類型為varchar,則僅僅會占用 一個字節 。而假設字段的類型為nvarchar。則會占用 兩個字節 .
  正常情況下,我們使用varchar 也能夠存儲中文字符 ,可是假設遇到操作系統是英文操作系統並且對中文字體的 支持不全面時 , 在SQL Server存儲中文字符為varchar就會出現亂碼(顯示為?

?).並且正常情況下。主機都會支持中文的環境,所以假設使用varchar來存儲數據。在開發階段是發現不了的.多數情況下,在布署的時候也不會有問題.
  可是!

假設布署的主機是英文操作系統,並且不支持中文環境,那問題就出來了.全部的varchar字段在存儲中文的時候都會變成亂碼(顯示為??).並且普通情況下你不會知道這是由於你採用了錯誤的數據類型來存儲所造成的,你會試著去裝中文字體,試著去設置操作系統的語言環境...這些都不能解決這個問題,唯一能解決這個問題的是把數據庫字段的類型個性為nvarchar(或者nchar).對項目管理比較熟悉的朋友應該都知道,到布署階段再來改動數據庫是一個非常恐怖的事情.
  使用nvarchar的還有一個很優點就是在推斷字符串的時候能夠不須要考慮中英文兩種字符的區別.
  當然,使用nvarchar存儲英文字符會增大一倍的存儲空間.可是在存儲代價已經非常低廉的情況下。優先考慮兼容性會給你帶來很多其它優點的.
  所以在Design的時候應該盡量使用nvarchar來存儲數據.僅僅有在你確保該字段不會保存中文的時候,才採用varchar來存儲.

補充:varchar(n)和nvarchar(n)都能處理中文,可是有些細節須要註意:當遇到中英文混合的情況時。varchar類型讀取時會每一個字節去推斷究竟是一個英文字符還是等待和下一個字節一起解析為一個中文字符,而nvarchar則不用,直接每次兩個字節一起解析為一個Unicode字符。速度自己去體會了。

------------------------------------------------------------------------------------------------------------------------

總結:

1、varchar(n)括號裏n限定的是能存儲的最大字節數,nvarchar(n)括號裏n限定的是能存儲的最大字符數。

2、varchar和nvarcahr使用情形:在字符中全是英文時使用varchar。全是中文是使用nvarchar,中英文混合時推薦使用nvarchar。

3、char和varchar使用情形:註重讀取效率時使用char(註意使用過程中要去除末尾空格)。註重使用空間時使用varchar。

數據庫基本經常使用類型解析