資料函式庫系統的效能和穩定性與資料型別的選擇息息相關。正確地選擇資料型別不僅可以節省儲存空間,還能提升查詢效率。本文將詳細介紹數值和字串資料型別的特性,並說明如何在不同的關聯式資料函式倉管理系統(RDBMS)中使用它們。浮點數型別儲存帶有小數的數值,適用於科學計算和金融分析等場景。字串型別則用於儲存文字資料,需要注意不同資料函式庫系統的字串長度限制和編碼方式。選擇適當的資料型別對於資料函式庫的設計和管理至關重要。

資料型別詳解:數值與字串資料

在資料函式倉管理系統(RDBMS)中,資料型別的選擇對於資料的儲存、處理及效能最佳化至關重要。本篇文章將探討數值與字串資料的特性、儲存方式及其在不同 RDBMS 中的實作。

浮點數資料型別

浮點數用於儲存具有小數部分的數值,在科學計算、金融分析等領域中扮演重要角色。下表列出了常見 RDBMS 支援的浮點數資料型別:

RDBMS資料型別資料範圍儲存大小
MySQLFLOAT0 至 23 位元4 位元組
MySQLFLOAT24 至 53 位元8 位元組
MySQLDOUBLE0 至 53 位元8 位元組
OracleBINARY_FLOAT無資訊4 位元組
OracleBINARY_DOUBLE無資訊8 位元組
PostgreSQLREAL無資訊4 位元組
PostgreSQLDOUBLE PRECISION無資訊8 位元組
SQL ServerREAL無資訊4 位元組
SQL ServerFLOAT1 至 24 位元4 位元組
SQL ServerFLOAT25 至 53 位元8 位元組
SQLiteREAL無資訊8 位元組

值得注意的是,Oracle 中的 FLOAT 並非浮點數,而等同於 NUMERIC,建議使用 BINARY_FLOATBINARY_DOUBLE 以滿足浮點數需求。

二進位與儲存單位基礎

  • 位元(Bit):資訊儲存的最小單位,可為 0 或 1。
  • 位元組(Byte):由 8 個位元組成,例如 10101010 即為一個位元組。每個字元通常由一個位元組表示。

字串資料

字串是用於儲存文字資料的主要形式,包括字母、數字及特殊符號的組合。

字串表示法

根據 SQL 標準,字串須以單引號括起,例如 'This is a string.'。若需在字串中包含單引號,則使用兩個連續的單引號,如 'You''re welcome.',最終輸出為 'You're welcome.'

某些 RDBMS 提供替代的引號方式:

  • Oracle:使用 Qq 開頭,並以特定符號括住字串,例如 Q'[This is a string.]'
  • PostgreSQL:使用雙美元符 $,可加入標籤,例如 $$This is a string.$$$mytag$This is a string.$mytag$

控制序列(Escape Sequences)

MySQL 和 PostgreSQL 支援控制序列,用於表示特殊字元,如下表所示:

控制序列說明
\'單引號
\tTab 符號
\n換行符號
\r回車符號
\b退格符號
\\反斜線

MySQL 使用 \ 符號引入控制序列,而 PostgreSQL 則需在字串前加上 Ee,例如 E'he\'llo'

字元資料型別

常見的字元資料型別包括:

  1. VARCHAR:儲存可變長度的字串,需指定最大長度,如 VARCHAR(50)
  2. CHAR:儲存固定長度的字串,不足部分以空格填補,例如 CHAR(5)'hi' 儲存為 'hi '
  3. TEXT:用於儲存較長的文字,無需指定長度,適合用於儲存多個段落。

下表總結了各 RDBMS 的字元資料型別支援情況:

RDBMS資料型別資料範圍預設值儲存大小
MySQLCHAR0 至 255 字元CHAR(1)可變
MySQLVARCHAR0 至 65,535 字元需要輸入資料可變
OracleCHAR1 至 2000 字元CHAR(1)可變
OracleVARCHAR21 至 4000 字元需要輸入資料可變
PostgreSQLCHAR1 至 10,485,760 字元CHAR(1)可變
PostgreSQLVARCHAR1 至 10,485,760 字元需要輸入資料可變
SQL ServerCHAR1 至 8000 位元組需要輸入資料可變
SQL ServerVARCHAR1 至 8000 位元組或最大長度需要輸入資料可變或至多 2 GB

