字節與字符在java中與在mysql中整理

java

機器只知道字節,而字符卻是語義上的單位,它是有編碼的,一個字符可能編碼成1個2個甚至3個4個字節。這跟字符集編碼有關係,英文字母和數字是單字節,但漢字這些自然語言中的字符是多字節的。一個字節只能表示255個字符,不可能用於全球那麼多種自然語言的處理,因此肯定需要多字節的存儲方式。那麼在文件的輸入輸出中,InputStream、OutputStream它們是處理字節流的,就是說假設所有東西都是二進制的字節;而 Reader, Writer 則是字符流,它涉及到字符集的問題;按照ANSI編碼標準,標點符號、數字、大小寫字母都佔一個字節,漢字佔2個字節。按照UNICODE標準所有字符都佔2個字節。

 

英文字母和數字:
字節數 : 1;編碼:GB2312
字節數 : 1;編碼:GBK
字節數 : 1;編碼:ISO-8859-1
字節數 : 1;編碼:UTF-8


中文漢字:
字節數 : 2;編碼:GB2312
字節數 : 2;編碼:GBK
字節數 : 1;編碼:ISO-8859-1
字節數 : 3;編碼:UTF-8

 

 

MySql 5.0 以上的版本:

1、一個漢字佔多少長度與編碼有關:

UTF-8:一個漢字 = 3個字節,英文是一個字節
GBK: 一個漢字 = 2個字節,英文是一個字節
2、varchar(n) 表示n個字符,無論漢字和英文,MySql都能存入 n 個字符,僅實際字節長度有所區別。

3、MySQL檢查長度,可用SQL語言 SELECT LENGTH(fieldname) FROM tablename 這個命令可以看到各行使用的字節數。

mysql版本5.6.32-78.0下面用實際例子來說明問題:

1. 首先創建一張臨時用表:

create TEMPORARY table medivac(
    name VARCHAR(10)
); CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

2. 插入一些數據:

INSERT INTO medivac (name) VALUES ('' at line 1
mysql> INSERT INTO medivac (name) VALUES ('a');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO medivac (name) VALUES ('哈');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO medivac (name) VALUES ('\U+1F604');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO medivac (name) VALUES ('哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈');
Query OK, 1 row affected, 1 warning (0.00 sec)

3. 查看錶中數據:

mysql> select * from medivac
    -> ;
+--------------------------------+
| name                           |
+--------------------------------+
| a                              |
| 哈                             |
| 😄                               |
| 哈哈哈哈哈哈哈哈哈哈           |
+--------------------------------+

4. 查看佔用字節數:

+--------------+
| length(name) |
+--------------+
|            1 |
|            3 |
|            4 |
|           30 |
+--------------+

mysql總結:

1. 一個varchar存漢字需要使用三個字段在utf8和utf8mb4編碼表的情況下。
2. 如果需要存儲emoji表情的需求,新表的默認編碼方式應該寫爲utf8mb4。另外提一點在最新發布的mysql8.0裏面,默認編碼方式已經是utf8mb4了。
3. 在utf8和utf8mb4中 varchar(n)這個n是字符,所見即所得,一個a是一個字符一個😄也是一個字符 不過就是a這個字符是1個字節 哈這個字符是3個字節 而😄這個字符是4個字節表示罷了

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