2010-12-12 51 views
44

根據MySQL,text列保存65,535字節。多少UTF-8文本適合MySQL的「文本」字段?

因此,如果這是一個合法的邊界,那麼它實際上只適合大約32k UTF-8字符,對吧?或者,這種「模糊」邊界之一是寫文檔的人不能從字節中指出字符,如果設置爲utf8_general_ci之類的東西,它實際上會允許〜64k UTF-8字符?

+5

簡短回答你的眼睛:這麼多---> http://pastebin.com/eYUPppw6(21844 3字節UTF-8字符) – Sharky 2014-09-19 10:53:01

回答

70

A text列可以達到65,535字節。

一個utf-8字符最多可以有3個字節。

所以......你的實際限制可以是21,844個字符。

詳情參見該手冊:http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html

的可變長度的字符串。 M代表 最大列長度爲 個字符。 M的範圍是0到 65,535。 VARCHAR的有效最大長度爲 受限於行大小的最大值(65,535字節,即所有列之間共享的 )以及使用的 字符集。例如,utf8 字符每個字符最多可能需要三個 字節,因此使用utf8字符集 的VARCHAR 列可以聲明爲最大值爲21,844個字符。

+6

4字節,而不是3:http://en.wikipedia.org/wiki/Utf-8 – 2010-12-12 02:54:25

+2

一旦所有的河外字符集都添加到Unicode中,utf-8 char可以達到4個字節,並且最終可以是5或更多。^) – 2010-12-12 02:55:46

+0

您從哪裏得到這個「最多3個字節「數字?編碼點的UTF-8編碼可以使用1到4個字節的任何地方。 – Thanatos 2010-12-12 02:57:54

11

UTF-8字符每個最多可以佔用4個字節,而不是像您所假設的那樣佔用2個字節。 UTF-8 is a variable-width encoding,取決於顯著位的Unicode代碼點的數目:

  • 7位和下在Unicode代碼點:1個字節在UTF-8
  • 8至11位:2個字節在UTF- 8
  • 12〜16位:3個字節
  • 17〜21位:4個字節

original UTF-8 spec允許編碼最多31位的Unicode值,以多達6個字節在UTF-編碼8表格。在UTF-8成爲流行之後,Unicode聯盟宣佈他們將永遠不會使用超出2 的代碼點,並且 - 1。這現在標準化爲RFC 3629

MySQL currently(即版本5.6)僅支持Unicode Basic Multilingual Plane字符,UTF-8每個字符最多需要3個字節。這意味着您的問題的當前答案是您的TEXT字段可以保存至少21,844個字符。

取決於你如何看待它,實際限制是高於或低於:

  • 如果你認爲,像我一樣,將BMP限制,最終將在MySQL或提升的一個itsforks,如果您的MySQL客戶端允許任意Unicode文本輸入,則不應指望能夠在該字段中存儲超過16,383個字符。

  • 另一方面,您可能能夠利用UTF-8是可變寬度編碼這一事實。如果你知道你的文本大部分是純英文的,偶爾還有非ASCII字符,那麼你的有效練習內容限制可以達到最大64&KB;   1字符限制。

+0

「只能假定該字段最多可以容納16K字符*的UTF-8文本。」 ←我澄清說... – Thanatos 2010-12-12 02:59:07

+0

固定。謝謝,Thanatos。 – 2010-12-12 04:33:58

1

然而,如主鍵使用時,MySQL假設該列的大小的每個限制增加了3字節到密鑰。

mysql> alter table test2 modify code varchar(333) character set utf8; 
Query OK, 0 rows affected (0.05 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> alter table test2 modify code varchar(334) character set utf8; 
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes 

好,使用長字符串列作爲主鍵通常是一張牀,但實際上我已經跨過問題,一個商業(!)產品的數據庫時就來了。