在 Oracle 中,通常使用 VARCHAR2 取代 VARCHAR 以避免未來可能的變更。

重點整理與最佳實踐

  1. 選擇適當的資料型別:根據實際需求選擇合適的數值或字串資料型別,以最佳化儲存空間及效能。
  2. 注意 RDBMS 特性:不同的 RDBMS 對資料型別的支援和實作方式可能不同,應參考相應的檔案以確保相容性。
  3. 善用控制序列和引號替代方案:在處理包含特殊字元的字串時,善用控制序列和引號替代方案,以提高查詢的可讀性和正確性。

透過對數值與字串資料的深入瞭解,開發者可以更有效地設計和管理資料函式庫,滿足各種應用場景的需求。

資料函式庫中的日期與時間資料型別

在資料函式倉管理系統中,正確地儲存和處理日期與時間資料是非常重要的。本篇文章將探討不同資料函式庫系統中日期與時間的資料型別,並介紹如何有效地使用它們。

字元資料型別與 Unicode

在討論日期與時間之前,我們先來瞭解字元資料型別的基礎。字元資料可以以 ASCII 或 Unicode 的形式儲存。ASCII 使用 1 個位元組來表示每個字元,總共可以表示 128 個不同的字元。這對於大多數英文應用來說是足夠的,但對於需要表示更多字元(如中文、日文或特殊符號)的情況,Unicode 則提供了更大的字元集。

Unicode 資料型別

不同的資料函式庫系統對 Unicode 的支援有所不同。下表列出了各大資料函式庫系統所支援的 Unicode 資料型別:

資料函式庫系統Unicode 資料型別描述
MySQLNCHAR, NVARCHAR用於儲存 Unicode 字元
OracleNCHAR, NVARCHAR2用於儲存 Unicode 字元
PostgreSQLCHAR, VARCHAR支援 Unicode 資料
SQL ServerNCHAR, NVARCHAR用於儲存 Unicode 字元
SQLiteTEXT支援 Unicode 資料

以下是一個範例,展示如何在 SQL Server 中使用 NVARCHAR 來儲存 Unicode 資料:

CREATE TABLE my_table (
    ascii_text VARCHAR(10),
    unicode_text NVARCHAR(10)
);

INSERT INTO my_table VALUES
('abc', 'abc'),
(N'趙欣婉', N'趙欣婉');

SELECT * FROM my_table;

結果:

+
---
-
---
-
---
-+
---
-
---
-
---
---
+
| ascii_text | unicode_text |
+
---
-
---
-
---
-+
---
-
---
-
---
---
+
| abc        | abc          |
| ???        | 趙欣婉       |
+
---
-
---
-
---
-+
---
-
---
-
---
---
+

程式碼解析

  1. 建立表格:使用 CREATE TABLE 陳述式建立一個名為 my_table 的表格,包含兩個欄位:ascii_textunicode_text
  2. 插入資料:使用 INSERT INTO 陳述式向 my_table 插入資料。注意,在插入 Unicode 資料時,需要在字串前加上 N 字首,以表示這是 Unicode 字串。
  3. 查詢資料:使用 SELECT 陳述式查詢 my_table 中的所有資料。可以看到,ascii_text 欄位無法正確顯示 Unicode 字元,而 unicode_text 欄位則可以正確顯示。

日期與時間資料型別

