首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL LENGTH 與 CHAR_LENGTH 函數差異詳解:字節長度 vs 字符長度

     編輯:MySQL 綜合教學

MySQL 提供兩個字符串長度函數:LENGTH() 返回字節數,CHAR_LENGTH()(同 CHARACTER_LENGTH())返回字符數。在多字節字符集(utf8mb4、gbk)下,兩者差異巨大,誤用會導致截斷、校驗、排序邏輯錯誤。

一、 核心差異對照

函數統計單位英文/數字中文(utf8mb4)中文(gbk)Emoji (😀)
LENGTH()字節13~424
CHAR_LENGTH()字符1111

二、 典型應用場景與示例

1. 校驗用戶輸入長度(按字符數)

-- 要求用戶名 6~20 字符
SELECT * FROM `user` WHERE CHAR_LENGTH(`username`) BETWEEN 6 AND 20;

2. 計算存儲空間佔用(按字節數)

-- 估算表數據大小
SELECT 
  SUM(LENGTH(`title`)) AS title_bytes,
  SUM(LENGTH(`content`)) AS content_bytes
FROM `article`;

3. 截取定長摘要(避免半個中文字符)

-- 取前 100 字符作摘要
SELECT LEFT(`content`, 100) AS summary FROM `article`;
-- 若需按字節截取(如導出固定寬度文件)
SELECT LEFT(`content`, 200) AS summary_bytes FROM `article`; -- 視編碼調整

4. 排序:找出標題最長的 10 篇文章

-- 按字符數排序(業務語義)
SELECT id, title FROM article ORDER BY CHAR_LENGTH(title) DESC LIMIT 10;
-- 按字節數排序(存儲分析)
SELECT id, title FROM article ORDER BY LENGTH(title) DESC LIMIT 10;

三、 避坑指南

  1. 表單驗證、業務規則一律用 CHAR_LENGTH:用戶感知的是字符數,而非字節數。
  2. 字段定義長度單位是字符:VARCHAR(100) 允許 100 個字符,實際字節上限取決於字符集(utf8mb4 為 400 字節)。
  3. LENGTH(NULL) 返回 NULL:需配合 IFNULL 或 COALESCE 處理。
  4. 二進制字符串(BLOB/二進制排序規則):CHAR_LENGTH 同樣返回字符數,但字符定義為字節,等同於 LENGTH。

四、 快速驗證腳本

SET @str = '中文abc😀';
SELECT 
  @str AS original,
  LENGTH(@str) AS byte_len,
  CHAR_LENGTH(@str) AS char_len,
  HEX(@str) AS hex_bytes;

輸出將直觀展示每類字符的字節佔用,建議收藏備查。

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