首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 中的換行符真相:空白字元處理、ASCII 值與實務查詢技巧

     編輯:關於SqlServer

核心觀念:SQL 不認得「換行符」

在 SQL 語言層面,**換行符、空格、定位鍵、回車符** 統統歸類為 **「空白字元」**。解析器將連續空白字元視為單一分隔符。因此,下列兩個查詢在語意上完全等價:

-- 多行縮排 (可讀性佳)
SELECT foo
FROM bar
WHERE fap = 'qux';

-- 單行壓縮 (機器等價)
SELECT foo FROM bar WHERE fap = 'qux';

換行符僅存在於 **原始碼編排** 與 **字串資料內容** 兩個層面,不影響 SQL 執行邏輯。

何時需要知道換行符 ASCII 值?

唯一場景:**查找資料欄位中包含換行符的列**。

表示法值說明
二進制00001010單一位元組
十進制10ASCII Line Feed (LF)
十六進制0A常用於 16 進位字串常值
Char 函數CHAR(10)T-SQL / 標準 SQL 可攜式寫法
逸出符號\n部分客戶端工具支援 (非標準)

注意: Windows 風格換行為 CRLF (CHAR(13)+CHAR(10),即 0x0D0A),Unix/Linux 為 LF (CHAR(10))。跨平台資料可能混雜,查詢時建議同時涵蓋。

標準 SQL 查詢包含換行符的資料

-- 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' || '%';

T-SQL (SQL Server) 實務寫法

-- 方法 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 + '%';

實務應用場景

  • 資料品質檢核: 發現前端未正確清理的使用者輸入 (如多行地址、備註)。
  • ETL 清洗: `REPLACE(body, CHAR(13)+CHAR(10), ' ')` 統一轉為單空格。
  • 匯出格式化: 產生固定寬度檔案時,需移除欄位內換行避免破壞記錄結構。
  • 全文檢索優化: 噪音詞表 (noise word) 通常不含換行符,但自訂斷詞器可能需處理。

延伸知識:CHAR(13) vs CHAR(10) 在不同作業系統的表現

環境換行序列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'

總結

  1. SQL 解析器忽略原始碼中的換行符,僅作為可讀性排版。
  2. 資料中換行符為 ASCII 10 (LF) 或 13+10 (CRLF),查詢用 CHAR(10) 或 0x0A。
  3. 跨平台資料建議同時檢查 LF 與 CRLF,清洗用 REPLACE 統一。
  4. 匯入匯出時正確設定 ROWTERMINATOR 避免資料截斷/合併錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved