轉自:http://www.oicto.com/mysql-utf8-length-char-varchar/
只適用mysql5.0以上的版本:
1.一個漢字佔多少長度與編碼有關:
UTF-8:一個漢字=3個字節
GBK:一個漢字=2個字節
2.varchar(n)表示n個字符,無論漢字和英文,Mysql都能存入n個字符,僅是實際字節長度有所區別
3.MySQL檢查長度,可用SQL語言:
select LENGTH(fieldname) from tablename 來查看
=========華麗麗分隔線,轉載如下:==========
涉及到了字符長度問題,搜索了一下,幾乎千篇一律, 所以決定自己測試一下,徹底弄清楚字符長度問題.
編碼一律爲 UTF-8 編碼 :
先來測試一下 php 把一個漢字認作幾個字節:
<?php
header(‘Content-Type:text/html;charset=UTF-8′);
$str=’我’;
echo strlen($str);
?>
輸出 3 , 證明在 UTF-8編碼下, 一個漢字被認作3個字節長度.
而如果我們用 php 多字節擴展函數 mb_strlen($str,’utf8′); 這個時候輸出 1
下面來測試一下 mysql char 和 varchar 字節長度.
創建一個數據庫 (txt) :
CREATE DATABASE IF NOT EXISTS txt DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
創建一個表 (test) :
create table test(txt_char char(2) null, txt_varchar varchar(2) null ) ENGINE=MyISAM
確認一下我們表的字符集: 確實是UTF8編碼的.
插入兩條記錄:
INSERT INTO test(txt_char,txt_varchar) VALUES (‘abcdef’,'uvwxyz’) , (‘我是中國人’,'北京歡迎你’) ;
看看插入結果:
在看看查詢結果:
證明 mysql 並不會對超過長度的字符報錯,而是直接截斷了.
並且 char(2) 和 varchar(2) 都能存儲 2個漢字,或者是兩個英文字符.
證明 mysql 的 char(n) 可以直接存儲 n 個漢字. 而不是 n/3 個
mysql 屏蔽了具體的存儲細節,而直接以實際字符的個數來決定 char存儲的個數.
這裏只是測試在UTF8編碼下的,如果是GBK編碼,可能不一樣,沒興趣去測試那麼多了.
下面看看終端輸出:
看看 mysql 檢測字符長度: length 和 char_length 輸出:
LENGTH 輸出的結果是 字符實際長度的!
而 CHAR_LENGTH輸出的則是屏蔽了字符存儲細節,是實際的字符個數!
總結一下:
在涉及中文環境下的php+mysql組合,最好是用 mb_strlen來檢測字符長度, 而在mysql 中,使用 CHAR_LENGTH來檢測字符長度,這樣能做到中英文統一處理.