Sự khác biệt giữa VARCHAR và CHAR là gì?


366

Sự khác biệt giữa VARCHAR và CHAR trong MySQL là gì?

Tôi đang cố gắng lưu trữ băm MD5.


15
Băm MD5 luôn có 32 ký tự. Do đó, để tối đa hóa hiệu suất của bạn, hãy sử dụng CHAR (32) vì CHAR có độ dài cố định (xem câu trả lời bên dưới để biết thêm chi tiết về sự khác biệt giữa CHAR và VARCHAR).
Augustin

Câu trả lời:


361

VARCHAR là chiều dài thay đổi.

CHAR là chiều dài cố định.

Nếu nội dung của bạn có kích thước cố định, bạn sẽ có hiệu suất tốt hơn CHAR.

Xem trang MySQL về các loại CHAR và VARCHAR để được giải thích chi tiết (hãy chắc chắn cũng đọc các bình luận).


51
@steven: khi Anon. nói "nội dung của bạn là một kích thước cố định" có nghĩa là các hàng trong bảng của bạn phải chứa tất cả các trường có kích thước cố định. Bạn không được cải thiện hiệu suất nếu bạn sử dụng CHAR với VARCHAR trong một trường, nhưng bảng chứa các trường khác là VARCHAR.
Marco Demaio

2
không có kiểu dữ liệu char nào thêm hiệu năng ... trong khi thực hiện truy vấn sql sẽ tạo ra một kế hoạch thực hiện. Giả sử có 2 cột charcol char (2000) và VarcharCol Varchar (2000). Trong kế hoạch thực hiện, kích thước hàng ước tính cho loại cột varchar có thể được ước tính. do đó, nó dẫn đến sự cố tràn sang temp db. Vì vậy, sử dụng char là tốt cho hiệu suất
vignesh

1
ý nghĩa của giá trị trong phép so sánh của VARCHAR (n) là gì?
Sivagami Nambi

@Marco Demaio bạn có biết lý do đằng sau điều này không?
Dehan de Croos

1
@ jdc91: để có hiệu suất tăng, toàn bộ hàng phải có chiều rộng cố định. MySQL đạt được lợi thế khi tính toán các yêu cầu không gian và bù của các hàng trong loại bảng đó.
Marco Demaio

225

CHAR

  1. Được sử dụng để lưu trữ giá trị chuỗi ký tự có độ dài cố định .
  2. Tối đa không. trong số các ký tự, kiểu dữ liệu có thể chứa là 255 ký tự .
  3. nhanh hơn 50% so với VARCHAR.
  4. Sử dụng cấp phát bộ nhớ tĩnh .

VARCHAR

  1. Được sử dụng để lưu trữ dữ liệu chữ và số có độ dài thay đổi .
  2. Tối đa loại dữ liệu này có thể giữ là tối đa
    • Pre-MySQL 5.0.3: 255 ký tự .
    • Post-MySQL 5.0.3: 65.535 ký tự được chia sẻ cho hàng.
  3. chậm hơn CHAR.
  4. Sử dụng cấp phát bộ nhớ động .

3
Tôi hơi ngạc nhiên khi câu trả lời này đã được nêu lên rất thường xuyên. Tài liệu MySQL nêu rõValues in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS

2
không đề cập đến việc bạn có thể lưu trữ dữ liệu chữ và số trong char quá
ninjabber

44
Cái này nhanh hơn 50% dựa trên cái gì? Nhanh hơn 50% để làm gì? Trong điều kiện nào? Và bạn có ý nghĩa gì khi phân bổ bộ nhớ tĩnh so với động trong bối cảnh này?
Martin Smith

4
@MartinSmith Tôi cũng sẽ hỏi như vậy .. đừng nghĩ rằng thông tin đó là chính xác. Asktom.oracle.com/pls/asktom/ khăn
Ozgur Bar

