Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sự khác biệt chính giữa Varchar2 và char là gì

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ể:

  1. 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ụ:if firstnamelastname đều được định nghĩa là char(20) , sau đó firstname || lastname là cách viết ngắn hơn rpad(firstname,20) || rpad(lastname,20) để tạo Chuck Norris .
  2. Bạn cần phân biệt giữa chuỗi rỗng rõ ràng ''null . Thông thường chúng giống nhau trong Oracle, nhưng gán '' thành một char giá trị sẽ kích hoạt hành vi đệm trống của nó trong khi null 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 đó.
  3. 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ó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xuất kết quả truy vấn Oracle sang tệp HTML khi sử dụng SQLcl

  2. Truy vấn con trong câu lệnh select hoạt động như thế nào trong oracle

  3. Kiểm tra sid oracle và tên cơ sở dữ liệu

  4. Oracle có sử dụng đánh giá ngắn mạch không?

  5. MS Access sang Oracle dễ dàng Chuyển đổi / Di chuyển