Oracle에서 varchar와 varchar2의 차이점은 무엇입니까?


답변:


336

지금은 동의어입니다.

VARCHAR표준 규정에 따라 앞으로 빈 문자열과 빈 문자열의 Oracle구별을 지원하기 위해 예약되었습니다 .NULLANSI

VARCHAR2NULL빈 문자열과 빈 문자열을 구별하지 않으며 결코하지 않습니다.

빈 문자열을 사용하고 NULL동일한 것을 사용하는 경우을 사용해야합니다 VARCHAR2.


40
전에는 그 이론적 근거를들은 적이 없었습니다. 감사. 레코드의 경우 Oracle의 주요 문자 유형이 "varchar2"라는 것은 여전히 ​​우스운 일입니다. 그것은 끔찍한 kludge로 다른 사람을 공격하지 않습니까? 프로그램 학습 첫 주에 어떤 문제를 어떻게 해결했는지 알 것 같습니다.
이안 발리

7
@Ian : 기본 형식은 VARCHAR2현재 동작 VARCHAR해야하는 형식이 없기 때문 입니다. 실제로 VARCHAR제대로 구현 될 때까지 전혀 사용하지 않아야합니다 .
Quassnoi

11
감사합니다, @Quassnoi. 그래서 어리석은 부분은 오라클이 다른 모든 데이터베이스와 같이 적절한 VARCHAR을 가지고 있지 않다는 것입니다. 여기에 바보 같은 일이 있습니다. 확실합니다 ... :)
Ian Varley

11
@Ian : 오라클이 개발 될 당시에는 표준이 없었습니다. 표준이 등장 할 당시에는 이미 레거시 앱의 부담이있었습니다. 우리는 모두 그것이 어떻게 일어나는지 알고 있습니다.
Quassnoi 2016 년

5
죄송합니다. 실제로 @UnKnown이 내가 응답잘못된 댓글 을 작성한 사람 입니다. 사실 where x is NULL수익률 다른 결과가 where x = ''않습니다 하지 그 의미 NULL''어떤 방식으로 다른에 있습니다. 다른 동작은 =조작자 때문입니다.
Dan Lenski

38

현재 VARCHAR은 VARCHAR2와 정확히 동일하게 작동합니다. 그러나 VARCHAR향후 사용을 위해 예약되어 있으므로이 유형을 사용 해서는 안됩니다.

:에서 촬영 CHAR, VARCHAR, VARCHAR2의 차이점


@PhilipRego를 사용 VARCHAR해서는 안됩니다. 내가 그것을 편집
bugybunny

29

안정적인 최신 Oracle 프로덕션 버전 12.2 : 데이터 유형에서 가져옴

주요 차이점은이 VARCHAR2내부 데이터 유형VARCHAR외부 데이터 유형 . 내부 데이터 유형과 외부 데이터 유형의 차이점을 이해해야합니다.

데이터베이스 내에서 값은 테이블의 열에 저장됩니다. 내부적으로 Oracle은 내부 형식으로 알려진 특정 형식의 데이터를 나타냅니다 .

일반적으로 OCI (Oracle Call Interface) 응용 프로그램은 데이터의 내부 데이터 형식 표현이 아니라 작성된 언어로 미리 정의 된 호스트 언어 데이터 형식과 작동합니다. OCI 클라이언트 애플리케이션과 데이터베이스 테이블간에 데이터가 전송되면 OCI 라이브러리는 내부 데이터 유형과 외부 데이터 유형간에 데이터를 변환합니다.

외부 유형은 독점 데이터 형식 대신 호스트 언어 유형으로 작업 할 수 있도록하여 프로그래머에게 편의를 제공합니다. OCI는 Oracle 데이터베이스와 OCI 응용 프로그램간에 데이터를 전송할 때 광범위한 데이터 유형 변환을 수행 할 수 있습니다. Oracle 내부 데이터 유형보다 많은 OCI 외부 데이터 유형이 있습니다.

VARCHAR2데이터 형식은 4000 바이트의 최대 길이와 문자의 가변 길이 문자열입니다. init.ora 매개 변수 max_string_size가 기본값이면 최대 길이는 VARCHAR24000 바이트입니다. init.ora 매개 변수 max_string_size = extended 인 경우 최대 길이는 VARCHAR232767 바이트입니다.