2
-1; các tuyên bố về hiệu suất ở đây rất mơ hồ và không có căn cứ, sự khác biệt trong chiến lược phân bổ bộ nhớ (và tại sao nó quan trọng) không được đưa ra và tuyên bố rằng varchar lưu trữ "dữ liệu chữ và số" là một số lẻ; cột varchar chắc chắn có thể lưu trữ các ký tự không chữ và số!
Mark Amery

122

CHAR Vs VARCHAR

CHAR được sử dụng cho Biến cố định kích thước chiều dài cố định
VARCHAR được sử dụng cho biến kích thước chiều dài thay đổi.

Ví dụ

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

Đầu ra sẽ là

length(City)          Length(street)
10                    6

Kết luận: Để sử dụng không gian lưu trữ một cách hiệu quả, phải sử dụng VARCHAR Thay vì CHAR nếu độ dài biến là biến


4
Thành phố = char (10), Đường phố = varchar (10), thành phố = Pune, đường phố = Oxford, chiều dài (thành phố) = 4, chiều dài (đường phố) = 6
abdulwadood

2
truy vấn này (chọn độ dài (thành phố), chiều dài (đường phố) từ temp) sẽ đưa ra đầu ra sau trong mysql 5.7 mysql> chọn độ dài (thành phố), chiều dài (đường phố) từ temp; + -------------- + ---------------- + | chiều dài (thành phố) | chiều dài (đường phố) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 hàng trong bộ (0,00 giây)
Jasbeer Rawal

69

Một CHAR(x)cột chỉ có thể có chính xác các x ký tự.
Một VARCHAR(x)cột có thể có tối đa x ký tự.

Vì băm MD5 của bạn sẽ luôn có cùng kích thước, có lẽ bạn nên sử dụng một CHAR .

Tuy nhiên, bạn không nên sử dụng MD5 ở nơi đầu tiên; nó đã biết điểm yếu.
Sử dụng SHA2 thay thế.
Nếu bạn đang băm mật khẩu, bạn nên sử dụng bcrypt.


44
"Một cột CHAR (x) chỉ có thể có chính xác x ký tự.". Trên thực tế, bạn có thể thêm dữ liệu với ít hơn x ký tự, nhưng tôi nghĩ rằng bạn có nghĩa là nó luôn luôn ĐỔI 10 ký tự có giá trị bộ nhớ phía sau hậu trường.
Dan W

13
Bạn không biết tại sao họ lưu trữ băm md5, có rất nhiều, nhiều lý do hợp lệ để sử dụng md5 không liên quan gì đến bảo mật. Va chạm hoàn toàn không phổ biến và thuật toán nhanh hơn các thuật toán an toàn hơn.
John Hunt

1
Giả sử rằng cột CHAR (x) không thực thi chính xác các ký tự x thì có lý do nào để sử dụng nó trên VARCHAR (x) ngay cả đối với dữ liệu kích thước cố định không?
NeverEinatingQueue

11

Sự khác biệt giữa VARCHAR và CHAR trong MySQL là gì?

Để đưa ra câu trả lời, tôi muốn thêm rằng trong các hệ thống OLTP hoặc trong các hệ thống có cập nhật thường xuyên, hãy cân nhắc sử dụng CHARngay cả đối với các cột có kích thước thay đổi vì có thể VARCHARphân mảnh cột trong quá trình cập nhật.

Tôi đang cố gắng lưu trữ băm MD5.

