2012-04-27 73 views
7

我有一個MySQL數據庫。我使用innodb。我的表格中有10個以上的列。最後一列有一個LONGTEXT類型,它應該包含html代碼。問題是,對於每條記錄,該字段不會認可完整的代碼,並且始終在相同數量的字符後停止。我嘗試插入的html文件的重量大約是60KO。所以我想我的每個記錄都超過了mysql的行大小限制(66KO)。我想知道的是,如果有一些方法來擴展這個限制。任何解決方法將不勝感激。預先感謝投入。乾杯。馬克MYSQL - 如何解決66 KBy的行大小限制

回答

1

有沒有方法來擴展此限制,因爲它不依賴於存儲引擎但它是一個hard limit on the server

每個表(無論存儲引擎)具有 65,535字節的最大行大小。存儲引擎可能會限制此限制,從而減少有效的最大行大小。

在這種情況下,解決方案應該圍繞推遲將HTML存儲到其他位置 - 文件系統或雲(S3)上,然後引用表列中的文件名稱。

+5

此限制不適用於「BLOB」和「TEXT」類型。 http://dev.mysql.com/doc/refman/5.5/en/blob.html – eggyal 2012-04-27 11:07:23

+0

hello burhan。感謝workarounf想法(保存在文件系統中)。如果我找不到其他解決方案,我會這樣做...... – Marc 2012-04-27 11:11:39

+0

你說得對,但我仍然支持我在數據庫之外存儲類似「文件」內容的建議。 – 2012-04-27 11:11:58

1

當你說「該字段不認可完整的代碼,並總是在相同數量的字符後停止」,你如何確定該字段包含什麼?我懷疑你正在查看的內容已被max_allowed_packet變量截斷。

如在規定的MySQL manual

一個BLOBTEXT對象的最大尺寸是由它的類型來確定,但實際上可以在客戶端和服務器之間傳輸的最大值是通過的量來確定可用內存和通信緩衝區的大小。您可以通過更改max_allowed_packet變量的值來更改消息緩衝區大小,但是您必須對服務器和客戶端程序都這樣做。例如,mysqlmysqldump使您能夠更改客戶端max_allowed_packet值。請參閱Section 8.11.2, 「Tuning Server Parameters」,Section 4.5.1, 「mysql — The MySQL Command-Line Tool」Section 4.5.4, 「mysqldump — A Database Backup Program」。您可能還需要比較數據包大小和對象時,與存儲要求存儲的數據的大小,看Section 11.5, 「Data Type Storage Requirements」

+0

你好eggyal。感謝您的意見。我會嘗試一下,然後恢復... – Marc 2012-04-27 11:09:53

+0

@Marc:你有沒有與'max_allowed_pa​​cket'運氣? – eggyal 2012-05-01 19:37:31

6

(長)文本(和BLOB)的值爲而不是存儲在「行中」但在其外部。因此,HTML的大小不會影響單個行的大小。

從手冊:

一個表的內部表示具有65535字節的最大行大小,即使存儲引擎能夠支持更大的行。該圖排除BLOB或TEXT列,其朝向該尺寸

對於BLOB和TEXT數據僅貢獻9至12個字節,信息被存儲在內部存儲器比所述行緩衝器的不同區域。

(重點煤礦)

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

15

接受的答案是錯的(或至少相當自以爲是) - 我不希望個人存儲在我的數據庫之外的數據,因爲它創造了併發症在備份程序和事務查詢方面。

正如其他人指出的那樣,手冊反覆指出,BLOB和TEXT列不會計入總行大小,但不幸的是,使用默認配置設置時,情況並非如此,您最終得到此錯誤 - 信息。 (錯誤消息沒有任何意義,因爲它告訴您使用TEXT而不是VARCHAR來解決問題 - 您已經是這個問題了。)

此限制的原因是默認存儲機制Antelope,存儲該行中的第一768個字節的可變長度列的 - 以及可能的解決方案是使用INNODB和切換存儲機構,以將替代Barracuda存儲機構:

SET GLOBAL innodb_file_format=Barracuda; 

這將沒有任何直接影響,因爲此設置是新數據庫文件的默認設置 - 所以您需要刪除並重新創建整個數據庫。

備選地,切換到梭子魚(如上述),然後(除)切換到文件每次表的策略:

SET GLOBAL innodb_file_per_table=ON; 

同樣,這將沒有直接的影響,因爲這兩個設置的默認值對於新表格 - 再次,您需要刪除並重新創建表格。

如果您在完成此操作後查看MySQL數據文件夾,您可以確認已創建單獨的文件,例如,對於名爲「data」的數據庫和名爲「test」的表,應該會看到名爲「data/test/bigtable.ibd」的文件。

如果您不喜歡更改MySQL中的全局設置,請嘗試使用SET SESSION而不是SET GLOBAL,例如,立即在運行您的CREATE TABLE報表。

+1

這應該是被接受的答案,值得注意的是,您可以「ALTER」已經創建的表來使用文件存儲。 [docs](http://dev.mysql.com/doc/refman/5.5/en/innodb-compression-usage.html) – tonyjmnz 2014-03-18 13:57:28

+0

可能值得編輯你的答案,以包括默認配置設置爲什麼會起作用的原因他們是這樣。從這裏的MySQL文檔(http://dev.mysql.com/doc/refman/5.5/en/innodb-row-format-antelope.html),原因是(至少現在)默認的INNODB文件格式是羚羊,它在行中存儲了可變長度列的前768個字節。如果默認格式發生變化,則此解決方法可能不再需要。 – nextgentech 2015-05-25 20:49:59

0

我們按照以下步驟解決它。

第1步:在查詢下面運行MySql來設置全局變量。

  • SET GLOBAL innodb_file_format = Barracuda;
  • SET GLOBAL innodb_file_per_table = ON;

第2步:選擇當您嘗試將大數據保存到單行時發生錯誤的表。

步驟3:進入操作

步驟4:從ROW_FORMAT壓縮。 (默認情況下,當您設置全局變量innodb_file_format和innodb_file_per_table時,COMPACT和REDUNDANT會在那裏,您可以找到其他選項,如COMPRESSED和DYNAMIC)

第5步:單擊Go。

:)