Sự khác biệt giữa varchar và varchar2 trong Oracle là gì?


Câu trả lời:


336

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 NULLvà chuỗi rỗng trong tương lai, như ANSIquy định tiêu chuẩn.

VARCHAR2không phân biệt giữa một NULLchuỗi rỗng và sẽ không bao giờ.

Nếu bạn dựa vào chuỗi rỗng và NULLlà cùng một thứ, bạn nên sử dụng VARCHAR2.


40
Chưa từng nghe lý do đó trước đây, điều đó hữu ích. Cảm ơn. Đối với hồ sơ, vẫn còn hoàn toàn lố bịch khi loại nhân vật chính trong Oracle là "varchar2". Không phải điều đó tấn công bất cứ ai khác như một loại bùn khủng khiếp sao? Có vẻ như tôi đã giải quyết được một số vấn đề trong tuần đầu tiên học lập trình.
Ian Varley

7
@Ian: loại chính là VARCHAR2vì hiện tại không có loại nào hoạt động như bình VARCHARthường. Trên thực tế, bạn hoàn toàn không nên sử dụng VARCHARcho đến khi nó được thực hiện đúng cách.
Quassnoi

11
Cảm ơn, @Quassnoi. Vì vậy, tôi đoán phần ngu ngốc là Oracle không có VARCHAR thích hợp như mọi cơ sở dữ liệu khác, sau đó? Có điều gì đó ngu ngốc đang diễn ra ở đây, tôi chắc chắn về điều đó ... :)
Ian Varley

11
@Ian: khi Oracle đang được phát triển, không có tiêu chuẩn nào. Vào thời điểm các tiêu chuẩn xuất hiện, nó đã có một gánh nặng của các ứng dụng cũ. Chúng ta đều biết làm thế nào nó xảy ra.
Quassnoi

5
Xin lỗi, thực sự là @UnKnown, người đã viết bình luận không chính xác mà tôi đang phản hồi . Thực tế là where x is NULLkết quả lợi nhuận khác nhau từ where x = ''không không có nghĩa là NULL''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.
Dan Lenski

38

Hiện tại VARCHAR hoạt động giống hệt như VARCHAR2. Tuy nhiên, loại VARCHARkhông nên được sử dụng vì nó được dành riêng cho sử dụng trong tương lai.

Lấy từ: Sự khác biệt giữa CHAR, VARCHAR, VARCHAR2


@PhilipRego VARCHARkhông nên được sử dụng. Tôi đã chỉnh sửa nó
bugybunny

29

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à VARCHAR2là một kiểu dữ liệu nội bộVARCHARlà 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 VARCHAR2dữ 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 VARCHAR2có 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 VARCHAR2có thể là 32767 byte

Kiểu VARCHARdữ 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 đó, VARCHARchuỗ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 VARCHARdạng giả cho VARCHAR2. Nó KHÔNG phải SYNONYMlà 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 VARCHARtù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 ++


1
Vì vậy, điều này có nghĩa là VARCHARvẫn còn đối xử '' == null?

2
Đúng. Các cuộc thảo luận về các loại nội bộ và bên ngoài ở trên là từ tài liệu tham khảo OCI. Các 12,2 SQL Language Reference vẫn mang cùng một 'không sử dụng' tuyên bố nó đã luôn luôn có cho VARCHAR.
William Robertson

Đây là lý do tại sao tôi đã thảo luận về sự khác biệt của OCI, nếu không, nó được dành riêng cho việc sử dụng trong tương lai hoặc như họ nói 'độ dài biến' có thể là gợi ý cho các bộ ký tự như UTF8 nhiều byte ...
sandman

1
Bạn đã chỉ ra rằng các giá trị được khai báo là VARCHAR được lưu trữ trong cơ sở dữ liệu dưới dạng VARCHAR2 tuy nhiên độ dài tối đa của VARCHAR (65533 byte) lớn hơn độ dài tối đa của VARCHAR2 (32767 byte). Làm thế nào để cơ sở dữ liệu xử lý này?
Piotr Dobrogost

IIRC, từ lâu (Có lẽ là Oracle 6?) Đã có một loại VARCHAR đã ghi sai cách viết vào phần đệm không gian - hoặc nó đã cắt bớt khoảng trắng? AAR, VARCHAR2 là câu trả lời. Oracle đã nói rằng họ sẽ mang VARCHAR trở lại nhưng, tôi chắc chắn rằng, sẽ có sự nghiến răng khi chuỗi rỗng KHÔNG PHẢI LÀ NULL.
JMD

2

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

  1. Bản demo Rextester cho Oracle 11g: Chuỗi rỗng được chèn dưới dạngNULLs cho cả haiVARCHARVARCHAR2.
  2. Bản demo LiveQuery cho Oracle 12c: Kết quả tương tự.

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 .


0
  1. 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ự.

  2. 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.


2
Tôi nghĩ rằng câu trả lời này là khó hiểu VARCHARvới CHAR.
Jon Heller

0

Hiện tại, họ giống nhau. nhưng trước đây

  1. Ở đâu đó trên mạng, tôi đọc rằng,

VARCHARđược Oracle dành riêng để hỗ trợ phân biệt giữa NULLvà chuỗi rỗng trong tương lai, như quy định của ANSI.

VARCHAR2không phân biệt giữa một NULLchuỗi rỗng và sẽ không bao giờ.

  1. Cũng thế,

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


Tôi tình cờ thấy bài đăng này gần đây, xin lưu ý rằng nó không chính xác. Thực hiện các trường sau và cả hai trường sẽ có 3 ký tự: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;
Brian Leach

-1

VARCHAR là từ đồng nghĩa của VARCHAR2. Tuy nhiên, bạn không nên sử dụng VARCHAR vì Oracle có thể thay đổi ngữ nghĩa của nó trong tương lai.

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.