首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 字串串接操作實戰:CONCAT 函數更新欄位前綴、跨資料庫語法差異與效能考量

     編輯:MySQL 資料庫相關知識

MySQL 字串串接核心語法

MySQL 使用 CONCAT() 函數進行字串串接,而非 ||(PostgreSQL/Oracle)或 +(SQL Server)。此差異常導致跨資料庫遷移時的語法錯誤,需特別注意。

基本用法:欄位前綴更新

-- 在 aa 表 name 欄位前加上 'x'
UPDATE aa SET name = CONCAT('x', name);

-- 批次更新會員卡號前綴
UPDATE member SET card = CONCAT('00', card);

CONCAT 進階用法與變體

函數語法行為差異適用場景
CONCAT CONCAT(str1, str2, ...) 任一參數為 NULL → 結果為 NULL 確定無 NULL 值的串接
CONCAT_WS CONCAT_WS(separator, str1, str2, ...) 自動跳過 NULL 參數,用分隔符連接非 NULL 值 多欄位組合、可能含 NULL
GROUP_CONCAT GROUP_CONCAT(expr ORDER BY ... SEPARATOR ',') 聚合函數,將群組內值串成單一字串 一對多關聯查詢、標籤聚合

實戰範例

-- 1. 多欄位組合地址(跳過 NULL)
UPDATE users SET full_address = CONCAT_WS(' ', city, district, street, detail);

-- 2. 生成唯一代碼:前綴 + 零填充 ID + 隨機碼
UPDATE products SET sku = CONCAT('PRD-', LPAD(id, 8, '0'), '-', SUBSTRING(MD5(RAND()), 1, 4));

-- 3. JSON 字串組裝(MySQL 5.7+ 建議用 JSON 函數)
UPDATE settings SET config_json = CONCAT('{"theme":"', theme, '","lang":"', lang, '"}');

效能與注意事項

  • 索引失效風險:WHERE CONCAT(col1, col2) = 'value' 會導致全表掃描。改用 WHERE col1 = 'val1' AND col2 = 'val2' 或建立虛擬欄位/函數索引(8.0+)
  • 大量更新鎖表:百萬級資料更新建議分批次(LIMIT 10000)、低峰期執行、監控 Innodb_row_lock_waits
  • 字元集一致性:確保連線字元集(SET NAMES utf8mb4)、表字元集、資料實際編碼三者一致,避免串接後亂碼
  • max_allowed_packet 限制:超長字串串接可能觸發「Packet too large」錯誤,需調大該參數

跨資料庫語法對照表

資料庫串接運算子/函數NULL 處理
MySQL CONCAT() / CONCAT_WS() CONCAT 遇 NULL 回傳 NULL
PostgreSQL || / CONCAT() (9.1+) || 遇 NULL 回傳 NULL,CONCAT 忽略 NULL
Oracle || / CONCAT() (僅兩參數) || 遇 NULL 回傳 NULL
SQL Server + / CONCAT() (2012+) + 遇 NULL 回傳 NULL,CONCAT 忽略 NULL
SQLite || 遇 NULL 回傳 NULL

掌握 CONCAT 系列函數細節,能避開跨資料庫遷移陷阱,也能寫出更健壯、效能更佳的字串操作 SQL。記住:查詢條件避免對欄位使用函數,更新操作則善用 CONCAT_WS 處理潛在 NULL 值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved