修改欄位資料型態

問題: 資料表設計的的結構,欄位嘗試修改資料型態,會出現不允許變更。

[修改前]

[修改後]

[解決]
取消勾選 防止儲存需要資料表重建的變更

[工具] > [選項] > [設計師]


欄位分類

欄位型別一般可分為以下幾種

欄位分類

  1. 文字 型別
  2. 數字 型別
  3. 日期 型別
  4. 物件 型別
  5. 物件型別 較少使用,這裡不討論

欄位分類明細列表
欄位型別分類

文字型別數值型別 (整數)數值型別 (小數)日期型別
charbitdecimaldate
varcharintnumberictime
nvarcharsmallint…datetime
…bigint …
 real  
 currency  
 float  
 …  

文字欄位型別

  1. 文字欄位型別分類
    拆解文字型別後:

欄位分類明細列表

關鍵字自動補空白多國語系
Char會不支援
Var不會不支援
N不會支援

Char型別

7 個 Bytes, 可放 7 個英文單字。

Varchar型別範例

  1. 可變動的字串長度,解決了Char 型別,輸入的資料不等於輸出資料內容的問題。
  2. 只可以符合當初安裝的預設語系(假如是繁體中文,就支援繁體中文,其他語系不支援)

NVarChar型別範例

支援多國語系

實作:
資料表名稱: DataTypeDemo

資料行名稱資料類型允許 Null
Idint不允許
chardatachar(50)允許
varchardatavarchar(50)允許
nvarchardatanvarchar(50)允許





用肉眼看不出來差異

聚焦於第一個 BOOK,BOOK佔4個字,其他空白46 個字元

聚焦於第二個 BOOK,BOOK只佔4個字。

聚焦於第三個 BOOK,BOOK只佔4個字。

用泰文輸入


NVarchar 完勝

  1. 文字欄位型別長度設定

    文字欄位型別長度設定
    1.小於等於 50,則等於 50
    2.大於 50,則等於 250
    3.無法預估,則 MAX


