2014-10-28 72 views
0

我知道utf8在MySQL中存儲爲固定長度爲3個字節(24位),而utf4mb4是固定的4個字節。我認爲拉丁文1是一個固定長度的1個字節 - 我的問題是MySQL ascii類型7位,並且與Latin-1相比,存在一些小的存儲空間嗎?MySQL字符串編碼存儲空間

+0

「我知道,UTF8在MySQL存儲爲一個固定長度的3個字節(24位)」從回答重複的風險,但只是要確定你明白:沒有** **,utf8是**不存儲爲固定長度的3個字節。而且我不會**在這裏講述char vs varchar,字符存儲在例如文本字段中的方式將根據特定字符的需要使用一個,兩個或三個字節。 – 2016-10-17 16:31:45

+0

@FélixGagnon-Grenier我從此知道了。 – donatJ 2017-04-05 17:31:19

+0

是的,tbh我不記得我爲什麼評論這個。這個問題在答案中已經很清楚地解釋了...... – 2017-04-05 23:26:20

回答

2

您的初始前提不正確。在VARCHAR以及*TEXT列中,utf8和utf8mb4字符只消耗每個字符的utf8表示所需的儘可能多的字節存儲量。唯一固定的多字節分配是CHAR列,因爲它們的寬度是固定的。

提示:要使用UTF-8節省空間,請使用VARCHAR而不是CHAR。否則,MySQL必須在CHAR CHARACTER SET utf8列中爲每個字符保留三個字節,因爲這是最大可能的長度。例如,MySQL必須爲CHAR(10)CHARACTER SET utf8列預留30個字節。

http://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8.html

否則,存儲UTF8和utf8mb字符時,每個字符的最大字節數是用於每個字符

使用UTF8(或utf8mb4)時

Unicode字符設置時,必須記住並非所有字符都使用相同的字節數,並且可能需要高達每個字符三(4)字節。 [強調]

http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html

沒有7比特存儲字節跨度字符集。

但是,壓縮整個表可以在較新的版本中完成,並且如果您擁有足夠的CPU,則啓用表壓縮時服務器可以實際執行得更好,如果磁盤相對較慢或服務器花費了大量時間I/O限制。

http://dev.mysql.com/doc/refman/5.6/en/innodb-compression.html

+0

我並不是說我們的列大小是固定的,而是一個字符的大小。我很清楚text和varchar是可變的。我所說的是,UTF8通常是1字節到4字節,但在MySQL中,UTF8字符總是3字節,以速度的名義。這就是爲什麼utf8mb4存在的原因,因爲像表情符號這樣的東西需要4個字節,並且不能在MySQL中表示utf8 – donatJ 2014-10-29 13:19:36

+1

我已經從文檔中添加了一個額外的引用 - MySQL中的utf8字符是3字節的*最大值*,但是*最小* 1個字節。你似乎在說MySQL中的utf8字符總是佔用3個字節的「固定長度」,就好像存在着爲了提高速度而故意存儲效率低下的情況,但情況並非如此。MySQL中的utf8字符在行數據中只佔用與UTF8編碼中存儲該字符所需的字節數相同的字節數(除了在'CHAR'列中,在所有字符最大時必須分配最大可消耗空間的情況下寬度)。 – 2014-10-29 16:44:25