Băm MD5 không phải là lựa chọn tốt nhất nếu bảo mật thực sự quan trọng. Tuy nhiên, nếu bạn sẽ sử dụng bất kỳ hàm băm nào, hãy xem xét BINARYloại cho nó thay vào đó (ví dụ MD5 sẽ tạo ra hàm băm 16 byte, như vậy BINARY(16)là đủ thay vì CHAR(32)32 ký tự đại diện cho các chữ số hex. Điều này sẽ tiết kiệm không gian hơn và hiệu quả về hiệu suất.


Theo lối suy nghĩ này, tôi sẽ sử dụng CHAR cho ID doanh nghiệp có nghĩa là dễ đọc và hiệu quả. Tôi vẫn sẽ sử dụng khóa chính bigint mặc dù.
Archimedes Trajano

9

Varchar cắt bỏ khoảng trắng ở cuối nếu các ký tự được nhập ngắn hơn độ dài khai báo, trong khi char thì không. Char sẽ đệm khoảng trắng và sẽ luôn là chiều dài của chiều dài khai báo. Về mặt hiệu quả, varchar có nhiều kinh nghiệm hơn vì nó cắt các ký tự để cho phép điều chỉnh nhiều hơn. Tuy nhiên, nếu bạn biết độ dài chính xác của char, char sẽ thực thi với tốc độ nhanh hơn một chút.


7

Trong hầu hết các RDBMS ngày nay, chúng là từ đồng nghĩa. Tuy nhiên, đối với những hệ thống vẫn có sự khác biệt, trường CHAR được lưu trữ dưới dạng cột có chiều rộng cố định. Nếu bạn xác định nó là CHAR (10), thì 10 ký tự được ghi vào bảng, trong đó "padding" (thường là khoảng trắng) được sử dụng để điền vào bất kỳ khoảng trống nào mà dữ liệu không sử dụng hết. Ví dụ: lưu "bob" sẽ được lưu dưới dạng ("bob" +7 dấu cách). Cột VARCHAR (ký tự biến) có nghĩa là lưu trữ dữ liệu mà không lãng phí thêm dung lượng mà cột CHAR thực hiện.

Như mọi khi, Wikipedia nói to hơn.


5

CHAR là trường có độ dài cố định; VARCHAR là một trường có chiều dài thay đổi. Nếu bạn đang lưu trữ các chuỗi có độ dài thay đổi lớn như tên, thì hãy sử dụng VARCHAR, nếu độ dài luôn giống nhau, thì hãy sử dụng CHAR vì nó hiệu quả hơn một chút và cũng nhanh hơn một chút.


Mặc dù tôi đoán rằng những tuyên bố về tốc độ và hiệu quả lưu trữ ở đây là đúng, nhưng cả hai đều không được chứng minh theo bất kỳ cách nào (và hoàn toàn có thể tin rằng chúng là sai), điều này khiến câu trả lời này không hữu ích; nó chỉ lặp đi lặp lại những gì người đọc có thể đã mong đợi là đúng, mà không làm gì để thực sự giúp xác nhận nó.
Đánh dấu Amery

1

CHAR là chiều dài cố định và VARCHAR là chiều dài thay đổi. CHAR luôn sử dụng cùng một dung lượng lưu trữ cho mỗi mục nhập, trong khi VARCHAR chỉ sử dụng lượng cần thiết để lưu trữ văn bản thực tế.


1

Char là kiểu dữ liệu ký tự có độ dài cố định, varchar là kiểu dữ liệu ký tự có độ dài thay đổi.

Vì char là loại dữ liệu có độ dài cố định, kích thước lưu trữ của giá trị char bằng với kích thước tối đa cho cột này. Vì varchar là loại dữ liệu có độ dài thay đổi, kích thước lưu trữ của giá trị varchar là chiều dài thực của dữ liệu được nhập, không phải kích thước tối đa cho cột này.

Bạn có thể sử dụng char khi các mục nhập dữ liệu trong một cột được dự kiến ​​có cùng kích thước. Bạn có thể sử dụng varchar khi các mục nhập dữ liệu trong một cột được dự kiến ​​sẽ thay đổi đáng kể về kích thước.


0

theo sách MySQL hiệu suất cao :

VARCHAR lưu trữ các chuỗi ký tự có độ dài thay đổi và là loại dữ liệu chuỗi phổ biến nhất. Nó có thể yêu cầu ít không gian lưu trữ hơn các loại có độ dài cố định, vì nó chỉ sử dụng nhiều dung lượng mà nó cần (nghĩa là sử dụng ít không gian hơn để lưu trữ các giá trị ngắn hơn). Ngoại lệ là bảng MyISAM được tạo bằng ROW_FORMAT = FIXED, sử dụng một lượng không gian cố định trên đĩa cho mỗi hàng và do đó có thể lãng phí không gian. VARCHAR giúp hiệu suất vì nó tiết kiệm không gian.

CHAR có độ dài cố định: MySQL luôn phân bổ đủ không gian cho số lượng ký tự được chỉ định. Khi lưu trữ giá trị CHAR, MySQL sẽ xóa mọi khoảng trắng ở cuối. (Điều này cũng đúng với VARCHAR trong MySQL 4.1 và các phiên bản cũ hơn CHAR CHAR và VAR CHAR giống hệt nhau về mặt logic và chỉ khác nhau ở định dạng lưu trữ.) Các giá trị được đệm bằng khoảng trắng khi cần để so sánh.


2
" VARCHAR giúp hiệu suất vì nó tiết kiệm không gian " Nó tiết kiệm không gian, vâng, nhưng nó không ảnh hưởng tiêu cực đến hiệu suất? VARCHARcần phải tự động phân bổ bộ nhớ theo và khi được yêu cầu, do đó làm giảm hiệu suất trái ngược với CHAR, phải không?
Spikatrix

@Spikatrix Phụ thuộc. Nếu các giá trị VARCHAR thường nhỏ nhưng có thể lên tới N byte, thì phân bổ động có thể tiết kiệm một lượng không gian và I / O đáng kể, có hiệu suất cao hơn cho nhiều dữ liệu. Các giá trị CHAR có độ dài gần bằng nhau sẽ có hiệu suất cao hơn. Đọc so với viết cũng có thể làm cho một sự khác biệt.
Andrew

-4

Char có độ dài cố định (hỗ trợ 2000 ký tự), viết tắt của ký tự là kiểu dữ liệu

Varchar có độ dài thay đổi (hỗ trợ 4000 ký tự)


-1; những con số này không đúng với MySQL. (Tôi nghĩ rằng họ có thể dành cho Oracle?)
Mark Amery

-5

Char hoặc varchar- nó được sử dụng để nhập dữ liệu texual trong đó độ dài có thể được chỉ định trong ngoặc Eg- name char (20)


Điều này không giải quyết câu hỏi ban đầu. OP đang yêu cầu sự khác biệt thực tế giữa các loại, không phải cú pháp và mục đích của các loại. Ngoài ra ()là dấu ngoặc đơn, không phải dấu ngoặc.
2mac

@ 2mac câu cuối cùng của bạn chỉ đúng với tiếng Anh Mỹ; ở Anh, chúng tôi gọi ()ngoặc, và nhiều người Anh thậm chí không nhận ra rằng có những phương ngữ tiếng Anh trong đó từ "ngoặc đơn" có thể chỉ một dấu chấm câu. Có một trường hợp mạnh được thực hiện để ưu tiên "dấu ngoặc đơn" cho "dấu ngoặc" - có thể, về mặt cân bằng, tùy chọn rõ ràng tối đa khi nhắm mục tiêu đối tượng lập trình viên quốc tế - nhưng đó là trường hợp phức tạp hơn "dấu ngoặc" là sai.
Đánh dấu Amery

-11

CHAR:

  • Hỗ trợ cả Nhân vật & Số.
  • Hỗ trợ 2000 ký tự.
  • Chiều dài cố định.

VARCHAR:

  • Hỗ trợ cả Nhân vật & Số.
  • Hỗ trợ 4000 ký tự.
  • Chiều dài thay đổi.

mọi ý kiến ​​...... !!!!

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.