codememo

Oracle에서 VARCHAR2의 크기가 1바이트로 선언된다는 것은 무엇을 의미합니까?

tipmemo 2023. 6. 27. 22:16
반응형

Oracle에서 VARCHAR2의 크기가 1바이트로 선언된다는 것은 무엇을 의미합니까?

포함할 수 있는 문자 수를 사용하여 을 선언할 수 있다는 것을 알고 있습니다.

에서, 안에하.Oracle제가 일하고 있는 데이터베이스에서 PDF라는 필드가 다음과 같이 정의되어 있음을 발견했습니다.

VARCHAR2(1 BYTE)

이것은 무엇을 의미합니까?몇 개의 문자를 포함할 수 있습니까?

또 다른 관련 질문:a와 a의 차이점은 무엇입니까?

열/변수를 varchar2(n CHAR) 및 varchar2(n바이트)로 선언할 수 있습니다.

n CHAR는 변수에 n개의 문자가 포함된다는 것을 의미합니다.멀티바이트 문자 집합에서는 저장할 바이트 수를 항상 알 수는 없지만 특정 문자의 저장을 보장해야 합니다.

n바이트는 단순히 저장할 바이트 수를 의미합니다.

바르샤르는 더 이상 사용되지 않습니다.사용하지 마십시오.바르샤르와 바르샤르2의 차이점은 무엇입니까?

VARCHAR 데이터 유형은 다음과 동의어입니다.VARCHAR2데이터 형식동작에서 발생할 수 있는 변경을 방지하려면 항상VARCHAR2변수 길이 문자열을 저장하는 데이터 형식입니다.

가 단일 에서 실행되는 데베이스가단바예문집실행경는되우서에합자일이트이터예:경(우:US7ASCII,WE8MSWIN1252또는WE8ISO8859P1)을VARCHAR2(x BYTE)또는VARCHAR2(x CHAR).

집합 DB 다 중 트 집 예 실 차 이 있 습 다 니 가 때 만 될 행 서 에 합가바이자문예(:)에서 실행될 가 있습니다.AL32UTF8또는AL16UTF16이 알 수

CREATE TABLE my_table (
    VARCHAR2_byte VARCHAR2(1 BYTE), 
    VARCHAR2_char VARCHAR2(1 CHAR)
);

INSERT INTO my_table (VARCHAR2_char) VALUES ('€');
1 row created.

INSERT INTO my_table (VARCHAR2_char) VALUES ('ü');
1 row created.

INSERT INTO my_table (VARCHAR2_byte) VALUES ('€');
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€')
Error at line 10
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 3, maximum: 1)

INSERT INTO my_table (VARCHAR2_byte) VALUES ('ü')
Error at line 11
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 2, maximum: 1)

VARCHAR2(1 CHAR)즉, 바이트 수에 관계없이 최대 1개의 문자를 저장할 수 있습니다.유니코드의 경우 한 문자가 최대 4바이트를 차지할 수 있습니다.

VARCHAR2(1 BYTE)최대 1바이트를 차지하는 문자를 저장할 수 있습니다.

중하지 않은 BYTE또는CHAR은 " 면기에가져니다옵서은값본그"에서 가져옵니다.NLS_LENGTH_SEMANTICS세션 매개 변수입니다.

설정할 수 가 없는 , 12c를 설정할 수 .MAX_STRING_SIZE=EXTENDED는 한는입니다VARCHAR2(4000 CHAR)

하지만,VARCHAR2(4000 CHAR)최대 4000자까지 저장할 수 있다는 의미는 아닙니다.제한은 여전히 4000바이트이므로 최악의 경우 이러한 필드에 최대 1000자만 저장할 수 있습니다.

예를 하십시오.UTF-8은 3바이트를 차지합니다):

CREATE TABLE my_table2(VARCHAR2_char VARCHAR2(4000 CHAR));

BEGIN
    INSERT INTO my_table2 VALUES ('€€€€€€€€€€');
    FOR i IN 1..7 LOOP
        UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;
    END LOOP;
END;
/

SELECT LENGTHB(VARCHAR2_char) , LENGTHC(VARCHAR2_char) FROM my_table2;

LENGTHB(VARCHAR2_CHAR) LENGTHC(VARCHAR2_CHAR)
---------------------- ----------------------
                  3840                   1280
1 row selected.


UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;

UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char
Error at line 1
ORA-01489: result of string concatenation is too long

참고 항목: BYTE CAR 의미론 사용의 예 및 제한(NLS_Length_SEMANTICS)(Doc ID 144808.1)

번째질문에 하기 위해: 번째질문대기위해하답에첫::
입니다. 바, 1바이트는 1글자를 할당합니다..

SQL> conn / as sysdba
Connected.
SQL> create table test (id number(10), v_char varchar2(10));

Table created.

SQL> insert into test values(11111111111,'darshan');
insert into test values(11111111111,'darshan')
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column


SQL> insert into test values(11111,'darshandarsh');
insert into test values(11111,'darshandarsh')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TEST"."V_CHAR" (actual: 12,
maximum: 10)


SQL> insert into test values(111,'Darshan');

1 row created.

SQL> 

다음 질문에 답하기 위해:사이의 차이varchar2그리고.varchar:

  1. VARCHAR최대 저장 가능2000 bytes에 있어서의 성격의.VARCHAR2최대 저장 가능4000 bytes인물의
  2. 데이터 유형을 다음과 같이 선언하는 경우VARCHAR그러면 그것은 공간을 차지할 것입니다.NULL values의 경우VARCHAR2데이터 유형입니다.not어떤 공간이든 차지합니다.

문자당 하나의 바이트만 할당됨을 의미합니다. 따라서 다중 바이트 문자 집합을 사용하는 경우 문자 1개가 맞지 않습니다.

한 문자를 저장할 수 있는 공간이 적어도 충분해야 한다는 것을 알고 있다면, 바이트를 저장하는 데 필요한 공간이 정확히 얼마인지 알고 있는 경우가 아니면 BYTE 구문을 사용하지 마십시오.

의심스러운 경우 VARCHAR2(1CHAR) 사용

여기에 답변된 것과 동일한 내용 열 데이터 유형의 BYTE와 CHAR의 차이

또한 12c에서 varchar2의 최대값은 4000이 아니라 32k입니다.그 이상이 필요하면 CLOB를 사용합니다.

Oracle에서 VARCHAR 사용 안 함

언급URL : https://stackoverflow.com/questions/30865064/what-does-it-mean-when-the-size-of-a-varchar2-in-oracle-is-declared-as-1-byte

반응형