Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sự khác biệt giữa VARCHAR và TEXT trong MySQL

TL; DR

TEXT

  • kích thước tối đa cố định là 65535 ký tự (bạn không thể giới hạn kích thước tối đa)
  • mất 2 + c byte dung lượng đĩa, trong đó c là độ dài của chuỗi được lưu trữ.
  • không thể là một phần (đầy đủ) của một chỉ mục. Người ta cần chỉ định độ dài tiền tố.

VARCHAR(M)

  • kích thước tối đa có thể thay đổi của M nhân vật
  • M cần từ 1 đến 65535
  • mất 1 + c byte (cho M ≤ 255) hoặc 2 + c (cho 256 ≤ M ≤ 65535) byte dung lượng ổ đĩa trong đó c là độ dài của chuỗi được lưu trữ
  • có thể là một phần của chỉ mục

Thêm chi tiết

TEXT có một cố định kích thước tối đa của 2¹⁶-1 = 65535 ký tự.
VARCHAR biến kích thước tối đa M lên đến M = 2¹⁶-1 .
Vì vậy, bạn không thể chọn kích thước của TEXT nhưng bạn có thể cho một VARCHAR .

Sự khác biệt khác là bạn không thể đặt chỉ mục (ngoại trừ chỉ mục toàn văn bản) trên TEXT cột.
Vì vậy, nếu bạn muốn có một chỉ mục trên cột, bạn phải sử dụng VARCHAR . Nhưng lưu ý rằng độ dài của một chỉ mục cũng bị giới hạn, vì vậy nếu VARCHAR của bạn cột quá dài, bạn chỉ được sử dụng một vài ký tự đầu tiên của VARCHAR trong chỉ mục của bạn (Xem tài liệu về CREATE INDEX ).

Nhưng bạn cũng muốn sử dụng VARCHAR , nếu bạn biết rằng độ dài tối đa của chuỗi đầu vào có thể chỉ là M , ví dụ. một số điện thoại hoặc một cái tên hoặc một cái gì đó tương tự như thế này. Sau đó, bạn có thể sử dụng VARCHAR(30) thay vì TINYTEXT hoặc TEXT và nếu ai đó cố gắng lưu nội dung của cả ba cuốn sách "Chúa tể chiếc nhẫn" trong cột số điện thoại của bạn, bạn chỉ lưu trữ 30 ký tự đầu tiên :)

Chỉnh sửa: Nếu văn bản bạn muốn lưu trữ trong cơ sở dữ liệu dài hơn 65535 ký tự, bạn phải chọn MEDIUMTEXT hoặc LONGTEXT , nhưng hãy cẩn thận:MEDIUMTEXT lưu trữ các chuỗi lên đến 16 MB, LONGTEXT lên đến 4 GB. Nếu bạn sử dụng LONGTEXT và lấy dữ liệu qua PHP (ít nhất là nếu bạn sử dụng mysqli không có store_result ), bạn có thể gặp lỗi cấp phát bộ nhớ, vì PHP cố gắng cấp phát 4 GB bộ nhớ để đảm bảo toàn bộ chuỗi có thể được lưu vào bộ đệm. Điều này cũng có thể xảy ra ở các ngôn ngữ khác ngoài PHP.

Tuy nhiên, bạn nên luôn luôn kiểm tra thông tin đầu vào (Có quá dài không? Nó có chứa mã lạ không?) before lưu trữ nó trong cơ sở dữ liệu.

Lưu ý:Đối với cả hai loại, dung lượng đĩa yêu cầu chỉ phụ thuộc vào độ dài của chuỗi được lưu trữ chứ không phụ thuộc vào độ dài tối đa.
Ví dụ: nếu bạn sử dụng bộ ký tự latin1 và lưu trữ văn bản "Kiểm tra" trong VARCHAR(30) , VARCHAR(100)TINYTEXT , nó luôn yêu cầu 5 byte (1 byte để lưu trữ độ dài của chuỗi và 1 byte cho mỗi ký tự). Nếu bạn lưu trữ cùng một văn bản trong VARCHAR(2000) hoặc một TEXT , nó cũng sẽ yêu cầu cùng một không gian, nhưng, trong trường hợp này, nó sẽ là 6 byte (2 byte để lưu trữ độ dài chuỗi và 1 byte cho mỗi ký tự).

Để biết thêm thông tin, hãy xem tài liệu .

Cuối cùng, tôi muốn thêm một thông báo, rằng cả hai, TEXTVARCHAR là các kiểu dữ liệu có độ dài thay đổi và vì vậy chúng rất có thể giảm thiểu dung lượng bạn cần để lưu trữ dữ liệu. Nhưng điều này đi kèm với sự đánh đổi cho hiệu suất. Nếu bạn cần hiệu suất tốt hơn, bạn phải sử dụng loại độ dài cố định như CHAR . Bạn có thể đọc thêm về điều này tại đây .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CHỌN / NHÓM THEO - phân đoạn thời gian (10 giây, 30 giây, v.v.)

  2. Cách chuyển đổi datetime sang UTC trong MySQL

  3. Cập nhật một cột trong MySQL

  4. Làm thế nào để cài đặt MySQL trên Windows 10? - Giải pháp một cửa của bạn để cài đặt MySQL

  5. Sự khác biệt giữa INDEX, PRIMARY, UNIQUE, FULLTEXT trong MySQL?