Mặc dù đã có một số câu trả lời mô tả chính xác hoạt động của char
, Tôi nghĩ cần phải nói rằng bạn không nên sử dụng nó ngoại trừ ba trường hợp cụ thể:
- Bạn đang tạo một tệp hoặc báo cáo có độ dài cố định và chỉ định giá trị không phải null cho
char
tránh phải viết mãrpad()
biểu hiện. Ví dụ:iffirstname
vàlastname
đều được định nghĩa làchar(20)
, sau đófirstname || lastname
là cách viết ngắn hơnrpad(firstname,20) || rpad(lastname,20)
để tạoChuck Norris
. - Bạn cần phân biệt giữa chuỗi rỗng rõ ràng
''
vànull
. Thông thường chúng giống nhau trong Oracle, nhưng gán''
thành mộtchar
giá trị sẽ kích hoạt hành vi đệm trống của nó trong khinull
sẽ không, vì vậy nếu điều quan trọng là phải phân biệt được sự khác biệt và tôi thực sự không thể nghĩ ra lý do tại sao lại như vậy, thì bạn có cách để làm điều đó. - Mã của bạn được chuyển từ (hoặc cần tương thích với) một số hệ thống khác yêu cầu phần đệm trống vì các lý do cũ. Trong trường hợp đó, bạn đang gặp khó khăn với nó và bạn có thể thông cảm cho tôi.
Thực sự không có lý do gì để sử dụng char
chỉ vì một số độ dài được cố định (ví dụ:Y/N
cờ hoặc mã đơn vị tiền tệ ISO chẳng hạn như 'USD'
). Nó không hiệu quả hơn, nó không tiết kiệm dung lượng (không có chỉ báo độ dài thần thoại cho varchar2
, chỉ có một phần đệm trống cho char
), và nó không ngăn bất kỳ ai nhập các giá trị ngắn hơn. (Nếu bạn nhập 'ZZ'
trong char(3)
của bạn cột tiền tệ, nó sẽ chỉ được lưu trữ dưới dạng 'ZZ'
.) Nó thậm chí không tương thích ngược với một số phiên bản Oracle cổ đã từng dựa vào nó, vì chưa bao giờ có phiên bản này.
Và sự lây lan có thể lan rộng, vì (sau đây là phương pháp hay nhất) bạn có thể cố định một khai báo biến bằng cách sử dụng một cái gì đó như sales.currency%type
. Bây giờ l_sale_currency
của bạn biến là một char
ẩn sẽ vô hình được đệm trống cho các giá trị ngắn hơn (hoặc ''
), mở ra cánh cửa để che khuất các lỗi trong đó l_sale_currency
không bằng l_refund_currency
mặc dù bạn đã chỉ định 'ZZ'
cho cả hai.
Một số người cho rằng char(n)
(ở đâu n là một số ký tự) cho biết rằng các giá trị được mong đợi là n dài ký tự và đây là một hình thức tự lập tài liệu. Nhưng chắc chắn nếu bạn thực sự nghiêm túc về định dạng 3 ký tự (ví dụ:mã quốc gia ISO-Alpha-3 thay vì ISO-Alpha-2), bạn sẽ không xác định ràng buộc để thực thi quy tắc, thay vì để các nhà phát triển lướt qua một char(3)
kiểu dữ liệu và rút ra kết luận của riêng họ?
CHAR
đã được giới thiệu trong Oracle 6, tôi chắc chắn, vì lý do tương thích ANSI. Có thể có những khách hàng tiềm năng quyết định mua sản phẩm cơ sở dữ liệu nào và khả năng tương thích của ANSI nằm trong danh sách kiểm tra của họ (hoặc đã từng là trước đây) và CHAR
với phần đệm trống được định nghĩa trong tiêu chuẩn ANSI, vì vậy Oracle cần cung cấp nó. Bạn không nên thực sự sử dụng nó.