BLOB
是一種二進位大型物件,可以保存可變數量的資料。四種 BLOB
類型是 TINYBLOB
、BLOB
、MEDIUMBLOB
和 LONGBLOB
。它們之間的差異僅在於它們可以保存的值的最大長度。四種 TEXT
類型是 TINYTEXT
、TEXT
、MEDIUMTEXT
和 LONGTEXT
。它們對應於四種 BLOB
類型,並具有相同的最大長度和儲存需求。請參閱 章節 13.7,「資料類型儲存需求」。
BLOB
值被視為二進位字串(位元組字串)。它們具有 binary
字元集和校對,並且比較和排序是基於欄值中位元組的數值。TEXT
值被視為非二進位字串(字元字串)。它們具有 binary
以外的字元集,並且值會根據字元集的校對進行排序和比較。
如果未啟用嚴格 SQL 模式,並且您將值指派給超過欄最大長度的 BLOB
或 TEXT
欄,則該值會被截斷以符合欄長度,並產生警告。對於截斷非空格字元,您可以透過使用嚴格 SQL 模式來產生錯誤(而不是警告)並抑制值的插入。請參閱 章節 7.1.11,「伺服器 SQL 模式」。
從要插入 TEXT
欄的值中截斷多餘的尾隨空格,無論 SQL 模式為何,都會產生警告。
對於 TEXT
和 BLOB
欄,在插入時沒有填補,並且在選取時不會剝除位元組。
如果索引了 TEXT
欄,則索引項目的比較會在結尾處進行空格填補。這表示,如果索引需要唯一值,則對於僅在尾隨空格數量上不同的值,會發生重複鍵錯誤。例如,如果表格包含 'a'
,則嘗試儲存 'a '
會導致重複鍵錯誤。對於 BLOB
欄,情況並非如此。
在大多數方面,您可以將 BLOB
欄視為您可以需要的任意大小的 VARBINARY
欄。同樣地,您可以將 TEXT
欄視為 VARCHAR
欄。BLOB
和 TEXT
在以下方面與 VARBINARY
和 VARCHAR
不同
對於
BLOB
和TEXT
欄上的索引,您必須指定索引前綴長度。對於CHAR
和VARCHAR
,前綴長度是選用的。請參閱 章節 10.3.5,「欄索引」。
如果您將 BINARY
屬性與 TEXT
資料類型一起使用,則該欄會被指派該欄字元集的二進位 (_bin
) 校對。
LONG
和 LONG VARCHAR
會對應到 MEDIUMTEXT
資料類型。這是一個相容性功能。
MySQL Connector/ODBC 將 BLOB
值定義為 LONGVARBINARY
,將 TEXT
值定義為 LONGVARCHAR
。
由於 BLOB
和 TEXT
值可能非常長,因此在使用它們時可能會遇到一些限制
排序時僅使用欄的前
max_sort_length
個位元組。max_sort_length
的預設值為 1024。您可以透過在伺服器啟動或執行時增加max_sort_length
的值,使更多位元組在排序或分組中顯著。任何用戶端都可以變更其連線max_sort_length
變數的值mysql> SET max_sort_length = 2000; mysql> SELECT id, comment FROM t -> ORDER BY comment;
在查詢結果中使用暫存表格處理
BLOB
或TEXT
欄的實例會導致伺服器在磁碟上使用表格而不是在記憶體中使用,因為MEMORY
儲存引擎不支援這些資料類型(請參閱 章節 10.4.4,「MySQL 中內部暫存表格的使用」)。使用磁碟會產生效能損失,因此僅在真正需要時才在查詢結果中包含BLOB
或TEXT
欄。例如,避免使用SELECT *
,它會選取所有欄。BLOB
或TEXT
物件的最大大小由其類型決定,但是您實際可以在用戶端和伺服器之間傳輸的最大值取決於可用記憶體的數量和通訊緩衝區的大小。您可以透過變更max_allowed_packet
變數的值來變更訊息緩衝區大小,但是您必須對伺服器和您的用戶端程式執行此操作。例如,mysql 和 mysqldump 都允許您變更用戶端max_allowed_packet
值。請參閱 章節 7.1.1,「設定伺服器」、章節 6.5.1,「mysql — MySQL 命令列用戶端」 和 章節 6.5.4,「mysqldump — 資料庫備份程式」。您可能還想比較封包大小和您正在儲存的資料物件的大小與儲存需求,請參閱 章節 13.7,「資料類型儲存需求」
每個 BLOB
或 TEXT
值在內部都以單獨配置的物件表示。這與所有其他資料類型形成對比,後者在表格開啟時為每個欄分配一次儲存空間。
在某些情況下,可能需要將二進制資料(例如媒體檔案)儲存在 BLOB
或 TEXT
欄位中。您可能會發現 MySQL 的字串處理函式對於處理這類資料很有用。請參閱第 14.8 節,「字串函式和運算符」。出於安全和其他考量,通常最好使用應用程式碼來執行此操作,而不是授予應用程式使用者 FILE
權限。您可以在 MySQL 論壇中討論各種語言和平台的具體細節 (http://forums.mysql.com/)。
在 mysql 用戶端中,二進制字串會以十六進制表示法顯示,具體取決於 --binary-as-hex
的值。有關該選項的更多資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」。