Kích thước tối đa MySQL VARCHAR là gì?


300

Tôi muốn biết kích thước tối đa cho loại VARCHAR của MySQL là gì.

Tôi đọc được rằng kích thước tối đa bị giới hạn bởi kích thước hàng khoảng 65k. Tôi đã thử đặt trường thành varchar(20000)nhưng nó nói rằng nó quá lớn.

Tôi có thể đặt nó thành varchar(10000). Tối đa chính xác tôi có thể đặt nó là gì?


1
Một blog chi tiết: goo.gl/Hli6G3
Suresh Kamrushi

Câu trả lời:


293

Hãy nhớ rằng MySQL có giới hạn kích thước hàng tối đa

Biểu diễn bên trong của bảng MySQL có giới hạn kích thước hàng tối đa là 65.535 byte, không tính các loại BLOB và TEXT. Các cột BLOB và TEXT chỉ đóng góp 9 đến 12 byte cho giới hạn kích thước hàng vì nội dung của chúng được lưu trữ riêng biệt với phần còn lại của hàng. Đọc thêm về Giới hạn về Số lượng Cột Bảng và Kích thước Hàng.

Kích thước tối đa mà một cột có thể chiếm, khác nhau trước và sau MySQL 5.0.3

Các giá trị trong các cột VARCHAR là các chuỗi có độ dài thay đổi. Độ dài có thể được chỉ định làm giá trị từ 0 đến 255 trước MySQL 5.0.3 và 0 đến 65.535 trong 5.0.3 và các phiên bản mới hơn. Độ dài tối đa hiệu quả của VARCHAR trong MySQL 5.0.3 trở lên phải tuân theo kích thước hàng tối đa (65.535 byte, được chia sẻ giữa tất cả các cột) và bộ ký tự được sử dụng.

Tuy nhiên, lưu ý rằng giới hạn thấp hơn nếu bạn sử dụng bộ ký tự nhiều byte như utf8 hoặc utf8mb4.

Sử dụng TEXTcác loại inorder để vượt qua giới hạn kích thước hàng.

Bốn loại văn bản là TINYTEXT, TEXT, MEDIUMTEXT và LONGTEXT. Chúng tương ứng với bốn loại BLOB và có cùng độ dài tối đa và yêu cầu lưu trữ.

Thêm chi tiết về các loại BLOB và văn bản

Thậm chí nhiều hơn

Kiểm tra thêm chi tiết về Yêu cầu lưu trữ kiểu dữ liệu liên quan đến yêu cầu lưu trữ cho tất cả các loại dữ liệu.


4
một chuỗi "dài" là gì?
Richard H

6
Tôi cố gắng tránh các cột văn bản mặc dù chúng có thể khiến các bảng tạm thời được tạo khi trình bày và sắp xếp
Robert Swisher

1
Nếu tôi lấy varchar (200) cho tên đầu tiên và tôi chỉ lưu trữ 6 char trong trường này thì sẽ chiếm bao nhiêu byte tên đầu tiên?
Paresh Gami

2
@PareshGami - 6 + 1 = 7 ký tự! Ngược lại với CHAR, các giá trị VARCHAR được lưu trữ dưới dạng tiền tố có độ dài 1 byte hoặc 2 byte cộng với dữ liệu. thêm ...
rajukoyilandy

58

Theo tài liệu trực tuyến , có giới hạn hàng 64K và bạn có thể tính ra kích thước hàng bằng cách sử dụng:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Bạn cần lưu ý rằng độ dài cột không phải là ánh xạ một-một của kích thước của chúng. Ví dụ: CHAR(10) CHARACTER SET utf8yêu cầu ba byte cho mỗi mười ký tự vì mã hóa cụ thể đó phải tính đến thuộc tính ba byte cho mỗi ký tự của utf8(đó utf8mã hóa của MySQL chứ không phải UTF-8 "thực", có thể có tới bốn byte ).

Nhưng, nếu kích thước hàng của bạn đạt gần 64K, bạn có thể muốn kiểm tra lược đồ của cơ sở dữ liệu của mình. Đó là một bảng hiếm cần rộng đến mức trong cơ sở dữ liệu được thiết lập đúng (3NF) - có thể, chỉ là không phổ biến lắm.

Nếu bạn muốn sử dụng nhiều hơn thế, bạn có thể sử dụng BLOBhoặcTEXT các loại. Chúng không được tính theo giới hạn 64K của hàng (trừ dấu chân hành chính nhỏ) nhưng bạn cần lưu ý các vấn đề khác xuất phát từ việc sử dụng chúng, chẳng hạn như không thể sắp xếp sử dụng toàn bộ khối văn bản vượt quá một số nhất định của các ký tự (mặc dù điều này có thể được cấu hình lên trên), buộc các bảng tạm thời nằm trên đĩa thay vì trong bộ nhớ hoặc phải định cấu hình bộ đệm máy khách và máy chủ để xử lý các kích thước một cách hiệu quả.

Các kích thước được phép là:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

Bạn vẫn có sự không phù hợp byte / ký tự (để một MEDIUMTEXT utf8cột có thể lưu trữ "chỉ" khoảng nửa triệu ký tự, (16M-1)/3 = 5,592,405) nhưng nó vẫn mở rộng đáng kể phạm vi của bạn.


