Sự khác biệt giữa các kiểu dữ liệu VARCHAR và VARCHAR2 của Oracle là gì?


Câu trả lời:


26

Dường như Oracle đã có kế hoạch đưa ra một định nghĩa khác cho VARCHAR so với VARCHAR2 . Nó đã nói với khách hàng điều này và khuyến nghị không sử dụng VARCHAR . Dù kế hoạch của họ là gì, kể từ ngày 11.2.0.2, VARCHAR giống hệt với VARCHAR2 . Đây là những gì Tài liệu tham khảo ngôn ngữ SQL 11g Phiên bản 2 nói:

Không sử dụng kiểu dữ liệu VARCHAR. Sử dụng kiểu dữ liệu VARCHAR2 thay thế. Mặc dù loại dữ liệu VARCHAR hiện đồng nghĩa với VARCHAR2, loại dữ liệu VARCHAR được lên lịch để được xác định lại là loại dữ liệu riêng được sử dụng cho các chuỗi ký tự có độ dài thay đổi so với các ngữ nghĩa so sánh khác nhau.

Các tài khoản của PL / SQL Hướng dẫn và tham khảo 10g Release 2 puts nó theo cách này:

Hiện tại, VARCHAR đồng nghĩa với VARCHAR2. Tuy nhiên, trong các bản phát hành PL / SQL trong tương lai, để phù hợp với các tiêu chuẩn SQL mới nổi, VARCHAR có thể trở thành một kiểu dữ liệu riêng biệt với các ngữ nghĩa so sánh khác nhau. Đó là một ý tưởng tốt để sử dụng VARCHAR2 chứ không phải VARCHAR.

Tài liệu về khái niệm cơ sở dữ liệu 10g Phiên bản 2g nói điều tương tự về mặt mạnh mẽ hơn:

Kiểu dữ liệu VARCHAR đồng nghĩa với kiểu dữ liệu VARCHAR2. Để tránh những thay đổi có thể xảy ra trong hành vi, luôn sử dụng kiểu dữ liệu VARCHAR2 để lưu trữ chuỗi ký tự có độ dài thay đổi.

Tài liệu Oracle 9.2 và 8.1.7 nói về cơ bản là giống nhau, vì vậy mặc dù Oracle liên tục không khuyến khích sử dụng VARCHAR , cho đến nay họ vẫn chưa làm gì để thay đổi tính chẵn lẻ của nó với VARCHAR2 .


Tôi nhớ varchar2 trong Oracle 8i, nhưng tôi không chắc nó có giống varchar không.
bernd_k


Có dấu hiệu cho thấy tại một số thời điểm trước 8i định nghĩa có thể khác.
Leigh Riffel

Tôi đã từng nghĩ rằng có một giới hạn độ dài khác nhau varchartrước phiên bản 8, nhưng tôi không thể tìm thấy bất cứ điều gì có uy tín để sao lưu điều này và bây giờ tự hỏi liệu nó chỉ là một huyền thoại.
Jack Douglas

@Jack Douglas - Tôi không thể tìm thấy bất cứ điều gì trong tài liệu Oracle 7 về điều đó. Từ docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> Oracle 7 Server >> Máy chủ Concepts >> Oracle kiểu dữ liệu (không thể liên kết trực tiếp với nó) nói khá nhiều điều tương tự như sau phiên bản. Trong một phần khác của tài liệu phiên bản 7, nó nói rằng trong phiên bản 6 Varchar và Varchar2 là từ đồng nghĩa với char.
Leigh Riffel

25

Hiện tại, hai là đồng nghĩa.

VARCHAR là loại dữ liệu tiêu chuẩn ANSI nhưng việc triển khai loại dữ liệu VARCHAR của Oracle vi phạm tiêu chuẩn ANSI bằng cách xem xét chuỗi trống là NULL (triển khai của Oracle có trước tiêu chuẩn ANSI). Như Leigh chỉ ra, Oracle đã tuyên bố rằng ngữ nghĩa của kiểu dữ liệu VARCHAR có thể thay đổi trong tương lai liên quan đến cách xử lý chuỗi rỗng. Nếu và khi điều đó xảy ra, ngữ nghĩa của kiểu dữ liệu VARCHAR2 sẽ giữ nguyên. Sử dụng kiểu dữ liệu VARCHAR2 sẽ an toàn hơn vì bạn không phải lo lắng rằng một số phiên bản tương lai của Oracle sẽ phá vỡ mã của bạn bằng cách khiến các chuỗi trống không còn được coi là NULL.


3

Bởi vì trong tiêu chuẩn SQL ban đầu, VARCHAR có 255 ký tự và ít nhất Oracle đã có một cú đâm tuân thủ các tiêu chuẩn trong những ngày đó.


Điều đó mang lại hy vọng để thấy Oracle varchar3 (max) trong một số năm.
bernd_k

Sql-server không gặp vấn đề gì khi tăng độ dài cho phép từ 255 lên 8000 (và thậm chí là tối đa). Tại sao Oracle cần một kiểu dữ liệu khác.
bernd_k

1
Không cần a varchar(max), chỉ cần sử dụng aCLOB
a_horse_with_no_name

3
CLOB có ngữ nghĩa khác với VARCHAR2
Gaius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.