Tương đương của varchar (max) trong MySQL?


Câu trả lời:


195

Độ 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

Dưới đây là một số ví dụ:

Kích thước hàng tối đa là 65535, nhưng một varchar cũng bao gồm một hoặc hai byte để mã hóa độ dài của một chuỗi đã cho. Vì vậy, bạn thực sự không thể khai báo một biến thể của kích thước hàng tối đa, ngay cả khi đó là cột duy nhất trong bảng.

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Nhưng nếu chúng ta thử giảm độ dài, chúng ta sẽ tìm thấy độ dài lớn nhất hoạt động:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

Bây giờ nếu chúng ta cố gắng sử dụng bộ ký tự đa bào ở cấp độ bảng, chúng ta thấy rằng nó tính mỗi ký tự là nhiều byte. Các chuỗi UTF8 không nhất thiết phải sử dụng nhiều byte cho mỗi chuỗi, nhưng MySQL không thể cho rằng bạn sẽ hạn chế tất cả các lần chèn trong tương lai của mình thành các ký tự một byte.

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

Mặc dù lỗi cuối cùng đã nói với chúng tôi, InnoDB vẫn không giống như chiều dài 21845.

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Điều này có ý nghĩa hoàn hảo, nếu bạn tính toán rằng 21845 * 3 = 65535, dù sao thì nó cũng không hoạt động. Trong khi đó 21844 * 3 = 65532, không hoạt động.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)

20
Tôi cũng đề nghị sử dụng văn bản
Adi

2
@AdnanShammout: Chắc chắn, trừ khi bạn muốn khai báo một DEFAULTgiá trị cho cột. Không thể làm điều đó với các loại văn bản hoặc BLOB.
Bill Karwin

5
@DanW, TEXTgiới hạn độ dài là 64K. MEDIUMTEXTgiới hạn chiều dài là 16M. LONGTEXTgiới hạn chiều dài là 4G.
Bill Karwin

4
Vấn đề lớn nhất với điều này là nếu bạn tạo một cột có kích thước đó, bạn chỉ có thể có một cột đó trong bảng của mình. Các MAX hàng kích thước trong MySql là 64k, vì vậy nếu bạn có một cột 64k, đó là tất cả các bạn nhận được. Ràng buộc tương tự này không áp dụng cho varchar(max)loại cột của Sql Server .
joshperry

1
@joshperry, có nhưng các cột TEXT / BLOB chỉ tính một lượng nhỏ (9-12 byte) cho giới hạn kích thước hàng 64KB đó, vì vậy nếu bạn cần một VARCHAR lớn cũng như một số cột khác, tốt hơn là sử dụng TEXT.
Bill Karwin

74

TLDR; MySql không có khái niệm tương đương varchar(max), đây là một tính năng của MS SQL Server.

VARCHAR (tối đa) là gì?

varchar(max) là một tính năng của Microsoft SQL Server.

Lượng dữ liệu mà một cột có thể lưu trữ trong các phiên bản máy chủ Microsoft SQL trước phiên bản 2005 được giới hạn ở 8KB. Để lưu trữ nhiều hơn 8KB bạn sẽ phải sử dụng TEXT, NTEXThoặc BLOBcột loại, các loại cột lưu trữ dữ liệu của họ như một bộ sưu tập của 8K trang tách biệt với các trang bảng dữ liệu; họ hỗ trợ lưu trữ tối đa 2GB mỗi hàng.

Thông báo trước lớn cho các loại cột là họ thường yêu cầu chức năng đặc biệt và báo cáo để truy cập và sửa đổi dữ liệu (ví dụ READTEXT, WRITETEXTUPDATETEXT)

Trong SQL Server 2005, varchar(max)đã được giới thiệu để thống nhất dữ liệu và truy vấn được sử dụng để truy xuất và sửa đổi dữ liệu trong các cột lớn. Dữ liệu cho varchar(max)các cột được lưu trữ nội tuyến với các trang dữ liệu bảng.

Khi dữ liệu trong cột MAX điền vào trang dữ liệu 8KB, một trang tràn được phân bổ và trang trước đó trỏ đến nó tạo thành một danh sách được liên kết. Không giống như TEXT, NTEXTBLOBcác varchar(max)loại cột hỗ trợ tất cả các ngữ nghĩa truy vấn tương tự như các loại cột khác.

Vì vậy, varchar(MAX)thực sự có nghĩa varchar(AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING)và không varchar(MAX_SIZE_OF_A_COLUMN).

MySql không có thành ngữ tương đương.

Để có được cùng dung lượng lưu trữ như varchar(max)trong MySql, bạn vẫn cần phải sử dụng BLOBloại cột. Bài viết này thảo luận về một phương pháp rất hiệu quả để lưu trữ một lượng lớn dữ liệu trong MySql một cách hiệu quả.


1
Điều này có liên quan nhiều đến SQL Server hơn MySQL.
Kermit

14
@njk Có, nhưng để giải thích "tương đương" trong MySql (hoặc thiếu tương đương trong trường hợp này) cần phải mô tả chính xác ý nghĩa varchar(max) thực sự của nó .
joshperry

29

Độ dài tối đa của một varchar là

65535

chia cho độ dài byte tối đa của một ký tự trong bộ ký tự, cột được đặt thành (ví dụ utf8 = 3 byte, ucs2 = 2, latin1 = 1).

trừ 2 byte để lưu trữ độ dài

trừ đi độ dài của tất cả các cột khác

trừ đi 1 byte cho mỗi 8 cột là nullable. Nếu cột của bạn là null / không null, thì cột này được lưu trữ dưới dạng một bit trong một byte / byte được gọi là mặt nạ null, 1 bit cho mỗi cột là null.


Tôi thích định dạng câu trả lời của bạn nhưng dường như thiếu một số thông tin hữu ích mà câu trả lời hàng đầu cung cấp liên quan đến bảng mã và nội dung
Joe Phillips

3

Đối với máy chủ Sql

thay đổi bảng prg_ar numport_colors thêm Text_Color_Code VARCHAR (tối đa);

Đối với MySql

thay đổi bảng prg_ar numport_colors thêm Text_Color_Code longtext;

Đối với Oracle

thay đổi bảng prg_ar numport_colors thêm Text_Color_Code CLOB;


1
lưu ý rằng longtext, văn bản và blob được lưu trữ khác với varchar. varchar được lưu trữ với các trường khác, trong khi văn bản được lưu trữ trên một tệp riêng trong máy chủ. nó có những ưu và nhược điểm rất cẩn thận nên chọn cái nào
santiago arizti

0

Cột chuyển đổi Mysql từ VARCHAR sang văn bản khi có kích thước giới hạn !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

-11

Độ dài tối đa của một varchar trong MySQL 5.6.12 là 4294967295.

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.