Câu trả lời:
Hiện tại, chúng là từ đồng nghĩa.
VARCHAR
được dành riêng Oracle
để hỗ trợ phân biệt giữa NULL
và chuỗi rỗng trong tương lai, như ANSI
quy định tiêu chuẩn.
VARCHAR2
không phân biệt giữa một NULL
chuỗi rỗng và sẽ không bao giờ.
Nếu bạn dựa vào chuỗi rỗng và NULL
là cùng một thứ, bạn nên sử dụng VARCHAR2
.
VARCHAR2
vì hiện tại không có loại nào hoạt động như bình VARCHAR
thường. Trên thực tế, bạn hoàn toàn không nên sử dụng VARCHAR
cho đến khi nó được thực hiện đúng cách.
where x is NULL
kết quả lợi nhuận khác nhau từ where x = ''
không không có nghĩa là NULL
và ''
trong bất kỳ cách nào khác. Các hành vi khác nhau là do các =
nhà điều hành.
Hiện tại VARCHAR hoạt động giống hệt như VARCHAR2. Tuy nhiên, loại VARCHAR
không nên được sử dụng vì nó được dành riêng cho sử dụng trong tương lai.
VARCHAR
không nên được sử dụng. Tôi đã chỉnh sửa nó
Lấy từ phiên bản sản xuất ổn định mới nhất của Oracle 12.2: Kiểu dữ liệu
Sự khác biệt chính là VARCHAR2
là một kiểu dữ liệu nội bộ và VARCHAR
là một kiểu dữ liệu bên ngoài . Vì vậy, chúng ta cần hiểu sự khác biệt giữa kiểu dữ liệu bên trong và bên ngoài ...
Trong cơ sở dữ liệu, các giá trị được lưu trữ trong các cột trong bảng. Trong nội bộ, Oracle đại diện cho dữ liệu ở các định dạng cụ thể được gọi là các loại dữ liệu nội bộ .
Nói chung, các ứng dụng OCI (Giao diện cuộc gọi của Oracle) không hoạt động với các biểu diễn dữ liệu bên trong của dữ liệu, nhưng với các loại dữ liệu ngôn ngữ máy chủ được xác định trước bởi ngôn ngữ mà chúng được viết. Khi dữ liệu được truyền giữa ứng dụng khách OCI và bảng cơ sở dữ liệu, các thư viện OCI chuyển đổi dữ liệu giữa các loại dữ liệu nội bộ và các loại dữ liệu bên ngoài.
Các kiểu bên ngoài cung cấp sự thuận tiện cho lập trình viên bằng cách làm cho nó có thể hoạt động với các loại ngôn ngữ máy chủ thay vì các định dạng dữ liệu độc quyền. OCI có thể thực hiện một loạt các chuyển đổi loại dữ liệu khi chuyển dữ liệu giữa cơ sở dữ liệu Oracle và ứng dụng OCI. Có nhiều kiểu dữ liệu ngoài OCI hơn các kiểu dữ liệu bên trong của Oracle.
Kiểu VARCHAR2
dữ liệu là một chuỗi ký tự có độ dài thay đổi với độ dài tối đa 4000 byte. Nếu tham số init.ora max_opes_size là mặc định, độ dài tối đa của a VARCHAR2
có thể là 4000 byte. Nếu tham số init.ora max_opes_size = được mở rộng, độ dài tối đa của a VARCHAR2
có thể là 32767 byte
Kiểu VARCHAR
dữ liệu lưu trữ các chuỗi ký tự có độ dài khác nhau. 2 byte đầu tiên chứa độ dài của chuỗi ký tự và các byte còn lại chứa chuỗi. Độ dài được chỉ định của chuỗi trong liên kết hoặc lệnh gọi xác định phải bao gồm hai byte độ dài, do đó, VARCHAR
chuỗi lớn nhất có thể nhận hoặc gửi là dài 65533 byte, không phải 65535.
Một thử nghiệm nhanh trong cơ sở dữ liệu 12.2 cho thấy rằng là một kiểu dữ liệu nội bộ , Oracle vẫn coi một VARCHAR
dạng giả cho VARCHAR2
. Nó KHÔNG phải SYNONYM
là một loại đối tượng thực tế trong Oracle.
SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create table test (my_char varchar(20));
Table created.
SQL> desc test
Name Null? Type
MY_CHAR VARCHAR2(20)
Ngoài ra còn có một số ý nghĩa của các VARCHAR
tùy chọn Trình biên dịch ProC / C ++. Đối với các lập trình viên quan tâm, liên kết có tại: Hướng dẫn lập trình viên Pro * C / C ++
Sau một số thử nghiệm (xem bên dưới), tôi có thể xác nhận rằng kể từ tháng 9 năm 2017, không có gì thay đổi liên quan đến chức năng được mô tả trong câu trả lời được chấp nhận : -
NULL
s cho cả haiVARCHAR
vàVARCHAR2
.Lý do lịch sử của hai từ khóa này được giải thích tốt trong một câu trả lời cho một câu hỏi khác nhau .
VARCHAR có thể lưu trữ tối đa 2000 byte ký tự trong khi VARCHAR2 có thể lưu trữ tới 4000 byte ký tự.
Nếu chúng ta khai báo kiểu dữ liệu là VARCHAR thì nó sẽ chiếm không gian cho các giá trị NULL. Trong trường hợp kiểu dữ liệu VARCHAR2, nó sẽ không chiếm bất kỳ khoảng trống nào cho các giá trị NULL. ví dụ,
name varchar(10)
sẽ dự trữ 6 byte bộ nhớ ngay cả khi tên là 'Ravi__', trong khi
name varchar2(10)
sẽ dự trữ không gian theo độ dài của chuỗi đầu vào. ví dụ: 4 byte bộ nhớ cho 'Ravi__'.
Ở đây, _ đại diện cho NULL.
LƯU Ý: varchar sẽ dành không gian cho các giá trị null và varchar2 sẽ không dành bất kỳ khoảng trống nào cho các giá trị null.
VARCHAR
với CHAR
.
Hiện tại, họ giống nhau. nhưng trước đây
VARCHAR
được Oracle dành riêng để hỗ trợ phân biệt giữa NULL
và chuỗi rỗng trong tương lai, như quy định của ANSI.
VARCHAR2
không phân biệt giữa một NULL
chuỗi rỗng và sẽ không bao giờ.
Emp_name varchar(10)
- nếu bạn nhập giá trị dưới 10 chữ số thì không gian còn lại sẽ không thể bị xóa. nó đã sử dụng tổng cộng 10 không gian.
Emp_name varchar2(10)
- nếu bạn nhập giá trị dưới 10 chữ số thì không gian còn lại sẽ tự động bị xóa
create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;