字串處理是 SQL 開發高頻需求。MySQL 提供豐富的字串函數,涵蓋編碼轉換、長度計算、大小寫、子串擷取、比對、壓縮等。本文為系列第一部分,詳細說明 ASCII、BIN、BIT_LENGTH、CHAR、CHAR_LENGTH、COMPRESS 等核心函數語法、參數與實戰範例。
max_allowed_packet 時回傳 NULL。LENGTH() 回傳位元組數,CHAR_LENGTH() 回傳字符數。回傳字串最左字符的數值編碼(0~255)。空字串回傳 0,NULL 輸入回傳 NULL。
SELECT ASCII('2'); -- 50
SELECT ASCII('dx'); -- 100 (僅取 'd')
回傳長整數 N 的二進位字串表示,等同 CONV(N,10,2)。
SELECT BIN(12); -- '1100'
回傳字串二進位長度(位元數)。
SELECT BIT_LENGTH('text'); -- 32 (4字元 × 8位元)
將每個整數參數視為字符編碼,拼接成字串。NULL 參數被忽略。大於 255 的值自動拆分為多字符(如 CHAR(256) = CHAR(1,0))。
SELECT CHAR(77,121,83,81,76); -- 'MySQL'
SELECT CHAR(77,77.3,'77.3'); -- 'MMM' (非整數截斷)
USING 子句:指定輸出字符集,否則回傳二進位字串。
SELECT CHARSET(CHAR(0x65)); -- binary
SELECT CHARSET(CHAR(0x65 USING utf8)); -- utf8
回傳字串字符數(非位元組數)。多位元組字符集下與 LENGTH() 不同。
-- 假設雙位元組字符集,5字元
SELECT LENGTH('漢字'); -- 10
SELECT CHAR_LENGTH('漢字'); -- 5
壓縮字串,需 MySQL 編譯時連結 zlib。回傳二進位資料,格式:
空字串 → 空字串;
非空字串 → 4 位元組原始長度(Little-endian)+ 壓縮資料。
若原字串以空白結尾,自動附加 '.' 防止 CHAR/VARCHAR 截斷尾部空白(建議存入 BLOB)。
SELECT LENGTH(COMPRESS(REPEAT('a',1000))); -- 21
SELECT LENGTH(COMPRESS('')); -- 0
SELECT LENGTH(COMPRESS('a')); -- 13
SELECT LENGTH(COMPRESS(REPEAT('a',16))); -- 15
解壓請用 UNCOMPRESS()。
BLOB/VARBINARY,勿存 CHAR/VARCHAR(尾部空白截斷風險)。CHAR() 產生二進位字串,若需特定字符集請加 USING。SUBSTRING、LOCATE 等)索引從 1 起算,切勿混淆程式語言 0-based 習慣。下集將涵蓋 CONCAT、CONCAT_WS、ELT、FIELD、FIND_IN_SET、FORMAT、HEX、INSERT、INSTR、LCASE/LOWER、LEFT、LENGTH、LOAD_FILE、LOCATE、LPAD、LTRIM、MAKE_SET、MID、OCT、OCTET_LENGTH、ORD、POSITION、QUOTE、REPEAT、REPLACE、REVERSE、RIGHT、RPAD、RTRIM、SOUNDEX、SPACE、STRCMP、SUBSTRING、SUBSTRING_INDEX、TRIM、UCASE/UPPER、UNHEX 等函數。