php和mysql 字符長度總結(轉)

只適用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來檢測字符長度,這樣能作到中英文統一處理.

相關文章
相關標籤/搜索