Tôi có một db mysql. Tôi dùng innodb. 0ne bảng của tôi chứa nhiều hơn 10 cột. Cột cuối cùng có một loại LONGTEXT và nó được cho là chứa mã html. Vấn đề là, đối với mỗi bản ghi, trường đó không conatin mã đầy đủ và nó luôn dừng sau cùng một số lượng ký tự. Trọng lượng của các tệp html tôi cố gắng chèn vào khoảng 60KO. Vì vậy, tôi đoán mỗi bản ghi của tôi vượt quá giới hạn kích thước hàng của mysql (66KO). Những gì tôi muốn biết là nếu có một số cách để mở rộng giới hạn đó. Bất kỳ cách giải quyết nào cũng sẽ được đánh giá cao. Cảm ơn trước cho các đầu vào. Chúc mừng. MarcMYSQL - Cách khắc phục giới hạn kích thước hàng 66 KBytes
Trả lời
Không có cách nào để mở rộng giới hạn này, vì nó không phụ thuộc vào công cụ lưu trữ nhưng nó là một hard limit on the server:
Mỗi bảng (bất kể công cụ lưu trữ) có kích thước hàng tối đa là 65,535 byte. Động cơ lưu trữ có thể đặt thêm các giới hạn về giới hạn này, giảm kích thước hàng tối đa hiệu quả.
Trong trường hợp này, các giải pháp sẽ xoay quanh trì hoãn việc lưu trữ HTML sang một số nơi khác - trên hệ thống tệp hoặc trên đám mây (S3) và sau đó tham chiếu đến tên tệp trong cột bảng.
Khi bạn nói "trường đó không chứa mã đầy đủ và nó luôn dừng sau cùng số lượng ký tự", bạn xác định trường chứa gì? Tôi nghi ngờ những gì bạn đang xem đã bị cắt bớt bởi biến số max_allowed_packet
.
Như đã nêu trong MySQL manual:
Kích thước tối đa của một
BLOB
hoặcTEXT
đối tượng được xác định theo loại của nó, nhưng giá trị lớn nhất bạn thực sự có thể truyền tải giữa máy khách và máy chủ được xác định bởi số lượng bộ nhớ có sẵn và kích thước của bộ đệm truyền thông. Bạn có thể thay đổi kích thước bộ đệm thư bằng cách thay đổi giá trị của biến sốmax_allowed_packet
, nhưng bạn phải làm như vậy cho cả máy chủ và chương trình khách hàng của mình. Ví dụ: cả haimysql
vàmysqldump
cho phép bạn thay đổi giá trị phía máy kháchmax_allowed_packet
. Xem Section 8.11.2, “Tuning Server Parameters”, Section 4.5.1, “mysql
— The MySQL Command-Line Tool” và Section 4.5.4, “mysqldump
— A Database Backup Program”. Bạn cũng có thể muốn so sánh kích thước gói và kích thước của các đối tượng dữ liệu bạn đang lưu trữ với các yêu cầu bộ nhớ, xem Section 11.5, “Data Type Storage Requirements”
Giá trị cho (LONG) TEXT (và BLOB) là không phải được lưu trữ "trong hàng" nhưng bên ngoài nó. Vì vậy, kích thước của HTML của bạn không đóng góp vào kích thước của các hàng riêng lẻ.
Từ hướng dẫn:
Các đại diện bên trong của một bảng có kích thước hàng tối đa 65.535 byte, ngay cả khi các công cụ lưu trữ là khả năng hỗ trợ hàng lớn hơn. Con số này không bao gồm BLOB hoặc TEXT cột, mà chỉ đóng góp 9-12 byte đối với kích thước này
Đối với dữ liệu BLOB và TEXT, các thông tin được lưu trữ nội bộ trong một khu vực khác nhau của bộ nhớ hơn so với đệm hàng.
(tôi nhấn mạnh)
http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html
Câu trả lời được chấp nhận là sai (hoặc ít nhất là khá khăng khăng) - Cá nhân tôi không muốn dữ liệu được lưu trữ bên ngoài của cơ sở dữ liệu của tôi, vì nó tạo ra các biến chứng về thủ tục sao lưu và truy vấn giao dịch.
Như những người khác đã chỉ ra, hướng dẫn liên tục nói rằng các cột BLOB và TEXT không được tính vào tổng kích cỡ hàng, nhưng không may, với cài đặt cấu hình mặc định, điều đó không đúng và bạn sẽ gặp phải lỗi này- thông điệp. (Thông báo lỗi không có ý nghĩa gì vì nó cho bạn biết sử dụng TEXT thay vì VARCHAR để giải quyết vấn đề - mà bạn đã có.)
Lý do giới hạn này là cơ chế lưu trữ mặc định, Antelope, mà các cửa hàng của 768 byte đầu tiên của cột chiều dài thay đổi ở hàng - và một giải pháp khả thi là sử dụng InnoDB và chuyển sang cơ chế lưu trữ của bạn để cơ chế Barracuda lưu trữ thay thế:
SET GLOBAL innodb_file_format=Barracuda;
này sẽ không có hiệu lực ngay lập tức, vì cài đặt này là mặc định cho các tệp cơ sở dữ liệu mới - vì vậy bạn sẽ cần phải thả và tạo lại toàn bộ cơ sở dữ liệu của mình.
Ngoài ra, chuyển sang Barracuda (như trên) và sau đó (ngoài) chuyển sang chiến lược tập tin mỗi bảng:
SET GLOBAL innodb_file_per_table=ON;
Một lần nữa, điều này sẽ không có hiệu lực ngay lập tức, bởi vì cả hai thiết lập được giá trị mặc định cho các bảng mới - vì vậy một lần nữa, bạn sẽ cần phải thả và tạo lại bảng.
Nếu bạn nhìn vào thư mục dữ liệu MySQL sau khi thực hiện việc này, bạn có thể xác nhận rằng các tệp riêng biệt đã được tạo, ví dụ: cho một cơ sở dữ liệu có tên là "dữ liệu" và một bảng có tên là "test", bạn sẽ thấy một tệp có tên "data/test/bigtable.ibd".
Nếu bạn không thích thay đổi cài đặt chung trong MySQL, hãy thử SET SESSION
thay vì SET GLOBAL
, ví dụ: ngay trước khi chạy câu lệnh CREATE TABLE
của bạn.
Đây phải là câu trả lời được chấp nhận, đáng lưu ý rằng bạn có thể 'ALTER' các bảng đã được tạo của bạn để sử dụng bộ nhớ tệp. [docs] (http://dev.mysql.com/doc/refman/5.5/en/innodb-compression-usage.html) – tonyjmnz
Có thể đáng để chỉnh sửa câu trả lời của bạn để bao gồm lý do tại sao cài đặt cấu hình mặc định hoạt động theo cách họ làm. Từ tài liệu MySQL ở đây (http://dev.mysql.com/doc/refman/5.5/en/innodb-row-format-antelope.html), lý do là (ít nhất là bây giờ) định dạng tệp INNODB mặc định là Antelope lưu trữ 768 byte đầu tiên của các cột có độ dài biến đổi trong hàng. Nếu định dạng mặc định bao giờ thay đổi cách giải quyết này có thể không còn cần thiết nữa. – nextgentech
Chúng tôi đã giải quyết nó bằng các bước dưới đây.
Bước 1: Chạy các truy vấn bên dưới vào MySql để đặt các biến chung.
- SET GLOBAL innodb_file_format = Barracuda;
- SET GLOBAL innodb_file_per_table = ON;
Bước 2: Chọn bảng mà từ đó lỗi xảy ra khi bạn cố gắng lưu dữ liệu lớn vào một hàng.
Bước 3: Chuyển đến Thao tác
Bước 4: Chọn COMPRESSED từ ROW_FORMAT. (Theo mặc định COMPACT và REDUNDANT sẽ ở đó khi bạn đặt biến toàn cầu innodb_file_format và innodb_file_per_table bạn có thể tìm thấy một tùy chọn khác như COMPRESSED và DYNAMIC)
Bước 5: Nhấp vào Go.
:)
- 1. giới hạn kích thước MySQL VARCHAR
- 2. hàng đợi kích thước giới hạn
- 3. Giới hạn kích thước mảng
- 4. Giới hạn kích thước Intent.putExtras?
- 5. Ghi đè hiển thị của giới hạn kích thước trang/giới hạn kích thước StreamReader?
- 6. Giới hạn kích thước tệp SharePoint
- 7. Giới hạn kích thước QPage/QPixmap?
- 8. Giới hạn kích thước tham số JSON
- 9. Cách khắc phục giới hạn chức năng Excel Vlookup là 256 ký tự
- 10. Giới hạn kích thước Haskell Tuple
- 11. Giới hạn kích thước phản hồi AJAX
- 12. giới hạn kích thước cookie chrome
- 13. Phiên: giới hạn kích thước phiên
- 14. Matrix giới hạn kích thước trong MATLAB
- 15. HTML5 Canvas: Cách biết giới hạn cho kích thước?
- 16. Cách khắc phục "Mã của phương thức .. vượt quá giới hạn 65535 byte"?
- 17. Giới hạn kích thước của yêu cầu đăng là gì?
- 18. Giới hạn kích thước tệp và giới hạn độ dài dòng cho các tệp hàng loạt của Windows
- 19. Giới hạn kích thước APK của Android trong Google Play
- 20. giới hạn kích thước gói cho trò chơi iPhone?
- 21. MongoDB Giới hạn kích thước tài liệu đơn là 16MB
- 22. Tủ Kyoto/Berkeley DB: Giới hạn kích thước bảng băm
- 23. serializing dữ liệu sử dụng giới hạn kích thước json.net?
- 24. Giới hạn kích thước của Danh sách (của T) - VB.NET
- 25. @OneToMany giới hạn kích thước danh sách ánh xạ
- 26. Giới hạn kích thước cho IN và NOT IN trong MySQL
- 27. Giới hạn kích thước tải lên tệp Rails
- 28. Giới hạn kích thước đối tượng OpenGL FrameBuffer tối đa?
- 29. Đối tượng Ruby có giới hạn kích thước không?
- 30. Giới hạn kích thước tệp hành động MVC3
Giới hạn này không áp dụng cho các loại 'BLOB' và' TEXT'. http://dev.mysql.com/doc/refman/5.5/en/blob.html – eggyal
xin chào burhan. cảm ơn ý tưởng workarounf (lưu trên hệ thống tập tin). Tôi sẽ làm điều đó nếu tôi không tìm thấy giải pháp khác ... – Marc
Bạn nói đúng, nhưng tôi vẫn đứng theo đề xuất của tôi về việc lưu trữ nội dung "tệp như" bên ngoài cơ sở dữ liệu. –