mysql中utf8編碼中文字符長度問題

轉自: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來檢測字符長度,這樣能做到中英文統一處理. 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章