Repository navigation
Guide to Charset and Collation for CB‐Spider RDBMS(KR)
- CB-Spider는 RDBMS 인스턴스 내부에 Database를 생성할 때
Charset/Collation을 선택적으로 지정할 수 있는 API를 제공합니다 (mysql/mariadb엔진 전용). - CSP마다 이를 실제로 적용하는 방식(네이티브 API, SQL 직접 실행, 저장 프로시저)과 전제조건이 크게 다르며, 일부 CSP는 요청이
"created"로 성공 응답해도 실제로는 요청한 값을 조용히 무시하는 경우가 있었습니다. 본 가이드는 이런 함정을 피해 안전하게 Charset/Collation을 지정하는 방법을 설명합니다. - 9개 CSP(MySQL) / 4개 CSP(MariaDB) 전체를 대상으로 한 실측 검증 결과와 상세 원리는 rdbms-mysql-test/charset-test README, collation-test README를 참고하세요 — 본 가이드는 그 결과를 바탕으로 한 실전 활용 가이드입니다.
-
Charset(문자셋): 데이터베이스에 저장되는 문자를 어떤 바이트 인코딩으로 표현할지 정의합니다. 잘못 설정하면 한글/이모지 등 일부 문자가 저장 시 깨지거나(
?로 치환) INSERT 자체가 거부될 수 있습니다. -
Collation(콜레이션): 같은 문자셋 내에서 문자열을 정렬(
ORDER BY)하고 비교(=,LIKE)할 때의 규칙입니다. 예를 들어_ci(case-insensitive) 콜레이션은'ABC'와'abc'를 같은 값으로 취급하지만,_bin(binary) 콜레이션은 다른 값으로 취급합니다. - 온프레미스에서 마이그레이션하거나 기존 시스템과 정렬 규칙을 맞춰야 하는 경우, CSP의 기본값이 아닌 특정 Charset/Collation으로 Database를 생성해야 할 때가 많습니다.
- CB-Spider는
Charset/Collation값을 고정된 목록(enum)으로 검증하지 않습니다. MySQL/MariaDB는 버전마다 새로운 charset/collation을 추가하며(예: MySQL 8.0의utf8mb4_0900_ai_ci, MariaDB 11.4.2+의utf8mb4_uca1400_ai_ci), 이를 CB-Spider가 미리 다 알고 있을 수 없기 때문입니다. - 대신 CB-Spider는 SQL 식별자로 안전하게 쓸 수 있는 형식인지만 확인합니다(영문자/숫자/언더스코어만 허용). 형식만 통과하면 그 값을 그대로 CSP API 또는 SQL 엔진에 전달하며, 엔진이 그 값을 인식하지 못하면 엔진 자체의 에러 메시지가 그대로 반환됩니다.
- 즉
Charset=invalidvalue처럼 실제로 존재하지 않는 값을 보내면, CB-Spider가 아니라 MySQL/MariaDB 엔진이나 CSP API가 "그런 charset 없음" 에러를 반환합니다.
POST /spider/rdbms/{Name}/databases
| 필드 | 필수 | 설명 |
|---|---|---|
ConnectionName |
✅ | Connection 이름 |
DatabaseName |
✅ | 생성할 Database 이름 |
MasterUserName |
조건부 | 아래 CSP별 지원 방식 참고 — CSP에 따라 필수 |
MasterUserPassword |
조건부 | 위와 동일 |
Charset |
선택 | 예: utf8mb4, latin1 — mysql/mariadb에서만 유효 |
Collation |
선택 | 예: utf8mb4_unicode_ci, utf8mb4_bin — mysql/mariadb에서만 유효 |
Charset/Collation을postgres엔진 인스턴스에 지정하면 에러로 거부됩니다.
curl -u admin:your-secure-password -sX POST \
http://localhost:1024/spider/rdbms/cb-spider-mysql-test/databases \
-H 'Content-Type: application/json' \
-d '{
"ConnectionName": "aws-config01",
"DatabaseName": "mydb",
"MasterUserName": "myadmin",
"MasterUserPassword": "Password123!",
"Charset": "utf8mb4",
"Collation": "utf8mb4_unicode_ci"
}' | jq성공 응답
{ "message": "created" }
⚠️ 이 응답이"created"라고 해서Charset/Collation이 반드시 요청한 값대로 적용됐다는 뜻은 아닙니다 — 아래 CSP별 지원 방식에서 설명하는 CSP별 제약을 반드시 확인하세요. (실제로 Azure는 과거Charset만 단독으로 요청하면 조용히 무시하고 서버 기본값으로 생성한 사례가 있었습니다 — 지금은 CB-Spider가 자동으로 보정합니다. 자세한 내용은 CSP별 참고사항 참고.)
CB-Spider는 CSP마다 서로 다른 메커니즘으로 Charset/Collation을 적용합니다. MasterUserName/MasterUserPassword가 필요한지 여부도 메커니즘에 따라 다릅니다.
| CSP | 메커니즘 | MasterUserName/Password 필요 여부 |
|---|---|---|
| Azure, GCP, OpenStack, Alibaba | CSP 네이티브 API — Create Database API 자체가 Charset/Collation 필드를 지원 | 기본적으로 불필요(단, Azure에서 Charset만 지정하고 Collation을 생략하면 CB-Spider가 실제 기본 Collation을 조회하기 위해 필요 — CSP별 참고사항 참고) |
| Tencent | 네이티브 API(Charset) + SQL(Collation) — Tencent API에는 Collation 필드가 아예 없음 |
Collation을 지정할 때만 필요 (생성 직후 ALTER DATABASE ... COLLATE ...를 SQL로 추가 실행) |
| NCP |
SQL 저장 프로시저 — NCP 공식 sys.ncp_create_db('name','charset','collation') 호출 |
Charset 또는 Collation을 하나라도 지정하면 필요 |
| NHN | SQL (CREATE DATABASE ... CHARACTER SET ... COLLATE ...) |
Charset 또는 Collation을 하나라도 지정하면 필요 — 추가로 콘솔에서 "Direct Control" 사전 활성화 필요(CSP별 참고사항 참고) |
| AWS, IBM |
SQL (CREATE DATABASE ... CHARACTER SET ... COLLATE ...) — CSP 네이티브 Database 관리 API 자체가 없음 |
항상 필요 (Charset/Collation 지정 여부와 무관) |
MasterUserName/MasterUserPassword는 인스턴스 생성 시 설정한 값을 그대로 다시 전달해야 합니다. CB-Spider는 생성 이후 이 값을 조회 API로 돌려주지 않습니다 — 여러 CSP에서 실제 마스터 계정을 신뢰성 있게 재확인할 방법이 없기 때문입니다.
flowchart TD
A["POST .../databases<br/>Charset=X, Collation=(empty)"] --> B{CSP 메커니즘}
B -->|Azure| C1["Collation 자동 조회 후<br/>네이티브 API 1회 호출"]
B -->|GCP/OpenStack/Alibaba| C2["네이티브 API 1회 호출<br/>(Collation 생략 가능)"]
B -->|Tencent| C3["네이티브 API로 Charset만 적용<br/>(Collation 미지정이므로 SQL 불필요)"]
B -->|NCP| C4["SQL: CALL sys.ncp_create_db<br/>(name, X, '')"]
B -->|NHN| C5["SQL: CREATE DATABASE ...<br/>CHARACTER SET X<br/>(Direct Control 필요)"]
B -->|AWS/IBM| C6["SQL: CREATE DATABASE ...<br/>CHARACTER SET X"]
-
위 표에서 **SQL(또는 SQL 기반 저장 프로시저)**을 쓰는 CSP(Tencent의 Collation 적용, NCP, NHN, AWS/IBM)는 CB-Spider 서버가 대상 인스턴스에 직접 TCP로 접속해야 동작합니다.
-
인스턴스가 Private Mode(
PublicAccess=false, 공인 IP 없이 사설망에만 존재)이고 CB-Spider 서버에서 그 네트워크로 라우팅 경로가 없다면:CSP 영향 AWS, IBM Database 생성 자체가 안 됨(Charset/Collation 지정 여부와 무관 — 이 두 CSP는 애초에 전체 생성 경로가 SQL뿐) Tencent Charset만 지정하면 정상 동작,Collation까지 지정하면 그 부분만 실패NCP, NHN Charset/Collation중 하나라도 지정하면 실패 — 지정하지 않고 기본값으로 생성하는 것은 정상 동작Azure Charset만 지정하고Collation은 생략한 요청에서만 실패(기본 Collation 자동조회에 SQL 필요) — 둘 다 명시하거나 둘 다 생략하면 영향 없음GCP, OpenStack, Alibaba 영향 없음 — Charset/Collation 모두 CSP 네이티브 API로 처리 -
CSP 네이티브 API로의 대체는 불가능합니다 — Tencent는 API 자체에 Collation 필드가 없고, NCP의 공식 우회 수단 자체가 SQL 저장 프로시저이며, NHN의 네이티브 API는 애초에 charset/collation 파라미터를 지원하지 않습니다.
-
이런 경우에도 Database를 기본값(엔진 기본 Charset/Collation)으로 생성하는 것은 가능합니다 — 명시적으로 원하는 Charset/Collation을 지정하는 옵션만 쓸 수 없습니다.
-
다른 Private Mode 제약사항 전체 목록(TLS 상태 조회, OpenStack 마스터 권한 등)은 RDBMS Management Guide의 "Private Mode에서 지원되지 않는 기능"을 참고하세요.
curl -u admin:your-secure-password -sX POST \
http://localhost:1024/spider/rdbms/cb-spider-mysql-test/databases \
-H 'Content-Type: application/json' \
-d '{
"ConnectionName": "aws-config01",
"DatabaseName": "mydb",
"MasterUserName": "myadmin",
"MasterUserPassword": "Password123!",
"Charset": "utf8mb4"
}' | jqcurl -u admin:your-secure-password -sX POST \
http://localhost:1024/spider/rdbms/cb-spider-mysql-test/databases \
-H 'Content-Type: application/json' \
-d '{
"ConnectionName": "aws-config01",
"DatabaseName": "mydb",
"MasterUserName": "myadmin",
"MasterUserPassword": "Password123!",
"Charset": "utf8mb4",
"Collation": "utf8mb4_bin"
}' | jq
utf8mb4_general_ci/utf8mb4_0900_ai_ci/utf8mb4_uca1400_ai_ci같은 "기본값 계열" collation은 MySQL/MariaDB 버전마다 이름이 다릅니다. 반면utf8mb4_bin(대소문자 구분, 바이트 단위 비교)은 모든 MySQL/MariaDB 버전에서 동일한 이름으로 존재하는 안정적인 값입니다.
curl -u admin:your-secure-password -sX POST \
http://localhost:1024/spider/rdbms/cb-spider-mariadb-test/databases \
-H 'Content-Type: application/json' \
-d '{
"ConnectionName": "alibaba-beijing-config",
"DatabaseName": "mydb",
"MasterUserName": "myadmin",
"MasterUserPassword": "Password123!",
"Charset": "utf8mb4",
"Collation": "utf8mb4_bin"
}' | jq응답 (명확한 에러 — 조용히 무시되지 않음)
{ "message": "Alibaba CreateDatabase: Collation is not supported on MariaDB instances (Alibaba's API documents CollationName as MySQL-only, and a MariaDB instance silently ignores it rather than erroring) -- omit Collation and specify only Charset" }export SPIDER_URL=http://localhost:1024
export SPIDER_AUTH=admin:change-your-password
curl -u $SPIDER_AUTH -sX POST \
"$SPIDER_URL/spider/rdbms/cb-spider-mysql-test/databases" \
-H 'Content-Type: application/json' \
-d '{
"ConnectionName": "aws-config01",
"DatabaseName": "mydb",
"MasterUserName": "myadmin",
"MasterUserPassword": "Password123!",
"Charset": "utf8mb4",
"Collation": "utf8mb4_unicode_ci"
}' | jq
# 적용 결과 확인 (SQL 클라이언트로 직접 접속)
mysql -h <Endpoint 호스트> -P 3306 -u myadmin -p -e \
"SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='mydb';"- RDBMS 인스턴스 상세 패널에서 + Database 버튼을 클릭하면 나타나는 "Create Database" 창에 Database Name 아래 Charset/Collation 입력 필드(둘 다 선택 입력)가 있습니다.
- 두 필드 모두
mysql/mariadb에서만 유효하며, 모든 CSP가 지원하는 것은 아니라는 안내 문구가 함께 표시됩니다.Charset만 입력하고Collation을 비워두면 일부 CSP(Azure 등)에서는 위에서 설정한 User/Password가 추가로 필요할 수 있습니다 — 이미 Connect 시 입력했다면 별도 조치가 필요 없습니다.
- Azure MySQL Flexible Server의 Database 리소스는
Charset/Collation을 모두 지원하지만,Charset만 지정하고Collation을 생략하면 Azure가 이를 조용히 무시하고 서버 기본 charset(보통utf8mb4)으로 생성하는 현상이 실측 확인됐습니다. - CB-Spider는 이를 감지해, Azure에 한해
Charset만 들어오면 대상 인스턴스에 실제 SQL 조회(information_schema.CHARACTER_SETS)를 수행해 그 charset의 진짜 기본 collation을 알아낸 뒤 두 값을 함께 Azure API에 전달합니다. 이 조회 때문에 Azure에서Charset만 지정해도MasterUserName/MasterUserPassword가 필요합니다. -
Charset과Collation을 모두 직접 지정하면 이 조회 자체가 생략됩니다.
- Tencent CDB의 CreateDatabase API는
CharacterSetName필드만 있고 Collation 필드가 아예 없습니다. -
Collation을 지정하면 CB-Spider가 Database 생성 직후ALTER DATABASE ... COLLATE ...를 SQL로 추가 실행합니다. 이 ALTER가 실패하면 방금 생성한 Database를 자동으로 롤백(삭제)합니다 — 잘못된 Collation 상태로 Database가 남지 않도록 하기 위함입니다.
- NCP Cloud DB for MySQL은 네이티브 API에 Charset/Collation 필드가 없고, 보안 정책상 마스터 계정에 일반
CREATE DATABASESQL 권한도 부여되지 않습니다. - 대신 NCP가 공식 제공하는 저장 프로시저
CALL sys.ncp_create_db('dbname', 'charset', 'collation')를 CB-Spider가 SQL로 직접 호출합니다 —Charset/Collation중 하나라도 지정하면 이 경로를 사용합니다. - 이 SQL 호출이 동작하려면 CB-Spider 서버가 인스턴스에 직접 TCP로 접속 가능해야 합니다(아래 Private Mode에서의 제약 참고). NCP는 Public Domain 할당 API가 없어
PublicAccess=true생성 요청 자체가 거부되므로, CB-Spider 서버가 같은 VPC 등으로 라우팅 가능하지 않다면NCPAutoOpenACG=true로 생성해 ACG를 연 뒤 NCP 콘솔에서 Public Domain을 수동 설정해야 합니다 — 세부 내용은 RDBMS Management Guide를 참고하세요.
- NHN Cloud RDS는 기본적으로 마스터 계정의 SQL
CREATE DATABASE권한을 차단합니다.Charset/Collation을 지정하려면 콘솔에서 "DB 스키마 & 사용자 직접 제어"(Direct Control)를 미리 활성화해야 합니다.- 설정 경로: NHN 콘솔 로그인 → Database → RDS for MySQL(또는 MariaDB) → DB 인스턴스 목록을 "그룹" 화면으로 전환 → 대상 그룹 선택 → 기본 정보 탭 → 수정 → "DB 스키마 & 사용자 직접 제어" 활성화
⚠️ 활성화 즉시 현재 생성된 모든 사용자에게CREATE, DROP, ALTER, CREATE USER등 광범위한 권한이*.*에 부여됩니다. 또한 비가역적입니다 — 다시 비활성화해도 이미 부여된 권한은 자동 회수되지 않습니다. 운영 환경에서는 신중히 적용하세요.- 비활성화 상태에서
Charset/Collation을 지정하면 CB-Spider의 "미지원" 메시지가 아니라 MySQL/MariaDB 엔진 자체의 권한 거부 에러(Error 1044: Access denied ...)가 그대로 노출됩니다. - MySQL용 인스턴스와 MariaDB용 인스턴스는 별도의 DB 인스턴스 그룹이므로, 각각 따로 Direct Control을 활성화해야 합니다.
- Alibaba RDS의 CreateDatabase API는
CharacterSetName을 MySQL/MariaDB 모두에서 지원하지만,CollationName은 공식 문서에 **"MySQL instances only"**로 명시되어 있습니다. - 실측 결과, MariaDB 인스턴스에 Collation을 지정해도 에러 없이 조용히 무시되고 기본 Collation(
utf8mb4_general_ci)으로 생성되는 것이 확인됐습니다. - CB-Spider는 이를 조용히 넘어가는 대신, Alibaba MariaDB 인스턴스에
Collation을 지정하면 생성 요청 자체를 명확한 에러로 거부합니다. Alibaba MariaDB에서는Charset만 지정하세요. - Alibaba MySQL 인스턴스에서는 Charset/Collation 모두 정상 지원됩니다.
- 둘 다 Charset/Collation을 네이티브 API가 그대로 지원하며,
Charset만 지정해도 올바른 기본 Collation이 적용됩니다(Azure와 달리 별도 보정 로직 불필요). - OpenStack Trove의 Database/User API는 공식적으로
mysqldatastore에 대해서만 지원이 명시되어 있습니다 —mariadbdatastore에서의 동작은 배포본에 따라 다를 수 있으며, CB-Spider의 실측 테스트(이 wiki의 RDBMS Management Guide)는 테스트 당시의 특정 배포본 기준 결과입니다.
전체 9개 CSP(MySQL)/4개 CSP(MariaDB)에 대한 실측 검증 결과와 근거는 charset-test README, collation-test README의 Test Results 섹션을 참고하세요.
-
MasterUserName/MasterUserPassword는 URL 쿼리 파라미터가 아니라 요청 Body로 전달됩니다 (List 조회는X-Master-User-Name/X-Master-User-Password헤더 사용 — RDBMS Management Guide 8번 절차 참고). 이 API는 CB-Spider 서버와의 신뢰된 네트워크 경로에서만 호출하세요. - NHN의 "Direct Control" 활성화는 비가역적으로 광범위한 권한을 모든 기존 사용자에게 부여합니다 — 운영 환경 인스턴스에 적용하기 전에 반드시 보안 영향을 검토하세요.
- Tencent/NCP/NHN 경로는 CB-Spider가 대상 인스턴스에 직접 SQL로 접속해 DDL(
CREATE DATABASE,ALTER DATABASE, 저장 프로시저 호출)을 실행합니다 —MasterUserName/MasterUserPassword가 유출되면 이 권한이 그대로 악용될 수 있으니 일반 애플리케이션 접속 계정과 동일한 수준으로 보호하세요.
-
Getting Started
-
Usage Guide
- Usage Overview
- Connection Management
- Region/Zone Info
- Quota Info
- VM Price Info
- VM Image Info
- VM Spec Info
- DB Spec Info
- VPC/Subnet Management
- Security Group Management
- KeyPair Management
- VM Management
- Disk Management
- Network Load Balancer(NLB) Management
- Kubernetes Cluster Management
- Object Storage(S3) Management
- RDBMS Management
- Tag Management
- Cloud Driver Capability Info
- (WIP)VM Multi‐Network Management
- Function Menu
- MetaDB Auto Backup
- How to get CSP Credentials
- Tutorials
- Developer Guide
- Cloud Driver Developer Guide
- CB‐Spider Multi‐Cloud Driver Developer Team Skill
- Cloud Driver Developer Guide-WIP
- VM SSH Key Development Guide-WIP
- VM User Development Guide
- What is the CSP SDK API Version of drivers
- Region Zone Info and Driver API
- (StartVM TerminateVM) API Call Counts and Waiting
- StartVM and TerminateVM Main Flow of drivers
- VM Root Disk Configuration Guide
- Security Group Rules and Driver API
- Network Load Balancer and Driver API
- VM Snapshot, MyImage and Disk Overview
- Kubernetes and Driver API(PMKS, K8S)
- Tag and Cloud Driver API
- AnyCall API Extension Guide
- How to ...
- How to Use AWS S3 with Credentials
- How to Use Alibaba ECS i1.* Instance Types
- How to provision GPU VMs
- How to test CB Spider with Mock Driver
- How to install CB Spider on WSL2 under 공유기/사설망
- How to install CB Spider on macOS
- How to run CB Spider Container on macOS
- How to get Azure available Regions
- How to profile memory usage in Golang
- [For Cloud-Migrator]