2008-09-17 19 views

Trả lời

219

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 Oracle gần đây. 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 bạn thực sự không thể lưu trữ 11 ký tự trong trường, vì một số trong số đó có nhiều hơn một byte để lưu trữ, ví dụ: các ký tự không phải tiếng Anh.

Bằng cách xác định trường là VARCHAR2(11 CHAR) bạn nói với Oracle rằng nó có thể sử dụng đủ không gian để lưu trữ 11 ký tự, bất kể số byte cần để lưu trữ mỗi ký tự là bao nhiêu. Một ký tự đơn có thể yêu cầu tối đa 4 byte.

+44

Lưu ý rằng ngữ nghĩa độ dài ký tự không ảnh hưởng đến độ dài tối đa 4000 byte cho 'VARCHAR2'. Khai báo một 'VARCHAR2 (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ữ. –

+0

@David Sykes Đây có phải là ngữ nghĩa giống với NVARCHAR (11) không? – Nap

+0

@Nap Không xa như tôi biết. Tôi tin rằng tham số kích thước trong khai báo kiểu NVARCHAR có ý nghĩa như trong VARCHAR2. tức là để đảm bảo đủ dung lượng lưu trữ cho 11 ký tự (không phải byte) trong bộ ký tự NVARCHAR, bạn sẽ nói NVARCHAR (11 CHAR). LƯU Ý: Tôi chưa thực sự kiểm tra điều này. Tôi chưa bao giờ sử dụng NVARCHAR. –

19

Một có chính xác không gian cho 11 byte, một cho chính xác 11 ký tự. Một số bộ ký tự như 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

3

Tôi không chắc chắn vì tôi không phải là một người sử dụng Oracle, nhưng tôi cho rằng sự khác biệt nằm khi bạn sử dụng bộ ký tự đa 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ự có dấu trọng âm hoặc trường hợp, ví dụ 'binaryField (ete) = "été"' sẽ không khớp trong khi 'charField (ete) = "été"' có thể (không phải là một lần nữa) chắc chắn về Oracle).

15

Tùy thuộc vào cấu hình hệ thống, kích thước của CHAR mesured theo byte có thể khác nhau. Trong ví dụ của bạn:

  1. giới hạn lĩnh vực đến 11 BYTE
  2. giới hạn lĩnh vực đến 11 CHAR acters


Kết luận: 1 CHAR không bằng 1 BYTE.