2012-04-10 28 views
8

Tự hỏi không gian lưu trữ thực tế sẽ được chiếm bởi hai kiểu dữ liệu này, vì tài liệu MySQL không rõ ràng về vấn đề này.Bộ ký tự và kích cỡ lưu trữ của MySQL char & varchar

CHAR (M) M × w byte, 0 < = M < = 255, trong đó w là số byte cần thiết cho việc ký tự tối đa độ dài trong bộ ký tự

VARCHAR (M) , VARBINARY (M) L + 1 byte nếu giá trị cột đòi hỏi 0-255 byte, L + 2 byte nếu giá trị có thể đòi hỏi nhiều hơn 255 byte

này dường như ngụ ý với tôi rằng, cho một utf8-mã hóa cơ sở dữ liệu, một CHAR sẽ luôn luôn mất 32 bit cho mỗi ký tự, trong khi một VARCHAR sẽ mất từ 8 đến 32 tùy thuộc vào độ dài byte thực tế của các ký tự được lưu trữ. Đúng không? Hoặc một VARCHAR ngụ ý một chiều rộng ký tự 8-bit, và lưu trữ multi-octet UTF8 ký tự thực sự tiêu thụ nhiều 'ký tự' từ VARCHAR? Hoặc VARCHAR cũng luôn lưu trữ 32 bit cho mỗi ký tự? Rất nhiều khả năng.

Không phải thứ mà tôi từng phải lo lắng nhiều về trước đây, nhưng tôi bắt đầu đạt đến giới hạn kích thước bảng tạm thời trong bộ nhớ và tôi không nhất thiết phải tăng cường nhóm khả dụng của MySQL (thứ hai thời gian).

Trả lời

8

CHARVARCHAR cả hai ký tự đếm. Cả hai đều tính dung lượng lưu trữ tối đa mà họ có thể yêu cầu cho mã hóa và độ dài ký tự. Đối với ASCII, đó là 1 byte cho mỗi ký tự. Đối với UTF-8, đó là 3 byte cho mỗi ký tự (không phải 4 như bạn mong đợi, bởi vì MySQL's Unicode support is crippled vì một số lý do và không hỗ trợ bất kỳ ký tự Unicode nào yêu cầu 4 byte trong UTF-8). Cho đến nay, CHARVARCHAR đều giống nhau.

Bây giờ, CHAR chỉ cần tiếp tục và dự trữ số lượng bộ nhớ này.

VARCHAR thay vì phân bổ 1 hoặc 2 byte, tùy thuộc vào dung lượng lưu trữ tối đa này là < 256 hoặc ≥ 256. Và số lượng không gian thực tế chiếm bởi mục nhập là một hoặc hai byte, cộng với lượng không gian thực sự chiếm đóng chuỗi.

Điều thú vị là, điều này làm cho 85 một con số kỳ diệu cho UTF-8 VARCHAR:

  • VARCHAR(85) sử dụng 1 byte cho chiều dài vì độ dài tối đa có thể là 85 (tê liệt) UTF-8 ký tự là 3 × 85 = 255.
  • VARCHAR(86) sử dụng 2 byte cho chiều dài vì độ dài tối đa có thể của 86 (tê liệt) UTF-8 ký tự là 3 × 86 = 258.
+1

để thêm vào đó, 'lưu trữ utf8' MySQL không phải là chỉ bị tê liệt, nó không phải là tiêu chuẩn của bạn UTF-8. Các chuỗi được mã hóa của 'utf8' được lưu trữ bằng cách sử dụng gấp đôi lưu trữ các chuỗi mã hóa UTF-8 thông thường, làm cho nó còn kém hiệu quả hơn. – deceze

+0

@deceze Tôi không biết điều đó. Bạn có bất kỳ chi tiết hoặc tham chiếu về điều đó không? – Celada

+0

Tôi ước gì tôi đã làm, nhưng tài liệu không nói nhiều về nó. Có một câu hỏi gần đây ở đây về việc bán phá giá cơ sở dữ liệu nơi dữ liệu được bán trong nhị phân-như-mặc dù, đó là nơi điều này là rất rõ ràng. – deceze

Các vấn đề liên quan