SELECT LENGTH('abcdefg'), LENGTH('中文'); -- 7, 6 (utf8mb4 中文 3 字節)
SELECT CHAR_LENGTH('abcdefg'), CHAR_LENGTH('中文'); -- 7, 2 (字符數)
SELECT BIT_LENGTH('abc'); -- 21 (位數)
| 函數 | 語法 | 示例 | 結果 |
|---|---|---|---|
| LPAD | LPAD(str, len, padstr) | LPAD('42', 5, '0') | '00042' |
| RPAD | RPAD(str, len, padstr) | RPAD('42', 5, '0') | '42000' |
| LTRIM | LTRIM(str) | LTRIM(' abc') | 'abc' |
| RTRIM | RTRIM(str) | RTRIM('abc ') | 'abc' |
| TRIM | TRIM([[BOTH|LEADING|TRAILING] remstr FROM] str) | TRIM(' abc ') TRIM(LEADING '!' FROM '!!!abc!!!') |
'abc' 'abc!!!' |
| 函數 | 語法 | 說明 | 示例 |
|---|---|---|---|
| LEFT | LEFT(str, len) | 左側起 len 字符 | LEFT('abcdef', 3) → 'abc' |
| RIGHT | RIGHT(str, len) | 右側起 len 字符 | RIGHT('abcdef', 3) → 'def' |
| SUBSTRING SUBSTR |
SUBSTRING(str, pos, len) SUBSTRING(str FROM pos FOR len) |
位置從 1 起算,可負數(倒數) | SUBSTRING('abcdef', 2, 3) → 'bcd' SUBSTRING('abcdef', -3, 2) → 'de' |
| MID | MID(str, pos, len) | SUBSTRING 同義詞 | 同上 |
SELECT CONCAT('a','b','c'); -- 'abc',任一參數 NULL → 結果 NULL
SELECT CONCAT_WS(',', 'a', 'b', 'c'); -- 'a,b,c',忽略 NULL 參數
| 函數 | 語法 | 返回值 | 示例 |
|---|---|---|---|
| LOCATE | LOCATE(substr, str, [pos]) | 首次出現位置(1-based),未找到 0 | LOCATE('b', 'abcabc') → 2 |
| POSITION | POSITION(substr IN str) | 同 LOCATE,標準 SQL | POSITION('b' IN 'abc') → 2 |
| INSTR | INSTR(str, substr) | 同 LOCATE,參數順序相反 | INSTR('abcabc', 'b') → 2 |
| FIND_IN_SET | FIND_IN_SET(str, strlist) | 在逗號分隔列表中位置(1-based) | FIND_IN_SET('b', 'a,b,c') → 2 |
| STRCMP | STRCMP(str1, str2) | 0 相等,1 str1>str2,-1 str1| STRCMP('a','b') → -1 |
|
-- REPLACE:全量替換
SELECT REPLACE('I love MySQL', 'MySQL', 'MariaDB'); -- 'I love MariaDB'
-- INSERT:指定位置長度替換(非 DML INSERT)
SELECT INSERT('abcdef', 2, 3, 'XYZ'); -- 'aXYZef' (位置2起3字符替換為XYZ)
SELECT REPEAT('ab', 3); -- 'ababab'
SELECT REVERSE('abcdef'); -- 'fedcba'
SELECT UPPER('abc'), LOWER('ABC');
SELECT UCASE('abc'), LCASE('ABC'); -- 同義詞
| 函數 | 用途 | 示例 |
|---|---|---|
| ASCII | 首字符 ASCII 碼 | ASCII('A') → 65 |
| ORD | 首字符編碼(多字節支援) | ORD('中') → 20013 (UTF-8 編碼點) |
| CHAR | 碼點轉字符 | CHAR(65, 66) → 'AB' |
| CONV | 進制轉換 | CONV(15, 10, 16) → 'F' |
| BIN | 十進制轉二進制字符串 | BIN(12) → '1100' |
| OCT | 十進制轉八進制 | OCT(12) → '14' |
| HEX | 十進制/字符串轉十六進制 | HEX(255) → 'FF' HEX('abc') → '616263' |
| UNHEX | 十六進制轉二進制字符串 | UNHEX('616263') → 'abc' |
-- 利用 SUBSTRING_INDEX
SET @csv = 'a,b,c,d,e';
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@csv, ',', 3), ',', -1); -- 第 3 項 'c'
-- 通用函數(MySQL 8.0+ 可用 JSON_TABLE 更優雅)
SELECT TRIM(REPLACE(REPLACE(col, CHAR(13), ''), CHAR(10), '')) FROM t; -- 除換行
SELECT REGEXP_REPLACE(col, '\\s+', ' ') FROM t; -- 8.0+ 正則替換多空格為單空格
-- 手機號中間 4 位掩碼
SELECT CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) FROM users;
-- 身份證前 6 後 4 顯示
SELECT CONCAT(LEFT(id_card, 6), REPEAT('*', 8), RIGHT(id_card, 4)) FROM users;
LENGTH/CHAR_LENGTH 在 WHERE 條件中會導致全表掃描,**避免** WHERE LENGTH(name) > 10,改用應用層校驗或函數索引(8.0+ CREATE INDEX idx_name_len ON t ((CHAR_LENGTH(name))))。CONCAT 大量拼接產生臨時對象,批量導出考慮 GROUP_CONCAT 或應用層組裝。FIND_IN_SET、REGEXP 無法使用索引,大表慎用。REGEXP_REPLACE、REGEXP_SUBSTR、REGEXP_INSTR(ICU 正則)。utf8mb4 下 CHAR_LENGTH = 字符數,LENGTH = 字節數(中文 3-4 字節)。STRCMP 不區分大小寫(依校對規則),需區分大小寫用 STRCMP(BINARY str1, BINARY str2) 或 str1 COLLATE utf8mb4_bin = str2。