MySQL 獲取字符串長度及注意事項(xiàng)
MySQL 獲取字符串長度詳解
?? 核心長度函數(shù)對比
| 函數(shù) | 作用 | 示例 | 返回值 |
|---|---|---|---|
LENGTH() | 字節(jié)數(shù) | LENGTH('中國') | 6 (UTF8) |
CHAR_LENGTH() | 字符數(shù) | CHAR_LENGTH('中國') | 2 |
BIT_LENGTH() | 比特?cái)?shù) | BIT_LENGTH('A') | 8 |
OCTET_LENGTH() | LENGTH()別名 | OCTET_LENGTH('中國') | 6 |
?? 六大關(guān)鍵注意事項(xiàng)
1. 字符編碼決定字節(jié)長度
-- 查看數(shù)據(jù)庫編碼 SHOW VARIABLES LIKE 'character_set%'; -- 不同編碼下的長度差異 SET @str = '中國'; 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ù)庫'), -- 9 (3字×3字節(jié))
CHAR_LENGTH('數(shù)據(jù)庫'); -- 3
-- Emoji字符(UTF8MB4)
SELECT
LENGTH('??'), -- 4 (UTF8MB4)
CHAR_LENGTH('??'); -- 14. 空格和特殊字符
SELECT
LENGTH(' '), -- 2 (空格)
LENGTH('\t'), -- 1 (制表符)
CHAR_LENGTH(' '); -- 15. 數(shù)值類型的隱式轉(zhuǎn)換
SELECT LENGTH(12345), -- 5 (轉(zhuǎn)為字符串'12345') CHAR_LENGTH(100.00);-- 6 (轉(zhuǎn)為'100.00')
6. 二進(jìn)制數(shù)據(jù)長度
SELECT LENGTH(BINARY 'abc'), -- 3 LENGTH(X'41'); -- 1 (十六進(jìn)制'A')
?? 高級應(yīng)用場景
1. 驗(yàn)證輸入長度限制
-- 用戶名長度驗(yàn)證(6-20字符) SELECT * FROM users WHERE CHAR_LENGTH(username) BETWEEN 6 AND 20;
2. 檢測多字節(jié)字符存在
-- 查找包含中文的記錄 SELECT * FROM products WHERE LENGTH(product_name) != CHAR_LENGTH(product_name);
3. 優(yōu)化存儲空間
-- 計(jì)算平均名稱長度(按字節(jié)) SELECT AVG(LENGTH(name)) AS avg_byte_length FROM customers; -- 按字符長度分組統(tǒng)計(jì) SELECT CHAR_LENGTH(title) AS title_length, COUNT(*) AS count FROM articles GROUP BY title_length;
4. 截?cái)喑L字符串
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)); -- 按字符長度過濾優(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. 避免全表掃描
-- 低效查詢(無法使用索引) SELECT * FROM logs WHERE LENGTH(message) > 1000; -- 優(yōu)化方案:存儲計(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ù)行為對比表
| 輸入值 | LENGTH() | CHAR_LENGTH() | 說明 |
|---|---|---|---|
'abc' | 3 | 3 | 英文相同 |
'中國' | 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() - 存儲優(yōu)化 →
LENGTH()
- 顯示用途 →
多語言系統(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>:
-- 確保不超過字段限制 INSERT INTO users (username) VALUES (SUBSTRING(input_name, 1, 20));
性能關(guān)鍵點(diǎn):
- 避免在 WHERE 子句中直接使用長度函數(shù)
- 對頻繁查詢的長度值使用物化列
- 為長文本字段添加前綴索引
到此這篇關(guān)于MySQL 獲取字符串長度詳解的文章就介紹到這了,更多相關(guān)mysql字符串長度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于數(shù)據(jù)庫中保留小數(shù)位的問題
本篇文章是對關(guān)于在數(shù)據(jù)庫中保留小數(shù)位的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
MySQL數(shù)據(jù)庫配置信息查看與修改方法詳解
我們通常把在項(xiàng)目中使用的常量收集在一個(gè)文件,這個(gè)文件就是配置文件,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫配置信息查看與修改的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
一文詳解MySQL單表存多大的數(shù)據(jù)量比較合適
MySQL單表的數(shù)據(jù)量上限主要受存儲引擎和文件系統(tǒng)限制,理論值可達(dá)數(shù)千萬至數(shù)十億行,但實(shí)際建議控制在千萬級以內(nèi)以保證性能,這篇文章主要介紹了MySQL單表存多大的數(shù)據(jù)量比較合適的相關(guān)資料,需要的朋友可以參考下2026-02-02
MySQL觸發(fā)器實(shí)現(xiàn)兩表數(shù)據(jù)同步的代碼詳解
在數(shù)據(jù)庫應(yīng)用中,我們經(jīng)常需要對數(shù)據(jù)進(jìn)行某些操作,并在操作完成后進(jìn)行相應(yīng)的處理,這時(shí)候,可以使用觸發(fā)器來實(shí)現(xiàn)這些功能,MySQL提供了強(qiáng)大的觸發(fā)器功能,本文將給大家詳細(xì)介紹MySQL觸發(fā)器實(shí)現(xiàn)兩表數(shù)據(jù)同步,需要的朋友可以參考下2023-12-12
MySQL 橫向衍生表(Lateral Derived Tables)的實(shí)現(xiàn)
橫向衍生表適用于在需要通過子查詢獲取中間結(jié)果集的場景,相對于普通衍生表,橫向衍生表可以引用在其之前出現(xiàn)過的表名,本文就來介紹一下MySQL 橫向衍生表(Lateral Derived Tables)的實(shí)現(xiàn),感興趣的可以了解一下2025-06-06

