Câu trả lời:
Giả sử bộ ký tự cơ sở dữ liệu là UTF-8, đây là cài đặt được đề xuất trong các phiên bản gần đây của Oracle. Trong trường hợp này, một số ký tự mất hơn 1 byte để lưu trữ trong cơ sở dữ liệu.
Nếu bạn xác định trường là VARCHAR2(11 BYTE)
, Oracle có thể sử dụng tối đa 11 byte để lưu trữ, nhưng thực tế bạn có thể không lưu trữ được 11 ký tự trong trường, vì một số trong số chúng mất nhiều hơn một byte để lưu trữ, ví dụ như các ký tự không phải tiếng Anh.
Bằng cách xác định trường khi VARCHAR2(11 CHAR)
bạn nói với Oracle, nó có thể sử dụng đủ dung lượng để lưu trữ 11 ký tự, bất kể cần bao nhiêu byte để lưu trữ mỗi ký tự. Một ký tự đơn có thể yêu cầu tối đa 4 byte.
Một cái có không gian chính xác cho 11 byte, cái còn lại cho chính xác 11 ký tự. Một số bộ ký tự như các biến thể Unicode có thể sử dụng nhiều hơn một byte cho mỗi char, do đó trường 11 byte có thể có không gian cho ít hơn 11 ký tự tùy thuộc vào mã hóa.
Xem thêm http://www.joelonsoftware.com/articles/Unicode.html
Tùy thuộc vào cấu hình hệ thống, kích thước của CHAR được đặt trong BYTES có thể khác nhau. Trong ví dụ của bạn:
Tôi không chắc vì tôi không phải là người dùng Oracle, nhưng tôi cho rằng sự khác biệt nằm ở khi bạn sử dụng các bộ ký tự nhiều byte như Unicode (UTF-16/32). Trong trường hợp này, 11 Byte có thể chiếm ít hơn 11 ký tự.
Ngoài ra, các loại trường đó có thể được xử lý khác nhau liên quan đến các ký tự hoặc trường hợp có dấu, ví dụ 'binaryField (ete) = "été"' sẽ không khớp trong khi 'charField (ete) = "été"' có thể (một lần nữa không chắc chắn về Oracle) .
VARCHAR2
. Khai báo aVARCHAR2(4000 CHAR)
sẽ cho phép ít hơn 4000 ký tự nếu một số ký tự yêu cầu nhiều byte lưu trữ.