varchar (255) so với tinytext / tinyblob và varchar (65535) so với blob / text


91

Theo định nghĩa:

VARCHAR: Phạm vi Độ dài là 1 đến 255 ký tự. Các giá trị VARCHAR được sắp xếp và so sánh theo kiểu không phân biệt chữ hoa chữ thường trừ khi từ khóa BINARY được cung cấp. x + 1 byte
TINYBLOB, TINYTEXT: Cột BLOB hoặc TEXT có độ dài tối đa là 255 (2 ^ 8 - 1) ký tự x + 1 byte

Vì vậy, dựa trên điều này, tôi tạo bảng sau:

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255),
  `lastname` tinytext,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Hoặc tốt hơn là tạo một varchar hoặc tinytext và tại sao ?

Nó có giống nhau đối với:

VARCHAR: Phạm vi Độ dài> 255 ký tự. Các giá trị VARCHAR được sắp xếp và so sánh theo kiểu không phân biệt chữ hoa chữ thường trừ khi từ khóa BINARY được cung cấp. x + 2 byte
BLOB, TEXT A BLOB hoặc cột TEXT có độ dài tối đa là 65535 (2 ^ 16 - 1) ký tự x + 2 byte

Câu trả lời:


159

TỪ: http://www.pythian.com/news/7129/text-vs-varchar/

Thoạt nhìn, có vẻ như TEXT và VARCHAR có thể lưu trữ cùng một thông tin. Tuy nhiên, có những khác biệt cơ bản giữa cách hoạt động của trường TEXT và trường VARCHAR, điều quan trọng cần được xem xét.

VARCHAR tiêu chuẩn thực sự là một phần của tiêu chuẩn ISO SQL: 2003; Các kiểu dữ liệu TEXT, bao gồm TINYTEXT, là không chuẩn.

Lưu trữ Các kiểu dữ liệu TEXT được lưu trữ dưới dạng các đối tượng riêng biệt từ các bảng và tập kết quả chứa chúng. Bộ nhớ này là trong suốt - không có sự khác biệt về cách viết một truy vấn liên quan đến trường TEXT so với truy vấn liên quan đến trường VARCHAR. Vì TEXT không được lưu trữ như một phần của hàng, việc truy xuất các trường TEXT yêu cầu thêm chi phí bộ nhớ [đã chỉnh sửa 1/22].

Độ dài VARCHAR tối đa Độ dài hàng tối đa của VARCHAR bị giới hạn bởi độ dài hàng tối đa của bảng. Đây là 65,535 byte cho hầu hết các công cụ lưu trữ (NDB có giá trị hàng tối đa khác). Về mặt lý thuyết, độ dài tối đa của VARCHAR là 65,536 byte. Overhead tiếp tục giới hạn kích thước tối đa thực tế của VARCHAR.

Lưu trữ độ dài của trường VARCHAR mất 1 byte nếu trường VARCHAR có độ dài tối đa là 0-255 byte; nếu nó lớn hơn 255 byte, chi phí để lưu trữ độ dài là 2 byte. Nếu trường VARCHAR cho phép giá trị NULL, điều đó sẽ thêm chi phí bổ sung - mọi bảng sử dụng 1 byte chi phí cho mỗi tập hợp 8 trường cho phép giá trị NULL. Nếu VARCHAR là hàng duy nhất trong bảng và không cho phép giá trị NULL, thì độ dài tối đa cho phép đối với VARCHAR là 65,532 byte.

Hãy nhớ rằng số trong VARCHAR (x) đại diện cho số ký tự, không phải số byte. Do đó, bạn có thể gặp khó khăn khi cố gắng xác định bảng chỉ có VARCHAR (65532) nếu bộ ký tự sử dụng các ký tự nhiều byte, chẳng hạn như UTF-8.

Nếu bạn cố gắng xác định giá trị VARCHAR dài hơn cho phép, bạn sẽ gặp phải lỗi như 1118 hoặc 1074:

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs.

ERROR 1074 (42000): Column length too big for column 'col_name' (max=[max number here]); use BLOB or TEXT instead

Độ dài TEXT tối đa Kích thước tối đa của kiểu dữ liệu TEXT phụ thuộc vào kiểu dữ liệu TEXT nào đang được sử dụng. Bởi vì chúng được lưu trữ dưới dạng đối tượng, chi phí hàng duy nhất trong đối tượng bảng là một con trỏ (8 hoặc 16 byte). Đây là danh sách độ dài TEXT tối đa và chi phí (trong đối tượng TEXT):

TINYTEXT  up to 255 bytes, 1 byte overhead

TEXT  up to 64 Kb, 2 bytes overhead

MEDIUMTEXT  up to 16 Mb, 3 bytes overhead

LONGTEXT  up to 4 Gb, 4 bytes overhead