數值欄位型別

  1. 數值欄位型別分類

    類型型別
    布林值bit
    整數int
    小數decimal(18,4)
  2. 數值型別範圍

    資料類型範圍儲存體
    bit0 到 1 (字串值 TRUE 和 FALSE 可以轉換成 bit 值: TRUE 會轉換成 1,FALSE 則轉換成 0)1 位元組
    bigint-2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 個位元組
    int-2^31(-2,147,483,648) 到 2^31-1 (2,147,483,647)4 個位元組
    smallint-2^15 (-32,768) 到 2^15-1 (32,767)2 位元組
    tinyint0 至 2551 位元組
    float-1.79E+308 到 -2.23E-308、0 及 2.23E-308 到 1.79E+308這會隨著 n 的值而不同
    real-3.40E+38 到 -1.18E-38、0 及 1.18E-38 到 3.40E+384 個位元組
    money-922,337,203,685,477.5808 到 922,337,203,685,477.58078 個位元組
    smallmoney- 214、748.3648 到 214、748.36474 個位元組
    decimal(p,s)固定有效位數和小數位數的數字。 當使用最大有效位數時,有效的值是從 - 10^38 +1 到 10^38 - 1。decimal 的 ISO 同義字為 dec 及 dec(p, s)。numeric 在功能上與 decimal 相同。p(有效位數) 要儲存的最大小數位數總數。 此數目包括小數點的左右兩側。 有效位數必須是從 1 到最大有效位數 38 的值。 預設有效位數是 18。5 至 17 個位元組
    (依有效位數而定:1-9 為 5 位元組、10-19 為 9 位元組、20-28 為 13 位元組、29-38 為 17 位元組)

    點提示
    decimal(7,2) = 99999.99 總長度: 7 位數(含 2 位小數點)

    實作

    DataTypeDemo 資料表加入以下欄位:

    資料行名稱資料類型允許Null
    bitdatabit允許
    intdataint允許
    decimadatadecimal(7,2)允許
    編輯前 200 個資料列
    ![[assets/3. 欄位型別分類/IMG-20260727210351177.png500]]
    bitdata 欄位只能存 0,1 0 => False, 1 => True
    intdata 欄位存整數
    decimaldata欄位只能存 7 位數,超過會報錯!
    ![[assets/3. 欄位型別分類/IMG-20260727211318552.png500]]
    重點在於何時用 int, decimal 明細: 開小數, 表頭: 彙整完後用整數, 用小數較有彈性。
  3. 數值長度設定

    數值長度設定
    int : 固定,不用設定
    bit : 固定,不用設定
    decimal: 18,4

  4. 日期型別

    • 日期欄位型別分類

      日期欄位型別分類

      類型型別
      日期date
      時間time
      日期時間datetime
      日期時間(大範圍)datetime2
      日期時間(簡單型)smalldatetime
      時間戳記timestamp
    • 日期型別範圍

      日期型別範圍

      資料類型位元組資料範圍
      timestamp8 位元組 (Byte)8 Bytes 的 16 進位值
      datetime8 位元組(字元長度最小 19 個位置,最大 23 個位置)1753 年 1 月 1 日到 9999 年 12 月 31 日 時間範圍 00:00:00 到 23:59:59.997 2012-06-30 06:30:02.612
      datetime2(n)6 個位元組代表有效位數小於 3,而 7 個位元組則代表有效位數是 3 和 4。所有其他有效位數則需要 8 個位元組西元 1 年 1 月 1 日到西元 9999 年 12 月 31 日 時間範圍 00:00:00 到 3:59:59.9999999 2012-06-30 06:30:02.612
      smalldatetime4 位元組 (Byte) 1900:01:01 到 2079:06:061900 年 1 月 1 日到 2079 年 6 月 6 日 2012-09-23 17:23
      datetimeoffset(n)10 Bytes(固定)預設值 最小 26 位數 (YYYY-MM-DD hh:mm:ss {+/-}hh:mm) 最大 34 位數 (YYYY-MM-DD hh:mm:ss. nnnnnnn {+/-}hh:mm)0001-01-01 到 9999-12-31 西元 1 年 1 月 1 日到西元 9999 年 12 月 3

      重點提示

      • 大部份情形使用 date 型別(特別是需要用於統計的欄位)
      • 需要記錄時間時再增加一欄 datetime 型別欄位
    • DateTime 與 DateTime2
      SQL Server 日期時間我們很常看到使用 datetime,如果沒有特殊理由,建議使用 datetime2 。

      datetime2 優點 datetime 的進化版
      1.符合 ANSI 或 ISO 8601 標準
      2.資料精準度 100 nano second,比 datetime 更高精準度(3 位小數)
      3.儲存大小不到 3 個有效位數為 6 個位元組,
      4.比使用 datetime 相同小數位數的所需儲存容量更小
      5.使用者可指定精準度
      6.日期時間範圍更大

      DateTime與DateTime2之間的主要差異如下表所示

      比較值DateTimeDateTime2
      句法DateTimeDateTime2[(n)] 其中 n 是從 0 到 7 的小數秒精度
      格式年-月-日 時:分:秒.nnnYYYY-MM-DD 時:分:秒[.n]
      日期範圍1753年1月1日至9999年12月31日通過 9999-12-31
      時間範圍00:00:00 至 23:59:59.99700:00:00 至 23:59:59.9999999
      用法聲明 @MyDatetime 日期時間聲明 @MyDatetime2 datetime2(7)
      小數秒範圍零到三位數字(範圍從 0 到 999)表示秒的小數部分。0 到 9999999 之間的零到七位數字表示秒的小數部分
      準確性四捨五入到 0.000、0.003 或 0.007 秒的增量100 納秒
      預設值1900-01-01 00:00:001900-01-01 00:00:00
      字元長度最少 19 個位置,最多 23 個位置最少 19 個位置,最多 27 個位置
      使用者定義的小數秒精度不是的
      儲存大小8位元組精度小於 3 時為 6 個位元組。
      符合 ANSI 和 ISO 8601 標準不是的

      實例比較
      開啟 SSMS 新查詢,輸入以下指令

      DECLARE @dateTime2 datetime2(7)
      DECLARE @dateTime datetime
      SET @dateTime2 = '2000-12-31 10:30:30.5555555'
      SET @dateTime = @dateTime2
      SELECT
      'datetime2'=@dateTime2 ,
      'datetime'=@dateTime

      執行結果

    • 資料範例

      問題:從 2022/01/01 - 2022/01/06 客戶銷貨總額為多少?

      答案:10 + 40 + 50 = 100萬。 結算不等於 200萬

      原因:查詢範圍不正確

      因為沒有打時間,會用 2022/01/01 00:00:00 - 2022/01/06 00:00:00