4
Hãy nhớ rằng các loại văn bản KHÔNG thể được lưu trữ trong các bảng bộ nhớ, do đó sẽ có một hình phạt hiệu suất đáng kể khi sử dụng chúng khi VARCHAR đủ.
Camden S.

property thuộc tính ba byte cho mỗi ký tự của utf8 'của MySql utf8 , hoàn toàn không phải là utf8. Trong thực tế tối đa. byte trong một char utf-84 . Vì lý do này, bạn phải luôn luôn đặt mã hóa utf8mb4trong MySQL . utf8mb4là tên của MySql cho phần còn lại của từ gọi là utf8.
Stijn de Witt

1
@StijndeWitt, cảm ơn vì điều đó. được làm rõ để chỉ ra ý tôi là phương pháp mã hóa utf8 của MySQL chứ không phải UTF-8. Tôi thường sử dụng biến thể viết hoa để chỉ ra UTF-8 "thực" vì đó là quy ước IANA được chấp nhận.
paxdiablo

41

Nguồn

Độ dài tối đa của một varchar tùy thuộc vào kích thước hàng tối đa trong MySQL, là 64KB (không tính BLOB):

VARCHAR (65535) Tuy nhiên, lưu ý rằng giới hạn thấp hơn nếu bạn sử dụng bộ ký tự nhiều byte:

VARCHAR (21844) CHARACTER SET utf8


20
Hãy ngừng sử dụng CHARACTER SET utf8trong các ví dụ. Nó phải là CHARACTER SET utf8mb4(nếu bạn muốn tất cả văn bản Unicode được lưu trữ đúng cách ... và ai không muốn điều đó?)
Stijn de Witt

4
Để CHARSET=utf8mb4sử dụng VARCHAR(16383).
Wil Moore III

3
Sử dụng utf8mb4 sẽ giúp bạn vượt qua giới hạn về độ rộng chỉ mục trong trường hợp utf8 không. Nếu bạn kiểm tra các bộ ký tự được bao gồm trong utf8mb4 nhưng không có trong utf8, bạn có thể thấy rằng bao gồm tất cả các dạng chữ tượng hình khác nhau và các bộ ký tự phức tạp khác như vậy không đáng bị phạt hiệu suất đáng kể (xác định theo kinh nghiệm). Nó không hoàn toàn bị cắt và sấy khô như Stijn ngụ ý.
kcrossen

Nhiều biểu tượng cảm xúc cũng có mặt trong utf8mb4 và thiếu từ utf8, do đó có thể thay đổi phương trình cho dù nó đáng giá.
Brian Morearty

23

Từ tài liệu MySQL:

Độ dài tối đa hiệu quả của VARCHAR trong MySQL 5.0.3 trở lên phải tuân theo kích thước hàng tối đa (65.535 byte, được chia sẻ giữa tất cả các cột) và bộ ký tự được sử dụng. Ví dụ: các ký tự utf8 có thể yêu cầu tối đa ba byte cho mỗi ký tự, do đó, cột VARCHAR sử dụng bộ ký tự utf8 có thể được khai báo tối đa là 21.844 ký tự.

Giới hạn cho VARCHAR thay đổi tùy theo bộ ký tự được sử dụng. Sử dụng ASCII sẽ sử dụng 1 byte cho mỗi ký tự. Có nghĩa là bạn có thể lưu trữ 65.535 ký tự. Sử dụng utf8 sẽ sử dụng 3 byte cho mỗi ký tự dẫn đến giới hạn ký tự là 21.844. NHƯNG nếu bạn đang sử dụng bảng mã đa năng hiện đại utf8mb4 mà bạn nên sử dụng! Nó hỗ trợ biểu tượng cảm xúc và các nhân vật đặc biệt khác. Nó sẽ được sử dụng 4 byte cho mỗi ký tự. Điều này sẽ giới hạn số lượng ký tự trên mỗi bảng là 16.383. Lưu ý rằng các trường khác như INT cũng sẽ được tính vào các giới hạn này.

Phần kết luận:

utf8 tối đa 21.844 ký tự

utf8mb4 tối đa 16.383 ký tự


6

bạn cũng có thể sử dụng MEDIUMBLOB / LONGBLOB hoặc MEDIUMTEXT / LONGTEXT

Một loại BLOB trong MySQL có thể lưu trữ tới 65.534 byte, nếu bạn cố lưu trữ nhiều hơn số dữ liệu này, MySQL sẽ cắt bớt dữ liệu. MEDIUMBLOB có thể lưu trữ tới 16.777.213 byte và LONGBLOB có thể lưu trữ tới 4.294.967.292 byte.


3

Trước khi phiên bản Mysql phiên bản 5.0.3 Varcharpe có thể lưu trữ 255 ký tự, nhưng từ 5.0.3, nó có thể lưu trữ 65.535 ký tự.

NHƯNG nó có giới hạn kích thước hàng tối đa là 65.535 byte. Nó có nghĩa là bao gồm tất cả các cột, nó không được nhiều hơn 65.535 byte.

Trong trường hợp của bạn, có thể là khi bạn đang cố gắng đặt hơn 10000 thì nó vượt quá 65.535 và mysql sẽ báo lỗi.

Để biết thêm thông tin: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

blog với ví dụ: http://goo.gl/Hli6G3


-5

Bạn có thể sử dụng TEXTloại không giới hạn ở 64KB.


31
Điều này không trả lời câu hỏi.
DreamWave

1
Câu trả lời của bạn không liên quan đến câu hỏi.
Girish
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.