| 資料類型 |
類型 |
描 述 |
| bit |
整型 |
bit 資料類型是整型,其值只能是0、1或空值。這種資料類型用於儲存只有兩種可能值的資料,如Yes 或No、True 或Fa lse 、On 或Off |
| int |
整型 |
int 資料類型可以儲存從- 231(-2147483648)到231 (2147483 647)之間的整數。儲存到資料庫的幾乎所有數值型的資料都可以用這種資料類型。這種資料類型在資料庫裡佔用4個位元組 |
| smallint |
整型 |
smallint 資料類型可以儲存從- 215(-32768)到215(32767)之間的整數。這種資料類型對儲存一些常限定在特定範圍內的數值型資料非常有用。這種資料類型在資料庫裡佔用2 位元組空間 |
| tinyint |
整型 |
tinyint 資料類型能儲存從0到255 之間的整數。它在你只打算儲存有限數目的數值時很有用。 這種資料類型在資料庫中佔用1 個位元組 |
| numeric |
精確數值型 |
numeric資料類型與decimal 型相同 |
| decimal |
精確數值型 |
decimal 資料類型能用來儲存從-1038-1到1038-1的固定精度和範圍的數值型資料。使用這種資料類型時,必須指定範圍和精度。 範圍是小數點左右所能儲存的數位總位元。精度是小數點右邊儲存的數位位元 |
| money |
貨幣型 |
money 資料類型用來表示錢和貨幣值。這種資料類型能儲存從-9220億到9220 億之間的資料,精確到貨幣單位的萬分之一 |
| smallmoney |
貨幣型 |
smallmoney 資料類型用來表示錢和貨幣值。這種資料類型能儲存從-214748.3648 到214748.3647 之間的資料,精確到貨幣單位的萬分之一 |
| float |
近似數值型 |
float 資料類型是一種近似數實值型別,供浮點數使用。說浮點數是近似的,是因為在其範圍內不是所有的數都能精確表示。浮點數可以是從-1.79E+308到1.79E+308 之間的任意數 |
| real |
近似數值型 |
real 資料類型像浮點數一樣,是近似數實值型別。它可以表示數值在-3.40E+38到3.40E+38之間的浮點數 |
| datetime |
日期時間型 |
datetime資料類型用來表示日期和時間。這種資料類型儲存從1753年1月1日到9999年12月3 1日間所有的日期和時間資料, 精確到三百分之一秒或3.33毫秒 |
| Smalldatetime |
日期時間型 |
smalldatetime 資料類型用來表示從1900年1月1日到2079年6月6日間的日期和時間,精確到一分鐘 |
| cursor |
特殊資料型 |
cursor 資料類型是一種特殊的資料類型,它包含一個對遊標的引用。這種資料類型用在預存程序中,而且建立表時不能用 |
| timestamp |
特殊資料型 |
timestamp 資料類型是一種特殊的資料類型,用來建立一個資料庫範圍內的唯一數位。 一個表中只能有一個timestamp列。每次插入或修改一行時,timestamp列的值都會改變。儘管它的名字中有“time”, 但timestamp列不是人們可識別的日期。在一個資料庫裡,timestamp值是唯一的 |
| Uniqueidentifier |
特殊資料型 |
Uniqueidentifier資料類型用來儲存一個通用唯一識別碼,即GUID。GUID確實是全域唯一的。這個數幾乎沒有機會在另一個系統中被重建。可以使用NEWID 函數或轉換一個字串為唯一識別碼來初始化具有唯一識別碼的列 |
| char |
字元型 |
char資料類型用來儲存指定長度的定長非統一編碼型的資料。當定義一列為此類型時,你必須指定列長。當你總能知道要儲存的資料的長度時,此資料類型很有用。例如,當你按郵遞區號加4個字元格式設定來儲存資料時,你知道總要用到10個字元。此資料類型的列寬最大為8000 個字元 |
| varchar |
字元型 |
varchar資料類型,同char類型一樣,用來儲存非統一編碼型字元資料。與char 型不一樣,此資料類型為變長。當定義一列為該資料類型時,你要指定該列的最大長度。 它與char資料類型最大的區別是,儲存的長度不是列長,而是資料的長度 |
| text |
字元型 |
text 資料類型用來儲存大量的非統一編碼型字元資料。這種資料類型最多可以有231-1或20億個字元 |
| nchar |
統一編碼字元型 |
nchar 資料類型用來儲存定長統一編碼字元型資料。統一編碼用雙位元組結構來儲存每個字元,而不是用單位元組(普通文本中的情況)。它允許大量的擴充字元。此資料類型能儲存4000種字元,使用的位元組空間上增加了一倍 |
| nvarchar |
統一編碼字元型 |
nvarchar 資料類型用作變長的統一編碼字元型資料。此資料類型能儲存4000種字元,使用的位元組空間增加了一倍 |
| ntext |
統一編碼字元型 |
ntext 資料類型用來儲存大量的統一編碼字元型資料。這種資料類型能儲存230 -1或將近10億個字元,且使用的位元組空間增加了一倍 |
| binary |
位元據類型 |
binary資料類型用來儲存可達8000 位元組長的定長的位元據。當輸入表的內容接近相同的長度時,你應該使用這種資料類型 |
| varbinary |
位元據類型 |
varbinary 資料類型用來儲存可達8000 位元組長的變長的位元據。當輸入表的內容大小可變時,你應該使用這種資料類型 |
| image |
位元據類型 |
image 資料類型用來儲存變長的位元據,最大可達231-1或大約20億位元組 |
眾所周知,像“int a = 10; short b = a“這樣的語句是無法編譯通過的,原因是cannot implicitly convert type 'int' to 'short'。而我寫上“short = 10”這樣的語句是沒有問題的,即沒有錯誤也沒有警告,這是為什麼呢,難道編譯器自動幫我加上強制類型轉換?為了揭開這些方面的謎題,我做了些測試,因此有了本文。
C#基本數字資料類型一共有11種,其中8種整數類型(byte, sbyte, short, ushort, int, uint, long, ulong),3種可帶小數類型(double, float, decimal).首先,我對8種整數類型做了如下測試:
class Program
{
public static byte _byte;
public static sbyte _sbyte;
public static short _short;
public static ushort _ushort;
public static int _int;
public static uint _uint;
public static long _long;
public static ulong _ulong;
public static byte _byte2;
public static short _short2;
public static uint _uint2;
public static long _long2;
static void Main(string[] args)
{
_byte = 20;
_sbyte = 20;
_short = 20;
_ushort = 20;
_int = 20;
_uint = 20;
_long = 20;
_ulong = 20;
_byte2 = (byte)20;
_short2 = (short)20;
_uint2 = 20U;
_long2 = 20L;
}
}
產生的IL代碼如下:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 89 (0x59)
.maxstack 1
IL_0000: nop
IL_0001: ldc.i4.s 20
IL_0003: stsfld uint8 ConsoleApplication1.Program::_byte
IL_0008: ldc.i4.s 20
IL_000a: stsfld int8 ConsoleApplication1.Program::_sbyte
IL_000f: ldc.i4.s 20
IL_0011: stsfld int16 ConsoleApplication1.Program::_short
IL_0016: ldc.i4.s 20
IL_0018: stsfld uint16 ConsoleApplication1.Program::_ushort
IL_001d: ldc.i4.s 20
IL_001f: stsfld int32 ConsoleApplication1.Program::_int
IL_0024: ldc.i4.s 20
IL_0026: stsfld uint32 ConsoleApplication1.Program::_uint
IL_002b: ldc.i4.s 20
IL_002d: conv.i8
IL_002e: stsfld int64 ConsoleApplication1.Program::_long
IL_0033: ldc.i4.s 20
IL_0035: conv.i8
IL_0036: stsfld uint64 ConsoleApplication1.Program::_ulong
IL_003b: ldc.i4.s 20
IL_003d: stsfld uint8 ConsoleApplication1.Program::_byte2
IL_0042: ldc.i4.s 20
IL_0044: stsfld int16 ConsoleApplication1.Program::_short2
IL_0049: ldc.i4.s 20
IL_004b: stsfld uint32 ConsoleApplication1.Program::_uint2
IL_0050: ldc.i4.s 20
IL_0052: conv.i8
IL_0053: stsfld int64 ConsoleApplication1.Program::_long2
IL_0058: ret
} // end of method Program::Main
我們發現,_byte = 20 與 _byte = (byte)20 產生的程式碼一模一樣,_long = 20 與 _long = 20L產生的程式碼也一模一樣。因此,結合一些其他測試(這裡省略) ,我們得出以下結論:
1、_byte = 20 與 _byte = (byte)20 的效益一樣。
2、_long = 20 與 _long = 20L 的效益一樣,20L中的“L”僅僅在編譯中起作用。
3、編譯器會自動檢測直接賦的值是否超過該類型所能表示的最大範圍. ( _byte = 256 會導致編譯出錯)
接下來我們對double,float,decimal進行測試:(注釋的行表示會導致編譯無法通過)
class Program
{
public static float _float;
public static double _double;
public static decimal _decimal;
static void Main(string[] args)
{
_float = 5;
//_float = 5.0;
_float = 5F;
//_float = 5M;
_double = 5;
_double = 5.0;
_double = 5F;
//_double = 5M;
_decimal = 5;
//_decimal = 5.0;
_decimal = 5.0M;
//_decimal = 5.0F;
}
}
IL代碼如下:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 91 (0x5b)
.maxstack 6
IL_0000: nop
IL_0001: ldc.r4 5.
IL_0006: stsfld float32 ConsoleApplication1.Program::_float
IL_000b: ldc.r4 5.
IL_0010: stsfld float32 ConsoleApplication1.Program::_float
IL_0015: ldc.r8 5.
IL_001e: stsfld float64 ConsoleApplication1.Program::_double
IL_0023: ldc.r8 5.
IL_002c: stsfld float64 ConsoleApplication1.Program::_double
IL_0031: ldc.r8 5.
IL_003a: stsfld float64 ConsoleApplication1.Program::_double
IL_003f: ldc.i4.5
IL_0040: newobj instance void [mscorlib]System.Decimal::.ctor(int32)
IL_0045: stsfld valuetype [mscorlib]System.Decimal ConsoleApplication1.Program::_decimal
IL_004a: ldc.i4.s 50
IL_004c: ldc.i4.0
IL_004d: ldc.i4.0
IL_004e: ldc.i4.0
IL_004f: ldc.i4.1
IL_0050: newobj instance void [mscorlib]System.Decimal::.ctor(int32,
int32,
int32,
bool,
uint8)
IL_0055: stsfld valuetype [mscorlib]System.Decimal ConsoleApplication1.Program::_decimal
IL_005a: ret
} // end of method Program::Main
結論:
1、跟整數類型不同,帶小數類型在直接賦數值時必須指定相應數實值型別 或 可由該預設數實值型別隱式轉化為該變數類型。
2、_float = 5 與 _float = 5F 的效率一樣。"F" 同樣只在編譯中起作用。
3、decimal類型的賦值跟其它類型有些不同,查decimal的構造方法發現,它有9個公有構造方法。
以上就是我對數實值型別的簡單分析,如有不足或錯誤,歡迎大家指出。
附:
L 表示 long
D 表示 double
F 表示 float
M 表示 decimal
U 表示 uint
UL 表示 ulong