VARCHAR다양한 길이의 데이터 유형 저장 문자열. 처음 2 바이트에는 문자열 길이가 포함되고 나머지 바이트에는 문자열이 포함됩니다. 바인드 또는 정의 호출에서 지정된 문자열 길이는 두 개의 길이 바이트를 포함해야하므로 VARCHAR수신 또는 송신 할 수있는 가장 큰 문자열은 65535가 아닌 65533 바이트입니다.

12.2 데이터베이스의 빠른 테스트는 같은 제안 내부 데이터 형식 , 오라클은 여전히 취급 VARCHARA와 유사 데이터 에 대한 VARCHAR2. SYNONYMOracle의 실제 객체 유형 은 아닙니다 .

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)

VARCHARProC / C ++ 프리 컴파일러 옵션 에 대한 영향도 있습니다. 관심이있는 프로그래머를위한 링크는 다음과 같습니다 : Pro * C / C ++ Programmer 's Guide


1
이것은 VARCHAR여전히 치료를 의미 '' == null합니까?

2
예. 위의 내부 유형과 외부 유형에 대한 설명은 OCI 참조에 있습니다. 12.2 SQL 언어 참조는 여전히 같은이 항상 VARCHAR에 대한했다 계산서를 사용하지 않는 '를 전달합니다.
윌리엄 로버트슨

이것이 제가 OCI의 차이점에 대해 논의한 이유입니다. 그렇지 않으면 향후 사용을 위해 예약되거나 멀티 바이트 UTF8과 같은 문자 세트에서 힌트를 줄 수있는 '가변 길이'라고 말한 것처럼 ...
sandman

1
VARCHAR로 선언 된 값은 데이터베이스에 VARCHAR2로 저장되지만 VARCHAR의 최대 길이 (65533 바이트)는 VARCHAR2의 최대 길이 (32767 바이트)보다 큽니다. 데이터베이스는 이것을 어떻게 처리합니까?
Piotr Dobrogost

IIRC, 오래 전 (아마도 Oracle 6?) 공간 패딩에 잘못 작동하는 VARCHAR 유형이 있었습니까? 아니면 공백을 잘랐습니까? AAR, VARCHAR2가 답이었습니다. 오라클은 VARCHAR을 다시 가져올 것이라고 말했지만 빈 문자열이 NULL이 아닌 경우 치아가 찢어 질 것입니다.
JMD


0
  1. VARCHAR은 최대 2000 바이트 문자를 저장할 수있는 반면 VARCHAR2는 최대 4000 바이트 문자를 저장할 수 있습니다.

  2. 데이터 유형을 VARCHAR로 선언하면 NULL 값의 공간을 차지합니다. VARCHAR2 데이터 유형의 경우 NULL 값에 대한 공간을 차지하지 않습니다. 예를 들어

    name varchar(10)

이름이 'Ravi__'인 경우에도 6 바이트의 메모리를 예약하지만

name varchar2(10) 

입력 문자열의 길이에 따라 공간을 예약합니다. 예를 들어, 'Ravi__'에 대한 4 바이트 메모리.

여기서 _는 NULL을 나타냅니다.

참고 : varchar는 null 값을위한 공간을 예약하고 varchar2는 null 값을위한 공간을 예약하지 않습니다.


2
이 답변이 VARCHAR와 혼동된다고 생각합니다 CHAR.
Jon Heller

0

현재는 동일합니다. 하지만 이전에는

  1. 인터넷 어딘가에서 나는 그것을 읽었다.

VARCHARNULLANSI 표준에서 규정 한대로 앞으로는 빈 문자열과 구별을 지원하기 위해 Oracle에서 예약합니다 .

VARCHAR2NULL빈 문자열과 빈 문자열을 구별하지 않으며 결코하지 않습니다.

  1. 또한,

Emp_name varchar(10)-10 자리 미만의 값을 입력하면 남은 공간을 삭제할 수 없습니다. 총 10 개의 공간을 사용했습니다.

Emp_name varchar2(10) -10 자리 미만의 값을 입력하면 남은 공간이 자동으로 삭제됩니다.


최근에이 게시물을 우연히 발견했습니다. 잘못된 게시물입니다. 다음을 실행하면 두 필드가 모두 3 자입니다.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은 VARCHAR2의 동의어입니다. 그러나 Oracle은 향후 시맨틱을 변경할 수 있으므로 VARCHAR을 사용하지 않아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.