콘텐츠로 이동

(KO) CUBRID 국제화 — 섹션 개요

이 섹션은 국제화 기본 요소(i18n primitives) — 모든 문자열 연산자, 모든 비교, 모든 날짜 산술이 결국 거치게 되는 횡단 능력만 다룬다. 정확히 두 가지: 코드셋+콜레이션, 그리고 타임존이다. 둘 다 인프라스트럭처여서 엔진 나머지 안으로 사라져 버리고, 저장·질의 레이어가 들고 다니는 작고 불투명한 ID(LANG_COLLATION 인덱스, 32비트 TZ_ID)로만 표면화된다 — 정작 그 ID 안을 들여다보는 일은 거의 없다.

이 섹션은 예전엔 i18n + 특수 기능(specialty)이라는 더 넓은 잡동사니였다. 거기 들어 있던 자기-완결적 기능들은 더 자연스러운 자리로 옮겨졌다.

  • JSON_TABLE — 질의 처리로 이동. executor의 scan_manager 레지스트리에 등록되는 SCAN_TYPE 한 가지로, 힙·리스트·B+Tree 스캔과 같은 줄에 선다. cubrid-json-table.md 참조.
  • SHOW 명령 — 신설된 시스템 카탈로그 섹션으로 이동, cubrid-catalog-manager 옆에 자리 잡았다. SHOW는 정적 카탈로그가 스키마를 노출할 때 쓰는 동일한 균일 SQL 표면으로 서버 런타임 상태를 노출한다. cubrid-overview-system-catalog.md 참조.
  • compactdb — 유틸리티로 이동, csql · cub-admin · loaddb · unloaddb와 같은 자리에 들어갔다. 오프라인 SA-mode 도구다. 유틸리티 묶음의 안내는 cubrid-utilities-misc.md 참조.

여기 남은 것은 교과서적 의미의 i18n — 로케일을 인식하는 텍스트와 시각, 즉 데이터베이스가 한 가지 이상의 인간 관행을 구사한다의 두 레이어다.

두 문서는 서로 독립적이다 (charset 코드는 timezone 코드를 호출하지 않고, 그 반대도 마찬가지). 그런데 한 자리에 둘 만한 이유가 있다 — 동일한 아키텍처 패턴을 공유하기 때문이다.

외부 표준 데이터를 CUBRID-빌드 공유 라이브러리로 컴파일한다. 서버 부팅 시 dlopen한다. 레코드별 상태를 작은 고정-폭 ID로 압축한다. 읽기 경로에서는 그 ID를 로딩된 라이브러리로 풀어낸다.

flowchart LR
    subgraph build["빌드 / 설치 시점"]
        LDML["LDML 로케일 룰<br/>(로케일별 XML)"]
        IANA["IANA tzdata<br/>(zone1970.tab,<br/>africa, asia, ...)"]
        GENL["genlocale 바이너리"]
        MKTZ["make_tz 바이너리"]
        CL["libcubrid_collations.so<br/>(UCA weight 테이블,<br/>코드셋별 비교자)"]
        TZ["libcubrid_timezones.so<br/>(zone, offset 룰,<br/>DS 룰 배열)"]
        LDML --> GENL --> CL
        IANA --> MKTZ --> TZ
    end
    subgraph runtime["cub_server 런타임"]
        BOOT["boot_sr → lang_init / tz_load_library"]
        LANG["LANG_COLLATION vtable<br/>fastcmp / strmatch / next_alpha_char"]
        TZID["TZ_ID 32비트<br/>(zone, offset 룰, DS 룰)"]
        BOOT -->|dlopen| CL
        BOOT -->|dlopen| TZ
        CL --> LANG
        TZ --> TZID
    end
    LANG -.공급.-> btree["B+Tree 키 비교<br/>· 정렬 · 해시 · LIKE / =<br/>· 모든 문자열 스칼라"]
    TZID -.공급.-> dt["DATETIMETZ / TIMESTAMPTZ<br/>· tz_create_datetimetz<br/>· tz_explain_tz_id<br/>· 모든 CAST · 모든 날짜 스칼라"]

cubrid-charset-collation.md — 텍스트. 네 가지 코드셋(binary, ISO-8859-1, EUC-KR, UTF-8); LDML 로케일 룰을 genlocale이 UCA 가중치 테이블로 컴파일해 플랫폼별 공유 라이브러리로 동봉; 비교는 함수 포인터 LANG_COLLATION vtable로 디스패치되어 B+Tree, 정렬, 해시, 모든 문자열 스칼라가 이를 소비한다.

cubrid-timezone.md — 시각. 원시 IANA tzdata 파일을 make_tz가 생성된 timezones.c와 공유 라이브러리 libcubrid_timezones.so로 컴파일; 32비트 TZ_ID(zone, gmt-offset 룰, DS 룰) 또는 raw 부호 있는 오프셋을 패킹; tz_datetime_utc_convLOCAL_STD / LOCAL_WALL / UTC AT qualifier와 spring-forward / fall-back 중첩을 존중하면서 wall-clock을 UTC로 푼다.

