只適用mysql5.0以上的版本:
1.一個漢字佔多少長度與編碼有關:
UTF-8:一個漢字=3個字節
GBK:一個漢字=2個字節
2.varchar(n)表示n個字符,不管漢字和英文,Mysql都能存入n個字符,僅是實際字節長度有所區別
3.MySQL檢查長度,可用SQL語言:
select LENGTH(fieldname) from tablename 來查看php
LENGTH 輸出的結果是 字符實際長度的!
而 CHAR_LENGTH輸出的則是屏蔽了字符存儲細節,是實際的字符個數!html
=========華麗麗分隔線,轉載以下:==========
涉及到了字符長度問題,搜索了一下,幾乎千篇一概, 因此決定本身測試一下,完全弄清楚字符長度問題.
編碼一概爲 UTF-8 編碼 :mysql
先來測試一下 php 把一個漢字認做幾個字節:sql
<?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編碼的.spa
插入兩條記錄:htm
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來檢測字符長度,這樣能作到中英文統一處理.