SAS 9.4 에서 EUC-KR 로 운영하던 데이터를 Viya 4 에서 그대로 쓰려고 세션 인코딩을 EUC-KR 로 맞추는 경우가 있다. 이때 바뀌는 범위와 바뀌지 않는 범위를 먼저 구분해야 한다.
| 영역 | 인코딩 변경 |
|---|---|
| Compute · Batch · SAS/CONNECT 세션 | 가능. Launcher 기본값으로 제어한다 |
| CAS 엔진 내부 | 불가. UTF-8 고정이다 |
| 플랫폼 메타데이터(PostgreSQL) · REST API · 웹 UI | 불가. UTF-8 고정이다 |
즉 "Viya 전체를 EUC-KR 로 바꾼다" 는 성립하지 않는다. 바꿀 수 있는 것은 SAS 코드를 실행하는 세션의 기본 인코딩뿐이다.
Launcher 가 세션 파드를 만들 때 주입하는 기본값은 sas-launcher-init-nls-config ConfigMap 에 들어 있다. SAS 는 이 값을 바꾸는 kustomize 예제를 제공한다.
apiVersion: builtin
kind: PatchTransformer
metadata:
name: sas-launcher-locale-encoding-defaults
patch: |-
- op: replace
path: /data/SAS_LAUNCHER_INIT_LOCALE_DEFAULT
value: ko_KR
- op: replace
path: /data/SAS_LAUNCHER_INIT_ENCODING_DEFAULT
value: euc-kr
target:
version: v1
kind: ConfigMap
name: sas-launcher-init-nls-config
이 파일은 Kubernetes 리소스가 아니라 kustomize 내장 변환기이므로 kubectl apply 로 직접 적용할 수 없다. site-config 에 두고 kustomization.yaml 의 transformers: 에 등록한 뒤 다시 빌드한다.
적용되면 새로 뜨는 Compute 파드의 환경 변수에서 값을 확인할 수 있다.
kubectl -n <namespace> describe pod <compute-pod> | grep SAS_LAUNCHER_INIT_
SAS_LAUNCHER_INIT_ENCODING_DEFAULT: euc-kr
SAS_LAUNCHER_INIT_LOCALE_DEFAULT: ko_KR
세션 안에서는 이렇게 확인한다.
proc options encoding locale;
run;
proc options option=encoding; 은 잘못된 문법이다. PROC OPTIONS 는 옵션 이름을 그대로 나열한다. 세션 안에서 임시로 바꿀 때만 options encoding=...; 형태를 쓴다.
Compute 세션이 EUC-KR 이고 CAS 는 UTF-8 이므로, 두 구간 사이에서 자동 트랜스코딩이 일어난다. 이 변환에서 실패하면 다음 오류가 난다.
ERROR: Some character data was lost during transcoding.
ERROR: Invalid multibyte character.
오류가 나지 않고 한글 일부가 물음표로 바뀐 채 넘어가는 경우가 더 위험하다. 조인과 필터가 조용히 어긋난다.
안전한 구조는 Compute 를 레거시 호환 계층으로만 쓰고, CAS 에는 UTF-8 로 변환한 데이터만 올리는 것이다.
SAS 9.4 데이터(EUC-KR)
-> Compute 세션(EUC-KR)에서 가공
-> 명시적 UTF-8 변환
-> CAS(UTF-8)에서 분석
CAS 액션의 파라미터 문자열(테이블명·컬럼명·WHERE 절)은 UTF-8 기준으로 처리되므로 ASCII 또는 UTF-8 로 작성한다.
라이브러리 목록에서 영문·숫자 테이블명은 정상인데 한글이 들어간 테이블명만 깨져 보이는 현상이 있다. 이것은 설정 실수가 아니라 구조 때문이다.
테이블 값의 인코딩과 테이블 이름의 인코딩은 처리 경로가 다르다. 값은 LIBNAME 의 encoding= 이 관여하지만, 이름은 CAS 메타데이터와 REST(JSON), PostgreSQL, 웹 UI 를 거치면서 UTF-8 로 취급된다.
/* 값의 인코딩에는 효과가 있다 */
libname mylib "/data/sas" encoding=euc-kr;
/* CAS LIBNAME 에는 encoding/locale 옵션 자체가 없다 */
libname mycas cas caslib="mycaslib";
encoding=, outencoding=, options locale= 은 CAS 테이블 이름에 아무 영향을 주지 않는다.
권장 구조는 테이블명·컬럼명은 영문으로 두고 한글은 레이블로 붙이는 것이다.
data casuser.sales_2025 (label="2025년 매출");
set raw.'매출데이터'n;
run;
이미 만들어진 한글 테이블은 이관하면서 이름을 바꾼다.
proc casutil;
load data=inlib.'고객정보'n outcaslib="public" casout="customer_info" replace;
quit;
ls 결과에서 이미 깨져 보인다면 그 파일명은 디스크에 잘못된 바이트로 저장된 상태다. 리눅스 파일명에는 인코딩 정보가 없고 해석은 현재 셸 로케일이 한다. EUC-KR 로케일에서 만든 이름을 UTF-8 로케일에서 읽으면 그렇게 보인다. 이 경우는 SAS 설정으로 복구되지 않고 파일명을 다시 붙여야 한다.