두 i18n 기본 요소는 서로 독립적이다. 작업하는 대상이 무엇이냐로 골라라.

문자열, 식별자, 비교, 색인, 정렬, 조인, 해싱이 작업 대상이라면 cubrid-charset-collation.md부터. 거의 모든 다른 문서가 결국 INTL_CODESET, LANG_COLLATION, 또는 lang_*cmp* 비교자 중 하나를 언급한다. 코드셋별 비교자 집합, LDML / UCA 파이프라인, LANG_GET_BINARY_COLLATION 매크로를 처음부터 설명하는 곳은 charset-collation 문서뿐이다.

날짜, 타임스탬프, 세션, 로컬 시간의 클라이언트-서버 의미가 작업 대상이라면 cubrid-timezone.md부터. TZ_ID 패킹, AT-time qualifier 의미론, 접속 시점 세션 region — 다른 곳에서 안 다룬다.

아키텍처 패턴이 보고 싶다면 둘을 연달아 읽어라. 외부 표준을 dlopen 가능한 .so로 컴파일, 작은 ID로 패킹, SQL로 노출은 두 서브시스템에서 동일하다. 연달아 읽으면 패턴이 또렷이 보이고, 다른 곳(예: PL bridge 라이브러리)에서도 같은 형태를 알아보게 된다.

두 기본 요소 모두 매우 깊게 연결되어 있다. 다른 섹션 거의 전부에 닿아 있고, 그 섹션을 제대로 읽으려면 이 두 레이어가 무엇을 대신 처리해 주고 있는지 알아야 한다.

  • Charset-collation은 B+Tree와 모든 문자열 연산자에 직접 공급된다. btree.c 핫 패스의 모든 비교자가 결국 LANG_COLLATION.fastcmp / LANG_COLLATION.strmatch 함수 포인터를 거친다. LIKE, =, <, ORDER BY, GROUP BY, sort-merge 조인 키, hash-join 해싱도 같다. 그래서 콜레이션 표면은 B+Tree(cubrid-btree.md), external sort(cubrid-external-sort.md), hash join(cubrid-hash-join.md), 문자열 스칼라(cubrid-scalar-functions.md)와 분리할 수 없다.
  • Timezone은 DATETIMETZ / TIMESTAMPTZ 변환과 세션 경계에서 공급된다. DB_DATETIMETZ 또는 DB_TIMESTAMPTZ 값에 손대는 모든 코드 — tz_create_datetimetz, tz_conv_tz_datetime_w_region, tz_explain_tz_id, 모든 CAST, 모든 날짜 산술 — 가 libcubrid_timezones.so에서 로딩된 TZ_DATA blob을 걸어 다닌다. 세션 수준 tz_Region_session / session_tz_region 런타임 변수는 이 흐름을 cubrid-network-protocol.md, cubrid-server-session.md, cubrid-boot.md로 묶어 준다.
  • 둘 다 토폴로지컬 부팅 순서에서 같은 단계에 표면화된다. lang_inittz_load_library는 같은 부트 페이즈 — sysparam 다음, 페이지 버퍼 / 로그 / 락 이전 — 에서 실행된다. 이후 모든 서브시스템이 문자열 비교나 타임스탬프 해석을 필요로 할 수 있기 때문이다. 전체 순서는 cubrid-boot.md 참조.
  • 둘 다 SHOW 명령으로 표면화된다. SHOW LOCALES와 SHOW TIMEZONES는 로딩된 .so의 인메모리 상태 — 로케일 이름, 코드셋, contraction 개수, DS 룰 개수 등 — 를 카탈로그 개요의 cubrid-overview-system-catalog.md 가상 스캔 경로로 노출한다. 엔진이 실제로 무얼 쓰고 있는가를 묻는 표준적 인트로스펙션 표면이다.
문서한줄 요약
cubrid-charset-collation.md네 가지 코드셋(binary, ISO-8859-1, EUC-KR, UTF-8) 텍스트 모델 + LANG_COLLATION vtable로 디스패치되는 로케일 인식 비교; LDML + UCA 가중치를 genlocale이 플랫폼별 공유 라이브러리로 컴파일해 서버가 부팅 시 dlopen한다.
cubrid-timezone.mdIANA tzdata가 libcubrid_timezones.so로 컴파일됨; 32비트 TZ_ID(zone, offset 룰, DS 룰) 또는 raw 부호 있는 오프셋을 패킹; tz_datetime_utc_convs / w / u AT-time qualifier와 중첩 구간을 존중하면서 zone별 오프셋·DS 룰을 걸어간다.