MySQL 獲取字符串長(zhǎng)度及注意事項(xiàng)
MySQL 獲取字符串長(zhǎng)度詳解
?? 核心長(zhǎng)度函數(shù)對(duì)比
函數(shù) | 作用 | 示例 | 返回值 |
---|---|---|---|
LENGTH() | 字節(jié)數(shù) | LENGTH('中國(guó)') | 6 (UTF8) |
CHAR_LENGTH() | 字符數(shù) | CHAR_LENGTH('中國(guó)') | 2 |
BIT_LENGTH() | 比特?cái)?shù) | BIT_LENGTH('A') | 8 |
OCTET_LENGTH() | LENGTH() 別名 | OCTET_LENGTH('中國(guó)') | 6 |
?? 六大關(guān)鍵注意事項(xiàng)
1. 字符編碼決定字節(jié)長(zhǎng)度
-- 查看數(shù)據(jù)庫(kù)編碼 SHOW VARIABLES LIKE 'character_set%'; -- 不同編碼下的長(zhǎng)度差異 SET @str = '中國(guó)'; SELECT LENGTH(@str), -- 6 (UTF8) LENGTH(CONVERT(@str USING latin1)); -- 2 (latin1)
2. NULL 值的特殊處理
SELECT LENGTH(NULL), -- NULL CHAR_LENGTH(NULL); -- NULL
3. 多字節(jié)字符陷阱
-- 中文字符(UTF8) SELECT LENGTH('數(shù)據(jù)庫(kù)'), -- 9 (3字×3字節(jié)) CHAR_LENGTH('數(shù)據(jù)庫(kù)'); -- 3 -- Emoji字符(UTF8MB4) SELECT LENGTH('??'), -- 4 (UTF8MB4) CHAR_LENGTH('??'); -- 1
4. 空格和特殊字符
SELECT LENGTH(' '), -- 2 (空格) LENGTH('\t'), -- 1 (制表符) CHAR_LENGTH(' '); -- 1
5. 數(shù)值類(lèi)型的隱式轉(zhuǎn)換
SELECT LENGTH(12345), -- 5 (轉(zhuǎn)為字符串'12345') CHAR_LENGTH(100.00);-- 6 (轉(zhuǎn)為'100.00')
6. 二進(jìn)制數(shù)據(jù)長(zhǎng)度
SELECT LENGTH(BINARY 'abc'), -- 3 LENGTH(X'41'); -- 1 (十六進(jìn)制'A')
?? 高級(jí)應(yīng)用場(chǎng)景
1. 驗(yàn)證輸入長(zhǎng)度限制
-- 用戶名長(zhǎng)度驗(yàn)證(6-20字符) SELECT * FROM users WHERE CHAR_LENGTH(username) BETWEEN 6 AND 20;
2. 檢測(cè)多字節(jié)字符存在
-- 查找包含中文的記錄 SELECT * FROM products WHERE LENGTH(product_name) != CHAR_LENGTH(product_name);
3. 優(yōu)化存儲(chǔ)空間
-- 計(jì)算平均名稱(chēng)長(zhǎng)度(按字節(jié)) SELECT AVG(LENGTH(name)) AS avg_byte_length FROM customers; -- 按字符長(zhǎng)度分組統(tǒng)計(jì) SELECT CHAR_LENGTH(title) AS title_length, COUNT(*) AS count FROM articles GROUP BY title_length;
4. 截?cái)喑L(zhǎng)字符串
SET @long_text = 'This is a very long text...'; -- 安全截取前100字符 SELECT IF(CHAR_LENGTH(@long_text) > 100, CONCAT(SUBSTRING(@long_text, 1, 97), '...'), @long_text) AS truncated_text;
?? 性能優(yōu)化指南
1. 索引使用原則
-- 前綴索引創(chuàng)建(按字節(jié)) ALTER TABLE products ADD INDEX idx_name (name(20)); -- 按字符長(zhǎng)度過(guò)濾優(yōu)化 SELECT * FROM products WHERE CHAR_LENGTH(name) > 10; -- 全表掃描 -- 優(yōu)化方案:添加虛擬列 ALTER TABLE products ADD COLUMN name_char_len TINYINT AS (CHAR_LENGTH(name)) VIRTUAL, ADD INDEX idx_name_len (name_char_len);
2. 避免全表掃描
-- 低效查詢(無(wú)法使用索引) SELECT * FROM logs WHERE LENGTH(message) > 1000; -- 優(yōu)化方案:存儲(chǔ)計(jì)算值 ALTER TABLE logs ADD COLUMN msg_length SMALLINT AS (LENGTH(message)) STORED, ADD INDEX idx_msg_len (msg_length);
3. 內(nèi)存配置優(yōu)化
-- 增大排序緩沖區(qū) SET sort_buffer_size = 8*1024*1024; -- 查看當(dāng)前配置 SHOW VARIABLES LIKE 'sort_buffer_size';
?? 函數(shù)行為對(duì)比表
輸入值 | LENGTH() | CHAR_LENGTH() | 說(shuō)明 |
---|---|---|---|
'abc' | 3 | 3 | 英文相同 |
'中國(guó)' | 6 | 2 | 中文差異 |
'??' | 4 | 1 | Emoji差異 |
NULL | NULL | NULL | 空值 |
123 | 3 | 3 | 數(shù)字轉(zhuǎn)換 |
'' | 0 | 0 | 空字符串 |
' ' | 1 | 1 | 空格 |
?? 最佳實(shí)踐總結(jié)
字符數(shù) vs 字節(jié)數(shù):
- 顯示用途 →
CHAR_LENGTH()
- 存儲(chǔ)優(yōu)化 →
LENGTH()
- 顯示用途 →
多語(yǔ)言系統(tǒng):
-- 始終指定字符集 SELECT CHAR_LENGTH(_utf8mb4 '???????????'); -- 1 (家庭emoji)
列設(shè)計(jì)建議:
CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(20) CHARACTER SET utf8mb4, -- 按字符限制 bio TEXT );
安全截?cái)?/strong>:
-- 確保不超過(guò)字段限制 INSERT INTO users (username) VALUES (SUBSTRING(input_name, 1, 20));
性能關(guān)鍵點(diǎn):
- 避免在 WHERE 子句中直接使用長(zhǎng)度函數(shù)
- 對(duì)頻繁查詢的長(zhǎng)度值使用物化列
- 為長(zhǎng)文本字段添加前綴索引
到此這篇關(guān)于MySQL 獲取字符串長(zhǎng)度詳解的文章就介紹到這了,更多相關(guān)mysql字符串長(zhǎng)度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL修改表結(jié)構(gòu)操作命令總結(jié)
這篇文章主要介紹了MySQL修改表結(jié)構(gòu)操作命令總結(jié),包含如刪除列、添加列、修改列、添加主鍵、刪除主鍵、添加唯一索引、添加普通索引等內(nèi)容,需要的朋友可以參考下2014-12-12MySQL order by實(shí)現(xiàn)原理分析和Filesort優(yōu)化方式
這篇文章主要介紹了MySQL order by實(shí)現(xiàn)原理分析和Filesort優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12MySql中把一個(gè)表的數(shù)據(jù)插入到另一個(gè)表中的實(shí)現(xiàn)代碼
本篇文章是對(duì)MySql中把一個(gè)表的數(shù)據(jù)插入到另一個(gè)表中的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05