MySQL VARCHAR(n) 長度單位為「字符」,非位元組。UTF-8 編碼下,一個漢字佔 3 位元組,但算 1 個字符。PHP strlen() 返回位元組數,導致誤判。
<?php
$str = "你好啊!!"; // 5 個字符
echo strlen($str); // 輸出 11 (3*3 + 2*1),誤以為超過 VARCHAR(10)
?>
<?php
$str = "你好啊!!";
echo iconv_strlen($str, 'UTF-8'); // 輸出 5,正確
// 判斷是否超過 VARCHAR(10)
$maxLen = 10;
if (iconv_strlen($str, 'UTF-8') > $maxLen) {
echo "超過長度限制";
} else {
echo "長度合法";
}
?>
第二參數必須指定當前字符集('UTF-8'、'GB2312'、'BIG-5' 等),函數會按該編碼規則計算字符數。GB2312 下漢字佔 2 位元組,但 iconv_strlen 仍返回字符數(1)。
<?php
// 需啟用 mbstring 擴展
echo mb_strlen($str, 'UTF-8'); // 同樣輸出 5
// 設定預設編碼,後續可省略第二參數
mb_internal_encoding('UTF-8');
echo mb_strlen($str); // 5
?>
char_len($str) 內部調用 mb_strlen 或 iconv_strlen,業務代碼統一調用。str.length 即字符數),減少後端壓力。