『壹』 資料庫中一個漢字占幾個字元
如果你說的「字元」就是指 Java 中的 char,那好,那它就是 16 位,2 位元組。
如果你說的「字元」是指我們用眼睛看到的那些「抽象的字元」,那麼,談論它占幾個位元組是沒有意義的。具體嫌知地講,脫離具體的編碼談某個字元占幾個位元組是沒有意義的。
就好比有一個抽象的整數「42」,你說它占幾個位元組?這得具體看你是用 byte,short,int,還是 long 來存它。
用 byte 存就佔一位元組,用 short 存就占兩位元組,int 通常是四位元組,long 通常八位元組。
當然,如果你用 byte,受限於它有限的位數,有些數它是存不了的,比如 256 就無法放在一個 byte 里了。
字元是同樣的道理,如果你想談「占幾個位元組」,就要先把編碼說清楚。同一個字桐斗符在不同的編碼下可能占不同的位元組。
就以你舉的「字」字為例,「字」在 GBK 編碼下占 2 位元組,在 UTF-16 編碼下也占 2 位元組,在 UTF-8 編碼下占 3 位元組,在 UTF-32 編碼下占 4 位元組。不同的字元在同一個編碼下也可能占不同的位元組。
「字」在 UTF-8 編碼下佔3位元組,而「A」在 UTF-8 編碼下占 1 位元組。(因為 UTF-8 是變長編碼),而 Java 中的 char 本質上是 UTF-16 編碼。而 UTF-16 實際上也是一個變長編碼(2 位元組或 4位元組)。
如果一個抽象的字元在 UTF-16 編碼下占 4 位元組,顯然它是不能放到 char 中的。換言之, char 中只能放 UTF-16 編碼下只佔芹輪消 2 位元組的那些字元。而 getBytes 實際是做編碼轉換,你應該顯式傳入一個參數來指定編碼,否則它會使用預設編碼來轉換。
你說「 new String("字").getBytes().length 返回的是3 」,這說明預設編碼是 UTF-8.
如果你顯式地傳入一個參數,比如這樣「 new String("字").getBytes("GBK").length 」,那麼返回就是 2。你可以在啟動 JVM 時設置一個預設編碼,假設你的類叫 Main,那麼在命令行中用 java 執行這個類時可以通過 file.encoding 參數設置一個預設編碼。
比如這樣:java -Dfile.encoding=GBK Main
這時,你再執行不帶參數的 getBytes() 方法時,new String("字").getBytes().length 返回的就是 2 了,因為現在預設編碼變成 GBK 了。
當然,如果這時你顯式地指定編碼,new String("字").getBytes("UTF-8").length 返回的則依舊是 3.
否則,會使用所在操作系統環境下的預設編碼。
通常,Windows 系統下是 GBK,Linux 和 Mac 是 UTF-8.
但有一點要注意,在 Windows 下使用 IDE 來運行時,比如 Eclipse,如果你的工程的預設編碼是 UTF-8,在 IDE 中運行你的程序時,會加上上述的 -Dfile.encoding=UTF-8 參數,這時,即便你在 Windows 下,預設編碼也是 UTF-8,而不是 GBK。
由於受啟動參數及所在操作系統環境的影響,不帶參數的 getBytes 方法通常是不建議使用的,最好是顯式地指定參數以此獲得穩定的預期行為。
『貳』 資料庫中一個漢字占幾個字元
資料庫中一個漢字佔用兩個字元,英文和數字佔用一個字元。
望採納
『叄』 mysql 資料庫varchar可以存儲多少個漢字和多少個數字
首先要確定mysql版本,一般一個漢字2個位元組,50即可存25個漢字。
4.0版本以下,varchar(100),指的是100位元組,如果存放UTF8漢字時,只能存33個(每個漢字3位元組)
5.0版本以上,varchar(100),指的是100字元,無論存放的是數字、字母還是UTF8漢字(每個漢字3位元組),都可以存放100個。
varchar特點
1、使用比固定長度類型(char)佔用更少存儲空間(除了使用ROW_FORMAT=FIXED創建的MyISAM表)。
2、使用額外的1-2位元組來存儲值長度,列長度<=255使用1位元組保存,其它情況使用2位元組保存。例如varchar(10)會佔用11位元組存儲空間,varchar(500)會佔用502位元組存儲空間。
3、節約空間,所以性能會有幫助。在更新的時候會產生額外的工作。
以上內容參考:網路-varchar