Câu lệnh truy vấn Sql

Kiểu CHAR và VARCHAR trong mysql. Độ dài khai báo kiểu varchar(1 – 255) có ý nghĩa thế nào

Khác biệt giữa VARCHAR và CHAR trong MySQL

Kiểu CHAR và VARCHAR trong mysql tương tự nhau cùng để lưu trữ dữ liệu dạng string, nhưng khác nhau về cách chúng được lưu trữ và truy xuất. Chúng cũng khác nhau về chiều dài tối đa và số lượng các khoảng trống được thêm vào bộ nhớ khi lưu trữ.

CHAR và VARCHAR được khai báo với độ dài cho biết số lượng ký tự tối đa bạn muốn lưu trữ. Ví dụ: CHAR (30) có thể chứa tối đa 30 ký tự.

Độ dài của cột CHAR được cố định với độ dài mà bạn khai báo khi bạn tạo bảng. Độ dài có thể là bất kỳ giá trị nào từ 0 đến 255. Khi các giá trị CHAR được lưu trữ, chúng được đệm bên phải với khoảng trắng theo chiều dài đã chỉ định. Với VARCHAR số lượng khoảng trắng được đệm thêm chỉ là 1.

Các giá trị trong các cột VARCHAR là các chuỗi có độ dài thay đổi. Có thể hiểu đơn giản theo nghĩa của từ VAR đừng trước CHAR để phân biệt bản chẩn của CHAR và VARCHAR.

Ví dụ sau đây minh họa sự khác biệt giữa CHAR và VARCHAR bằng cách hiển thị kết quả của việc lưu trữ các giá trị chuỗi khác nhau vào các cột CHAR (4) và VARCHAR (4) (giả sử rằng cột sử dụng bộ ký tự một byte như latin1).

Value CHAR(4) Storage Required VARCHAR(4) Storage Required
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

Như vậy nếu bạn dùng VARCHAR, số lượng ký tự quy định trong kiểu này ví dụ VARCHAR(255) chỉ quy định độ dài ký tự tối đa được phép lưu trữ mà không ảnh hưởng đến kích thước lưu trữ. Còn nếu bạn dùng CHAR, ví dụ CHAR(255) bộ nhỡ sẽ luôn lưu trữ 255 ký tự. Rõ ràng chúng ta nên dùng VARCHAR.

Ý nghĩa độ dài ký tự định nghĩa của kiểu VARCHAR

Câu hỏi tiếp theo đặt ra là khi dùng VARCHAR độ dài quy định có còn quan trong khi bạn lưu trữ các thông tin luôn có số lượng ký tự ít, ví dụ lưu tên người dùng thường chỉ có số lượng vài đến hơn chục ký tự, chúng ta có thể để VARCHAR(20) và VARCHAR(255) có khác gì ?

Câu trả lời là rất khác biệt, khi bạn truy vấn dữ liệu các trường VARCHAR sẽ được MySQL chuyển đổi thành CHAR để dễ dàng làm việc với các hàng có chiều rộng cố định. Vì vậy, các chuỗi trong bộ nhớ đệm lúc này sẽ theo chiều dài tối đa cột VARCHAR được khai báo.

Các truy vấn ngầm tạo ra các bảng trên bộ nhớ tạm, trong một số trường hợp như sắp xếp(ORDER BY) hoặc nhóm(GROUP BY) có thể sử dụng rất nhiều bộ nhớ khi quy định dữ liệu kiểu VARCHAR của bạn không sát với thực tế dữ liệu. Nếu bạn sử dụng nhiều trường VARCHAR(255) cho dữ liệu không cần dài như vậy, điều này có thể làm cho bảng tạm thời trở nên rất lớn, làm ảnh hưởng đến tốc độ fetch dữ liệu để đưa ra result, một số trượng hợp gây “out of memory” cho Ram.

Kết luận: Trường dữ liệu VARCHAR và các kiểu TEXT nói chung khi thiết kế CSDL chúng ta nên định nghĩa số lượng ký tự sát với thực tế lưu trữ cho một database tối ưu nhất.

Like và chia sẻ bài viết này:

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.