程式設計對應

  1. SQL Server 資料類型對應
    SQL Server 和 .NET Framework 是以不同的型別系統為基礎。 例如,.NET Framework Decimal 結構的最大小數點位數為 28,而 SQL Server decimal 和 numeric 資料型別的最大小數點位數為 38。 為了在讀取和寫入資料時維持資料完整性, SqlDataReader 會公開 SQL Server 特定的具型別存取子方法,這些方法會傳回的 System.Data.SqlTypes 物件以及傳回 .NET Framework 類型的存取子方法。 SQL Server 型別和 .NET Framework 型別也會由 DbType 和 SqlDbType 類別 (Class) 中的列舉型別 (Enumeration) 表示,而且您可以在指定 SqlParameter 資料型別時使用這些類別。

    下表顯示推斷的 .NET Framework 類型、DbType 與 SqlDbType 列舉,以及 SqlDataReader 的存取子方法。

  2. 對照表

    SQL Server Database Engine 類型.NET Framework 類型SqlDbType 列舉型別DbType 列舉型別
    BIGINTInt64BigIntInt64
    BINARYByte[]VarBinaryBinary
    bitBooleanBitBoolean
    charStringCharAnsiStringFixedLength
     Char[] String
    date1DatetimeDateDateDateDate
    (SQL Server 2008 及以後版本)   
    DatetimeDatetimeDateTimeDateTime
    datetime2DatetimeDateTime2DateTime2
    (SQL Server 2008 及以後版本)   
    datetimeoffsetDateTimeOffsetDateTimeOffsetDateTimeOffset
    (SQL Server 2008 及以後版本)   
    decimalDecimalDecimalDecimal
    FILESTREAM attribute (varbinary(max))Byte[]VarBinaryBinary
    FLOATDoubleFloatDouble
    imageByte[]BinaryBinary
    intInt32IntInt32
    moneyDecimalMoneyDecimal
    NCHARStringNCharStringFixedLength
     Char[]  
    ntextStringNTextString
     Char[]  
    NUMERICDecimalDecimalDecimal
    NVARCHARStringNVarCharString
     Char[]  
    realSingleRealSingle
    rowversionByte[]TimestampBinary
    smalldatetimeDatetimeDateTimeDateTime
    SMALLINTInt16SmallIntInt16
    SMALLMONEYDecimalSmallMoneyDecimal
    sql_variantObject 2VariantObject
    textStringTextString
     Char[]  
    timeTimeSpanTimeTime

    (SQL Server 2008 及以後版本)

SQL Server Database Engine 類型.NET Framework 類型SqlDbType 列舉型別DbType 列舉型別
timestampByte[]TimestampBinary
TINYINTByteTinyIntByte
UNIQUEIDENTIFIERGuidUniqueIdentifierGuid
varbinaryByte[]VarBinaryBinary
varcharStringVarCharAnsiString, String
 Char[]  
xmlXmlXmlXml