(KO) CUBRID 국제화 — 섹션 개요
CUBRID 국제화 — 섹션 개요
섹션 제목: “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_conv가 LOCAL_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_DATAblob을 걸어 다닌다. 세션 수준tz_Region_session/session_tz_region런타임 변수는 이 흐름을cubrid-network-protocol.md,cubrid-server-session.md,cubrid-boot.md로 묶어 준다. - 둘 다 토폴로지컬 부팅 순서에서 같은 단계에 표면화된다.
lang_init과tz_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.md | IANA tzdata가 libcubrid_timezones.so로 컴파일됨; 32비트 TZ_ID가 (zone, offset 룰, DS 룰) 또는 raw 부호 있는 오프셋을 패킹; tz_datetime_utc_conv가 s / w / u AT-time qualifier와 중첩 구간을 존중하면서 zone별 오프셋·DS 룰을 걸어간다. |
인접 섹션
섹션 제목: “인접 섹션”- 시스템 카탈로그 — 두 기본 요소 모두 SHOW 명령으로 표면화된다. SHOW COLLATION, SHOW LOCALES, SHOW TIMEZONES, SHOW FULL TIMEZONES가 가상 스캔 레지스트리로 인메모리
.so상태를 읽어낸다.cubrid-overview-system-catalog.md참조. - 저장 엔진. Charset-collation은 모든 B+Tree 비교자(
cubrid-btree.md)를 구동하고 external sort(cubrid-external-sort.md)로 표면화된다. Timezone은 여기에서 간접적으로만 닿는다 — 힙에 저장된 DATETIMETZ 값이TZ_ID를 들고 다니지만 저장 엔진 코드는 그 안을 들여다보지 않는다. - 질의 처리. 두 기본 요소 모두 스칼라 함수(
cubrid-scalar-functions.md), 옵티마이저의 콜레이션 인지 인덱스 선택(cubrid-query-optimizer.md), 실행기의 해시·정렬 비교자(cubrid-hash-join.md,cubrid-external-sort.md)로 표면화된다. - 서버 아키텍처. 둘 다
cubrid-boot.md에서 부팅 시dlopen된다. Timezone은 추가로cubrid-network-protocol.md와cubrid-server-session.md로 접속 시 관리되는 세션 수준 개념이기도 하다. 라이브러리 경로와 로케일 설정은 모두 시스템 파라미터(cubrid-system-parameters.md)에서 온다.