在 SQL 語言層面,**換行符、空格、定位鍵、回車符** 統統歸類為 **「空白字元」**。解析器將連續空白字元視為單一分隔符。因此,下列兩個查詢在語意上完全等價:
-- 多行縮排 (可讀性佳)
SELECT foo
FROM bar
WHERE fap = 'qux';
-- 單行壓縮 (機器等價)
SELECT foo FROM bar WHERE fap = 'qux';
換行符僅存在於 **原始碼編排** 與 **字串資料內容** 兩個層面,不影響 SQL 執行邏輯。
唯一場景:**查找資料欄位中包含換行符的列**。
| 表示法 | 值 | 說明 |
|---|---|---|
| 二進制 | 00001010 | 單一位元組 |
| 十進制 | 10 | ASCII Line Feed (LF) |
| 十六進制 | 0A | 常用於 16 進位字串常值 |
| Char 函數 | CHAR(10) | T-SQL / 標準 SQL 可攜式寫法 |
| 逸出符號 | \n | 部分客戶端工具支援 (非標準) |
注意: Windows 風格換行為 CRLF (CHAR(13)+CHAR(10),即 0x0D0A),Unix/Linux 為 LF (CHAR(10))。跨平台資料可能混雜,查詢時建議同時涵蓋。
-- ANSI SQL:2003 標準十六進位字串常值 (X'...')
SELECT username, body
FROM comments
WHERE body LIKE '%' || X'0A' || '%';
-- 或同時檢查 CRLF
WHERE body LIKE '%' || X'0D0A' || '%'
OR body LIKE '%' || X'0A' || '%';
-- 方法 1: CHAR(10) 最通用、可讀
SELECT username, body
FROM comments
WHERE body LIKE '%' + CHAR(10) + '%';
-- 方法 2: 同時檢查 CR (CHAR(13)) 與 LF
WHERE body LIKE '%' + CHAR(13) + CHAR(10) + '%'
OR body LIKE '%' + CHAR(10) + '%';
-- 方法 3: 使用十六進位常值 (0x...)
WHERE body LIKE '%' + 0x0A + '%';
| 環境 | 換行序列 | SQL Server 讀取行為 |
|---|---|---|
| Windows (CRLF) | CHAR(13)+CHAR(10) | BULK INSERT / BCP 預期 CRLF 為列結束符 |
| Unix/Linux (LF) | CHAR(10) | 需指定 ROWTERMINATOR = '0x0A' |
| Mac OS 9 (CR) | CHAR(13) | 極少見,需 ROWTERMINATOR = '0x0D' |
CHAR(10) 或 0x0A。REPLACE 統一。ROWTERMINATOR 避免資料截斷/合併錯誤。