資料函式庫系統的效能和穩定性與資料型別的選擇息息相關。正確地選擇資料型別不僅可以節省儲存空間,還能提升查詢效率。本文將詳細介紹數值和字串資料型別的特性,並說明如何在不同的關聯式資料函式倉管理系統(RDBMS)中使用它們。浮點數型別儲存帶有小數的數值,適用於科學計算和金融分析等場景。字串型別則用於儲存文字資料,需要注意不同資料函式庫系統的字串長度限制和編碼方式。選擇適當的資料型別對於資料函式庫的設計和管理至關重要。
資料型別詳解:數值與字串資料
在資料函式倉管理系統(RDBMS)中,資料型別的選擇對於資料的儲存、處理及效能最佳化至關重要。本篇文章將探討數值與字串資料的特性、儲存方式及其在不同 RDBMS 中的實作。
浮點數資料型別
浮點數用於儲存具有小數部分的數值,在科學計算、金融分析等領域中扮演重要角色。下表列出了常見 RDBMS 支援的浮點數資料型別:
| RDBMS | 資料型別 | 資料範圍 | 儲存大小 |
|---|---|---|---|
| MySQL | FLOAT | 0 至 23 位元 | 4 位元組 |
| MySQL | FLOAT | 24 至 53 位元 | 8 位元組 |
| MySQL | DOUBLE | 0 至 53 位元 | 8 位元組 |
| Oracle | BINARY_FLOAT | 無資訊 | 4 位元組 |
| Oracle | BINARY_DOUBLE | 無資訊 | 8 位元組 |
| PostgreSQL | REAL | 無資訊 | 4 位元組 |
| PostgreSQL | DOUBLE PRECISION | 無資訊 | 8 位元組 |
| SQL Server | REAL | 無資訊 | 4 位元組 |
| SQL Server | FLOAT | 1 至 24 位元 | 4 位元組 |
| SQL Server | FLOAT | 25 至 53 位元 | 8 位元組 |
| SQLite | REAL | 無資訊 | 8 位元組 |
值得注意的是,Oracle 中的 FLOAT 並非浮點數,而等同於 NUMERIC,建議使用 BINARY_FLOAT 或 BINARY_DOUBLE 以滿足浮點數需求。
二進位與儲存單位基礎
- 位元(Bit):資訊儲存的最小單位,可為 0 或 1。
- 位元組(Byte):由 8 個位元組成,例如
10101010即為一個位元組。每個字元通常由一個位元組表示。
字串資料
字串是用於儲存文字資料的主要形式,包括字母、數字及特殊符號的組合。
字串表示法
根據 SQL 標準,字串須以單引號括起,例如 'This is a string.'。若需在字串中包含單引號,則使用兩個連續的單引號,如 'You''re welcome.',最終輸出為 'You're welcome.'。
某些 RDBMS 提供替代的引號方式:
- Oracle:使用
Q或q開頭,並以特定符號括住字串,例如Q'[This is a string.]'。 - PostgreSQL:使用雙美元符
$,可加入標籤,例如$$This is a string.$$或$mytag$This is a string.$mytag$。
控制序列(Escape Sequences)
MySQL 和 PostgreSQL 支援控制序列,用於表示特殊字元,如下表所示:
| 控制序列 | 說明 |
|---|---|
\' | 單引號 |
\t | Tab 符號 |
\n | 換行符號 |
\r | 回車符號 |
\b | 退格符號 |
\\ | 反斜線 |
MySQL 使用 \ 符號引入控制序列,而 PostgreSQL 則需在字串前加上 E 或 e,例如 E'he\'llo'。
字元資料型別
常見的字元資料型別包括:
- VARCHAR:儲存可變長度的字串,需指定最大長度,如
VARCHAR(50)。 - CHAR:儲存固定長度的字串,不足部分以空格填補,例如
CHAR(5)將'hi'儲存為'hi '。 - TEXT:用於儲存較長的文字,無需指定長度,適合用於儲存多個段落。
下表總結了各 RDBMS 的字元資料型別支援情況:
| RDBMS | 資料型別 | 資料範圍 | 預設值 | 儲存大小 |
|---|---|---|---|---|
| MySQL | CHAR | 0 至 255 字元 | CHAR(1) | 可變 |
| MySQL | VARCHAR | 0 至 65,535 字元 | 需要輸入資料 | 可變 |
| Oracle | CHAR | 1 至 2000 字元 | CHAR(1) | 可變 |
| Oracle | VARCHAR2 | 1 至 4000 字元 | 需要輸入資料 | 可變 |
| PostgreSQL | CHAR | 1 至 10,485,760 字元 | CHAR(1) | 可變 |
| PostgreSQL | VARCHAR | 1 至 10,485,760 字元 | 需要輸入資料 | 可變 |
| SQL Server | CHAR | 1 至 8000 位元組 | 需要輸入資料 | 可變 |
| SQL Server | VARCHAR | 1 至 8000 位元組或最大長度 | 需要輸入資料 | 可變或至多 2 GB |
在 Oracle 中,通常使用 VARCHAR2 取代 VARCHAR 以避免未來可能的變更。
重點整理與最佳實踐
- 選擇適當的資料型別:根據實際需求選擇合適的數值或字串資料型別,以最佳化儲存空間及效能。
- 注意 RDBMS 特性:不同的 RDBMS 對資料型別的支援和實作方式可能不同,應參考相應的檔案以確保相容性。
- 善用控制序列和引號替代方案:在處理包含特殊字元的字串時,善用控制序列和引號替代方案,以提高查詢的可讀性和正確性。
透過對數值與字串資料的深入瞭解,開發者可以更有效地設計和管理資料函式庫,滿足各種應用場景的需求。
資料函式庫中的日期與時間資料型別
在資料函式倉管理系統中,正確地儲存和處理日期與時間資料是非常重要的。本篇文章將探討不同資料函式庫系統中日期與時間的資料型別,並介紹如何有效地使用它們。
字元資料型別與 Unicode
在討論日期與時間之前,我們先來瞭解字元資料型別的基礎。字元資料可以以 ASCII 或 Unicode 的形式儲存。ASCII 使用 1 個位元組來表示每個字元,總共可以表示 128 個不同的字元。這對於大多數英文應用來說是足夠的,但對於需要表示更多字元(如中文、日文或特殊符號)的情況,Unicode 則提供了更大的字元集。
Unicode 資料型別
不同的資料函式庫系統對 Unicode 的支援有所不同。下表列出了各大資料函式庫系統所支援的 Unicode 資料型別:
| 資料函式庫系統 | Unicode 資料型別 | 描述 |
|---|---|---|
| MySQL | NCHAR, NVARCHAR | 用於儲存 Unicode 字元 |
| Oracle | NCHAR, NVARCHAR2 | 用於儲存 Unicode 字元 |
| PostgreSQL | CHAR, VARCHAR | 支援 Unicode 資料 |
| SQL Server | NCHAR, NVARCHAR | 用於儲存 Unicode 字元 |
| SQLite | TEXT | 支援 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 |
| ??? | 趙欣婉 |
+
---
-
---
-
---
-+
---
-
---
-
---
---
+
程式碼解析
- 建立表格:使用
CREATE TABLE陳述式建立一個名為my_table的表格,包含兩個欄位:ascii_text和unicode_text。 - 插入資料:使用
INSERT INTO陳述式向my_table插入資料。注意,在插入 Unicode 資料時,需要在字串前加上N字首,以表示這是 Unicode 字串。 - 查詢資料:使用
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');
程式碼解析
- 日期表示:使用
DATE關鍵字或CAST函式來表示日期。 - 時間表示:使用
TIME關鍵字或CAST函式來表示時間。 - 日期與時間表示:使用
TIMESTAMP或DATETIME關鍵字,或CAST函式來表示日期與時間。
各資料函式庫系統的日期與時間資料型別
下表列出了各大資料函式庫系統所支援的日期與時間資料型別:
| 資料函式庫系統 | 日期資料型別 | 時間資料型別 | 日期與時間資料型別 |
|---|---|---|---|
| MySQL | DATE | TIME | DATETIME, TIMESTAMP |
| Oracle | DATE | TIMESTAMP | TIMESTAMP |
| PostgreSQL | DATE | TIME | TIMESTAMP |
| SQL Server | DATE | TIME | DATETIME, DATETIME2 |
| SQLite | DATE | TIME | DATETIME |
資料函式庫中的日期與時間資料型別比較
在不同的關聯式資料函式倉管理系統(RDBMS)中,日期與時間的資料型別有多種變化。本文將探討 MySQL、Oracle、PostgreSQL、SQL Server 和 SQLite 中常用的日期與時間資料型別,並比較其異同。
MySQL 中的日期與時間資料型別
MySQL 提供了多種日期與時間資料型別,包括 DATE、TIME、DATETIME、TIMESTAMP 和 YEAR。這些型別的格式和範圍如下表所示:
| 資料型別 | 格式 | 範圍 |
|---|---|---|
DATE | YYYY-MM-DD | 1000-01-01 至 9999-12-31 |
TIME | hh:mm:ss | -838:59:59 至 838:59:59 |
DATETIME | YYYY-MM-DD hh:mm:ss | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 |
TIMESTAMP | YYYY-MM-DD hh:mm:ss | 1970-01-01 00:00:01 UTC 至 2038-01-19 03:14:07 UTC |
YEAR | YYYY | 0000 至 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);
程式碼解析:
CREATE TABLE my_table:建立一個名為my_table的表格。- 資料型別定義:定義了五種不同的日期與時間資料型別。
INSERT INTO my_table:插入一筆測試資料到表格中。DEFAULT CURRENT_TIMESTAMP:表示當插入新記錄時,若未指定TIMESTAMP欄位的值,則自動設為目前的時間戳。
Oracle 中的日期與時間資料型別
Oracle 支援的日期與時間資料型別包括 DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE 和 TIMESTAMP WITH LOCAL TIME ZONE。
| 資料型別 | 描述 |
|---|---|
DATE | 可儲存日期或日期和時間,取決於 NLS_DATE_FORMAT 設定。 |
TIMESTAMP | 與 DATE 相似,但可儲存小數秒,預設為六位小數。 |
TIMESTAMP WITH TIME ZONE | 在 TIMESTAMP 的基礎上增加時區資訊。 |
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'
);
程式碼解析:
- 資料型別的定義:Oracle 中的日期與時間欄位支援多種時區相關的資料型別。
- 使用時區資訊:在插入資料時,可以指定時區(如 CST)。
- 時間格式的靈活性:可根據需求選擇合適的日期與時間儲存方式。
PostgreSQL 中的日期與時間資料型別
PostgreSQL 提供多種日期與時間相關的資料型別,包括 DATE、TIME、TIME WITH TIME ZONE、TIMESTAMP 和 TIMESTAMP WITH TIME ZONE。
| 資料型別 | 格式 | 範圍 |
|---|---|---|
DATE | YYYY-MM-DD | 公元前4713年至公元5874897年 |
TIME | hh:mm:ss | 00:00:00 至 24:00:00 |
TIME WITH TIME ZONE | hh:mm:ss+tz | 00:00:00+1459 至 24:00:00–1459 |
TIMESTAMP | YYYY-MM-DD hh:mm:ss | 公元前4713年至公元294276年 |
TIMESTAMP WITH TIME ZONE | YYYY-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'
);
程式碼解析:
- 豐富的日期與時間型別:PostgreSQL 支援多種日期與時間相關的資料型別,能夠滿足複雜的時間儲存需求。
- 時區支援:可以儲存帶有時區資訊的時間資料,便於進行跨時區的時間運算。
SQL Server 中的日期與時間資料型別
SQL Server 提供多種日期與時間相關的資料型別,包括 DATE、TIME、SMALLDATETIME、DATETIME、DATETIME2 和 DATETIMEOFFSET。
| 資料型別 | 格式 | 範圍 |
|---|---|---|
DATE | YYYY-MM-DD | 0001-01-01 至 9999-12-31 |
TIME | hh:mm:ss.nnnnnnn | 00:00:00.0000000 至 23:59:59.9999999 |
SMALLDATETIME | YYYY-MM-DD hh:mm:ss | 日期:1900-01-01 至 2079-06-06;時間:00:00:00 至 23:59:59 |
DATETIME | YYYY-MM-DD hh:mm:ss.nnn | 日期:1753-01-01 至 9999-12-31;時間:00:00:00 至 23:59:59.997 |
DATETIME2 | YYYY-MM-DD hh:mm:ss.nnnnnnn | 日期:0001-01-01 至 9999-12-31;時間:00:00:00 至 23:59:59.9999999 |
DATETIMEOFFSET | YYYY-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'
);
程式碼解析:
- 多樣化的日期與時間支援:SQL Server 提供多種精確度和範圍不同的日期與時間資料型別,以滿足不同的應用需求。
- 時區偏移支援:使用
DATETIMEOFFSET可儲存帶有時區偏移的時間資訊。
SQLite 中的日期與時間處理
SQLite 本身並未提供特定的日期與時間資料型別,而是透過 TEXT、REAL 和 INTEGER 這三種型別來儲存日期和時間。
| 資料型別 | 描述 |
|---|---|
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')
);
程式碼解析:
- 多種儲存方式:SQLite 提供多種方式來儲存日期和時間,開發者可根據需求選擇適合的儲存方式。
- 使用內建函式:使用如
julianday()和strftime()等函式進行日期和時間的轉換和運算。