[sql] 열 데이터 유형에서 BYTE와 CHAR의 차이점

Oracle에서는 다음과 같은 차이점이 있습니다.

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)



답변

데이터베이스 문자 세트가 UTF-8이라고 가정 해 봅시다. 이것은 최신 버전의 Oracle에서 권장되는 설정입니다. 이 경우 일부 문자는 데이터베이스에 저장하는 데 1 바이트 이상이 걸립니다.

필드를으로 정의하면 VARCHAR2(11 BYTE)Oracle은 스토리지에 최대 11 바이트를 사용할 수 있지만 실제로는 11 자 이상의 문자를 저장할 수 없습니다. 일부 문자는 영어 이외의 문자와 같이 1 바이트 이상을 저장하기 때문입니다.

VARCHAR2(11 CHAR)Oracle에 말한 대로 필드를 정의하면 각 바이트를 저장하는 데 걸리는 바이트 수에 관계없이 11자를 저장할 수있는 충분한 공간을 사용할 수 있습니다. 단일 문자는 최대 4 바이트를 요구할 수 있습니다.


답변

하나는 정확히 11 바이트를위한 공간이고 다른 하나는 정확히 11자를위한 공간입니다. 유니 코드 변형과 같은 일부 문자 집합은 문자 당 하나 이상의 바이트를 사용할 수 있으므로 11 바이트 필드에는 인코딩에 따라 11 자 미만의 공백이있을 수 있습니다.

참조 http://www.joelonsoftware.com/articles/Unicode.html


답변

시스템 구성에 따라 BYTES로 측정 된 CHAR 크기는 다를 수 있습니다. 귀하의 예에서 :

  1. 필드를 11 바이트로 제한
  2. 필드를 11 명의 CHAR 행위자로 제한

결론 : 1 CHAR은 1 BYTE와 같지 않습니다.


답변

Oracle 사용자가 아니기 때문에 확실하지 않지만 유니 코드 (UTF-16 / 32)와 같은 멀티 바이트 문자 세트를 사용할 때 차이점이 있다고 가정합니다. 이 경우 11 바이트는 11 자 미만을 차지할 수 있습니다.

또한 해당 필드 유형은 악센트 부호 문자 나 대소 문자와 관련하여 다르게 취급 될 수 있습니다. 예를 들어 ‘binaryField (ete) = “ét锑는 일치하지 않지만 ‘charField (ete) = “ét锑는 (Oracle에 대해 확실하지 않음) .


답변