Giá trị DEFAULT MySQL không cho phép kiểu dữ liệu TEXT có giá trị mặc định khác với NULL. Các trường VARCHAR được phép tạo với giá trị DEFAULT.

Kết luận Vì ý nghĩa lưu trữ, nên sử dụng VARCHAR thay vì TINYTEXT.

Nếu bạn cần có giá trị DEFAULT không phải là NULL, bạn phải sử dụng VARCHAR (hoặc CHAR).

Nếu bạn cần lưu trữ chuỗi dài hơn khoảng 64 Kb, hãy sử dụng MEDIUMTEXT hoặc LONGTEXT. VARCHAR không thể hỗ trợ lưu trữ các giá trị lớn.

Đảm bảo rằng bạn nhận thức được tác dụng của bộ ký tự nhiều byte. VARCHAR (255) lưu trữ 255 ký tự, có thể nhiều hơn 255 byte.


Về "độ dài tối đa của VARCHAR là 65,536 byte" , bạn có chắc nó không thực sự là 65,535 không?
Pacerier

@Pacerier Từ MySQL: dev.mysql.com/doc/refman/5.0/en/char.html - Giá trị trong cột VARCHAR là các chuỗi có độ dài thay đổi. Độ dài có thể được chỉ định dưới dạng giá trị từ 0 đến 255 trước MySQL 5.0.3 và 0 đến 65.535 trong phiên bản 5.0.3 trở lên. Độ dài tối đa hiệu quả của một VARCHAR trong MySQL 5.0.3 và sau đó là tùy thuộc vào 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ự sử dụng
Book Of Zeus

1
Vì vậy, nó là 65,536 sau đó.
Pacerier

1
1. Nếu độ dài có thể được chỉ định từ 0 đến 65535, thì giá trị tối đa là 65535. 2. Kích thước tối đa thực tế bị giới hạn bởi số byte , không phải ký tự - tùy thuộc vào công cụ lưu trữ, một VARCHAR (65535) có thể được đặt trước với hai byte chỉ định độ dài thực tính bằng ký tự và một bộ ký tự như utf8 có thể sử dụng nhiều hơn một byte cho mỗi ký tự, do đó làm cho độ dài ký tự tối đa thậm chí còn ngắn hơn.
rsandwick3

Lưu ý rằng việc sử dụng Kb, Mb và Gb của exerpt là không chính xác và phải là KiB, MiB và GiB (như kibibyte, không phải kilobit). Tham khảo [ dev.mysql.com/doc/refman/5.7/en/…
Splitlocked

10

Trong trường hợp varcharnày là tốt hơn.

Lưu ý rằng varcharcó thể từ 1 đến 65535 ký tự.

Giá trị trong cột VARCHAR là các chuỗi có độ dài thay đổi. Độ dài có thể được chỉ định dưới dạng giá trị từ 0 đến 255 trước MySQL 5.0.3 và 0 đến 65.535 trong phiên bản 5.0.3 trở lên. Độ dài tối đa hiệu dụng của một VARCHAR trong MySQL 5.0.3 trở lên tùy thuộc vào 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. Xem Phần E.7.4, “Giới hạn Số lượng Cột của Bảng và Kích thước Hàng”.

Các đốm màu được lưu trong một phần riêng biệt của tệp.
Chúng yêu cầu một tệp tin bổ sung để đưa vào dữ liệu.
Vì lý do này, varchar được tải nhanh hơn nhiều.

Nếu bạn có một đốm màu lớn mà bạn truy cập không thường xuyên, thì một đốm màu có ý nghĩa hơn.
Lưu trữ dữ liệu blob trong một tệp riêng biệt (một phần của tệp) cho phép tệp dữ liệu cốt lõi của bạn nhỏ hơn và do đó được tìm nạp nhanh hơn.


Điều này có tốt hơn hay không phụ thuộc vào các kiểu truy cập dữ liệu của bạn.
Michael Mior

1
Đó có thể là tệp riêng biệt nào?
glglgl 13/10/11

1
Các khối màu không được lưu trong một tệp riêng biệt. Nhưng chúng được lưu trữ ở một vị trí vật lý riêng biệt với phần còn lại của các cột.
Michael Mior

1
Lưu ý rằng điều này không chỉ phụ thuộc vào tần suất truy cập mà còn phụ thuộc vào những thao tác nào đang được thực hiện trên dữ liệu. Ví dụ: bất kỳ truy vấn nào yêu cầu quét bảng (nói chung là xấu), nhưng không phải cột văn bản sẽ trở nên tồi tệ hơn do khối lượng dữ liệu được quét lớn hơn.
Michael Mior

1
Tôi cũng nghi ngờ rằng việc chuyển tệp không sử dụng cột này có thể hiệu quả hơn nếu dữ liệu được lưu trữ ngoài trang mặc dù tôi không chắc trình tối ưu hóa truy vấn đủ thông minh để không lấy dữ liệu này.
Michael Mior
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.