不同資料函式庫系統對日期與時間的處理方式各有不同。以下是一些常見的日期與時間格式:

  • 日期:YYYY-MM-DD(例如:2022-10-15
  • 時間:hh:mm:ss(例如:10:30:00
  • 日期與時間:YYYY-MM-DD hh:mm:ss(例如:2022-10-15 10:30:00

日期與時間的表示方式

在 SQL 中,可以使用特定的關鍵字或函式來表示日期與時間。以下是一些範例:

-- MySQL
SELECT DATE '2021-02-25';
SELECT TIME '10:30';
SELECT TIMESTAMP '2021-02-25 10:30';

-- Oracle
SELECT DATE '2021-02-25' FROM dual;
SELECT TIMESTAMP '2021-02-25 10:30:00' FROM dual;

-- PostgreSQL
SELECT DATE '2021-02-25';
SELECT TIME '10:30';
SELECT TIMESTAMP '2021-02-25 10:30';

-- SQL Server
SELECT CAST('2021-02-25' AS DATE);
SELECT CAST('10:30' AS TIME);
SELECT CAST('2021-02-25 10:30' AS DATETIME);

-- SQLite
SELECT DATE('2021-02-25');
SELECT TIME('10:30');
SELECT DATETIME('2021-02-25 10:30');

程式碼解析

  1. 日期表示:使用 DATE 關鍵字或 CAST 函式來表示日期。
  2. 時間表示:使用 TIME 關鍵字或 CAST 函式來表示時間。
  3. 日期與時間表示:使用 TIMESTAMPDATETIME 關鍵字,或 CAST 函式來表示日期與時間。

各資料函式庫系統的日期與時間資料型別

下表列出了各大資料函式庫系統所支援的日期與時間資料型別:

資料函式庫系統日期資料型別時間資料型別日期與時間資料型別
MySQLDATETIMEDATETIME, TIMESTAMP
OracleDATETIMESTAMPTIMESTAMP
PostgreSQLDATETIMETIMESTAMP
SQL ServerDATETIMEDATETIME, DATETIME2
SQLiteDATETIMEDATETIME

資料函式庫中的日期與時間資料型別比較

在不同的關聯式資料函式倉管理系統(RDBMS)中,日期與時間的資料型別有多種變化。本文將探討 MySQL、Oracle、PostgreSQL、SQL Server 和 SQLite 中常用的日期與時間資料型別,並比較其異同。

MySQL 中的日期與時間資料型別

MySQL 提供了多種日期與時間資料型別,包括 DATETIMEDATETIMETIMESTAMPYEAR。這些型別的格式和範圍如下表所示:

資料型別格式範圍
DATEYYYY-MM-DD1000-01-01 至 9999-12-31
TIMEhh:mm:ss-838:59:59 至 838:59:59
DATETIMEYYYY-MM-DD hh:mm:ss1000-01-01 00:00:00 至 9999-12-31 23:59:59
TIMESTAMPYYYY-MM-DD hh:mm:ss1970-01-01 00:00:01 UTC 至 2038-01-19 03:14:07 UTC
YEARYYYY0000 至 9999

以下是一個建立包含不同日期與時間欄位的表格範例:

CREATE TABLE my_table (
    dt DATE,
    tm TIME,
    dttm DATETIME,
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    yr YEAR
);

INSERT INTO my_table (dt, tm, dttm, yr)
VALUES ('2021-7-4', '6:30', '2021-12-25 7:00:01', 2021);

程式碼解析:

  1. CREATE TABLE my_table:建立一個名為 my_table 的表格。
  2. 資料型別定義:定義了五種不同的日期與時間資料型別。
  3. INSERT INTO my_table:插入一筆測試資料到表格中。
  4. DEFAULT CURRENT_TIMESTAMP:表示當插入新記錄時,若未指定 TIMESTAMP 欄位的值,則自動設為目前的時間戳。

Oracle 中的日期與時間資料型別

Oracle 支援的日期與時間資料型別包括 DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE

資料型別描述
DATE可儲存日期或日期和時間,取決於 NLS_DATE_FORMAT 設定。
TIMESTAMPDATE 相似,但可儲存小數秒,預設為六位小數。
TIMESTAMP WITH TIME ZONETIMESTAMP 的基礎上增加時區資訊。
TIMESTAMP WITH LOCAL TIME ZONE根據使用者的本地時區進行調整的 TIMESTAMP WITH TIME ZONE

建立包含不同日期與時間欄位的表格範例如下:

CREATE TABLE my_table (
    dt DATE,
    ts TIMESTAMP,
    ts_tz TIMESTAMP WITH TIME ZONE,
    ts_lc TIMESTAMP WITH LOCAL TIME ZONE
);

INSERT INTO my_table VALUES (
    '4-Jul-21', 
    '4-Jul-21 6:30', 
    '4-Jul-21 6:30:45AM CST', 
    '4-Jul-21 6:30'
);

程式碼解析:

  1. 資料型別的定義:Oracle 中的日期與時間欄位支援多種時區相關的資料型別。
  2. 使用時區資訊:在插入資料時,可以指定時區(如 CST)。
  3. 時間格式的靈活性:可根據需求選擇合適的日期與時間儲存方式。

PostgreSQL 中的日期與時間資料型別

PostgreSQL 提供多種日期與時間相關的資料型別,包括 DATETIMETIME WITH TIME ZONETIMESTAMPTIMESTAMP WITH TIME ZONE

資料型別格式範圍
DATEYYYY-MM-DD公元前4713年至公元5874897年
TIMEhh:mm:ss00:00:00 至 24:00:00
TIME WITH TIME ZONEhh:mm:ss+tz00:00:00+1459 至 24:00:00–1459
TIMESTAMPYYYY-MM-DD hh:mm:ss公元前4713年至公元294276年
TIMESTAMP WITH TIME ZONEYYYY-MM-DD hh:mm:ss+tz公元前4713年至公元294276年

建立包含不同日期與時間欄位的表格範例如下:

CREATE TABLE my_table (
    dt DATE,
    tm TIME,
    tm_tz TIME WITH TIME ZONE,
    ts TIMESTAMP,
    ts_tz TIMESTAMP WITH TIME ZONE
);

INSERT INTO my_table VALUES (
    '2021-7-4', 
    '6:30', 
    '6:30 CST', 
    '2021-12-25 7:00:01', 
    '2021-12-25 7:00:01 CST'
);

程式碼解析:

  1. 豐富的日期與時間型別:PostgreSQL 支援多種日期與時間相關的資料型別,能夠滿足複雜的時間儲存需求。
  2. 時區支援:可以儲存帶有時區資訊的時間資料,便於進行跨時區的時間運算。

SQL Server 中的日期與時間資料型別

SQL Server 提供多種日期與時間相關的資料型別,包括 DATETIMESMALLDATETIMEDATETIMEDATETIME2DATETIMEOFFSET

資料型別格式範圍
DATEYYYY-MM-DD0001-01-01 至 9999-12-31
TIMEhh:mm:ss.nnnnnnn00:00:00.0000000 至 23:59:59.9999999
SMALLDATETIMEYYYY-MM-DD hh:mm:ss日期:1900-01-01 至 2079-06-06;時間:00:00:00 至 23:59:59
DATETIMEYYYY-MM-DD hh:mm:ss.nnn日期:1753-01-01 至 9999-12-31;時間:00:00:00 至 23:59:59.997
DATETIME2YYYY-MM-DD hh:mm:ss.nnnnnnn日期:0001-01-01 至 9999-12-31;時間:00:00:00 至 23:59:59.9999999
DATETIMEOFFSETYYYY-MM-DD hh:mm:ss.nnnnnnn +/-hh:mm日期和時間範圍同 DATETIME2,並帶有時區偏移

建立包含不同日期與時間欄位的表格範例如下:

CREATE TABLE my_table (
    dt DATE,
    tm TIME,
    dttm_sm SMALLDATETIME,
    dttm DATETIME,
    dttm2 DATETIME2,
    dttm_off DATETIMEOFFSET
);

INSERT INTO my_table VALUES (
    '2021-7-4', 
    '6:30', 
    '2021-12-25 7:00:01', 
    '2021-12-25 7:00:01', 
    '2021-12-25 7:00:01', 
    '2021-12-25 7:00:01 -06:00'
);

程式碼解析:

  1. 多樣化的日期與時間支援:SQL Server 提供多種精確度和範圍不同的日期與時間資料型別,以滿足不同的應用需求。
  2. 時區偏移支援:使用 DATETIMEOFFSET 可儲存帶有時區偏移的時間資訊。

SQLite 中的日期與時間處理

SQLite 本身並未提供特定的日期與時間資料型別,而是透過 TEXTREALINTEGER 這三種型別來儲存日期和時間。

資料型別描述
TEXT以字串形式儲存,格式為 YYYY-MM-DD HH:MM:SS.SSS
REAL以儒略日(Julian day)形式儲存,即自公元前4714年11月24日格林威治正午以來經過的天數。
INTEGER以 Unix 時間戳形式儲存,即自1970年1月1日00:00:00 UTC 以來的秒數。

範例如下:

CREATE TABLE my_table (
    dt_text TEXT,
    dt_real REAL,
    dt_integer INTEGER
);

INSERT INTO my_table VALUES (
    '2021-12-25 7:00:01',
    julianday('2021-12-25 7:00:01'),
    strftime('%s', '2021-12-25 07:00:01')
);

程式碼解析:

  1. 多種儲存方式:SQLite 提供多種方式來儲存日期和時間,開發者可根據需求選擇適合的儲存方式。
  2. 使用內建函式:使用如 julianday()strftime() 等函式進行日期和時間的轉換和運算。