programing

Oracle에서 볼 수 있는 문자열의 실제 길이

magicmemo 2023. 8. 14. 22:47
반응형

Oracle에서 볼 수 있는 문자열의 실제 길이

그래서 Oracle 데이터베이스에 데이터를 저장하려고 합니다.문자열이 있습니다.

Väste

(어디선가 있는 주의 이름).

.length()를 실행하면 5가 되지만 데이터베이스에 저장하면 다음과 같이 됩니다.

ORA-12899: value too large for column "dude"."POST_ADR"."STATE_CD" (actual: 6, maximum: 5)

그럼 어떻게 "오라클" 길이를 얻을 수 있을까요?

다른 사람들이 보여준 것처럼 Oracle 데이터베이스의 문자 집합을 사용하여 Java 문자열을 바이트 배열로 변환한 다음 이 문자열에서 길이를 바이트 단위로 가져올 수 있습니다.그러나 데이터베이스의 문자 집합이 무엇인지 알고 있어야 합니다. 데이터베이스마다 문자 집합이 다르므로 같은 문자열의 바이트 길이가 다릅니다.

데이터베이스가 UTF-8과 같은 가변 너비 문자 집합을 사용하고 있다고 가정합니다.NLS_CHARACTERSET또한 Oracle에서 바이트 길이가 아닌 문자 길이를 기준으로 열을 선언할 수 있습니다.문자열의 문자 길이만 확인할 수 있으므로 코드를 단순화할 수 있습니다.또한 사용자의 의사소통을 단순화합니다.일반적으로 필드가 문자열의 일부인 문자에 따라 2개의 문자열을 거부하는 반면 필드가 5개의 문자를 저장할 수 있는 이유를 사용자가 이해하기 어렵습니다(UTF-8 문자 집합에서 1개의 문자는 최대 3바이트의 저장소가 필요할 수 있음).

기본적으로 열을 선언할 때

CREATE TABLE foo (
  col_name VARCHAR2(5)
);

최대 5바이트의 데이터를 허용하도록 Oracle에 지시합니다.그러나 바이트 수에 관계없이 5자의 데이터를 허용하려면 문자 길이 의미론을 사용할 수 있습니다.

CREATE TABLE foo (
  col_name VARCHAR2(5 CHAR)
);

DDL을 실행하는 동안 모든 테이블에 대해 이 작업을 수행할 것이라고 가정하면 다음과 같이 설정할 수도 있습니다.nls_length_semanticsDDL을 실행하기 전에 세션 수준에서

ALTER SESSION SET nls_length_semantics = CHAR;

CREATE TABLE foo (
  col_name VARCHAR2(5)
);

최대 5자의 데이터를 허용하는 열이 있는 테이블을 만듭니다.

Oracle은 이 길이를 바이트 단위로 제공합니다."ä"는 UTF-8(c3a4)의 2바이트입니다.

자세한 내용은 여기를 참조하십시오.

다음을 사용하여 길이를 바이트 단위로 표시할 수 있습니다.str.getBytes("UTF-8").length

합성 문자를 사용하고 있기 때문에 기본 바이트 배열을 얻은 다음 해당 길이를 얻어야 합니다.

"Väste".getBytes(java.nio.charset.StandardCharsets.UTF_8).length

6을 출력할 것입니다.

쿼리를 사용하여 문자열의 오라클 바이트 길이를 얻으려는 사용자는

SELECT
   LENGTHB ('Test') "Length in bytes"
FROM
   DUAL;

결과는 4로 나옵니다.

참조: http://www.dba-oracle.com/t_lengthb_lengthc_length2_length4.htm

public static int getByteSize(String content) {
    int size = 0;
    if (null != content) {
        try {
            size = content.getBytes("utf-8").length;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    return size;
}

System.out.println("Väste"); // 6 System.out.println("Bää"); // 7

언급URL : https://stackoverflow.com/questions/24126902/true-length-of-a-string-as-seen-by-oracle

반응형