콘텐츠로 이동

런타임·드라이버 지원

이 매트릭스가 기준 자료입니다. 각 지원 등급은 여기에 기록된 데이터베이스, 드라이버, 프로필, 런타임, 기능의 정확한 조합과 테스트한 버전에만 적용됩니다.

  • Official: 정확한 실행 근거가 이름 붙은 데이터베이스·드라이버·프로필·런타임·기능 조합을 다룹니다.
  • Conditional: 명시한 조건에서만 근거가 적용됩니다.
  • Pending: 후보 조합에 현재 구현 리비전에 대한 새로 통과한 게이트가 없습니다.
  • Historical: 예전의 정확한 리비전에서 조합을 테스트했습니다. 현재 소스 트리를 증명하지는 않습니다.
  • Compatible: 공개 API로 동작할 수 있지만, 인증된 정확한 대상이라고 주장하지 않습니다.
  • Custom: 사용자가 직접 제공한 QueryExecutor나 ConnectionProvider입니다.
  • Unsupported: 필요한 SQLBraid 기능이 일부러 없습니다.
SQLBraid 지원 대상 (정적/인쇄용 요약)
대상데이터베이스드라이버런타임상태정확한 숫자JSON시간트랜잭션스트리밍
better-sqlite3-node-22-18-0sqlite better-sqlite3 bundled SQLitebetter-sqlite3@13.0.3node@22.18.0호환 가능string · lossless · better-sqlite3-exact-string / string · unsupported · better-sqlite3-exact-string——트랜잭션: 보장됨; 세이브포인트: 보장됨—
bun-sql-mariadbmariadb 11.8.9 communitybun-sql@1.3.14bun@1.3.14공식string · guarded · bun-sql-mariadb-1.3.14 / string · unsupported · bun-sql-mariadb-1.3.14지원하지 않음 / 보장됨값 검사 (네이티브 Date 편의 변환은 소수초 정밀도나 시간대 식별을 보존하지 않음) / 지원하지 않음트랜잭션: 보장됨; 세이브포인트: 보장됨; 읽기 전용 트랜잭션: 지원하지 않음; Read uncommitted 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Read committed 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Repeatable read 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Serializable 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원)지원하지 않음
bun-sql-mysqlmysql 8.4.2 communitybun-sql@1.3.14bun@1.3.14공식string · guarded · bun-sql-mysql-1.3.14 / string · unsupported · bun-sql-mysql-1.3.14값 검사 (네이티브 JSON 파싱은 숫자 무손실 표현이 아님) / 지원하지 않음값 검사 (네이티브 Date 편의 변환은 소수초 정밀도나 시간대 식별을 보존하지 않음) / 지원하지 않음트랜잭션: 보장됨; 세이브포인트: 보장됨; 읽기 전용 트랜잭션: 지원하지 않음; Read uncommitted 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Read committed 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Repeatable read 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Serializable 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원)지원하지 않음
bun-sql-postgrespostgres 16.4 alpinebun-sql@1.3.14bun@1.3.14공식string · guarded · bun-sql-postgres-1.3.14 / string · lossless · bun-sql-postgres-1.3.14값 검사 (네이티브 JSON 파싱은 숫자 무손실 표현이 아님) / 지원하지 않음값 검사 (네이티브 Date 편의 변환은 소수초 정밀도나 시간대 식별을 보존하지 않음) / 지원하지 않음트랜잭션: 보장됨; 세이브포인트: 보장됨; 읽기 전용 트랜잭션: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Read uncommitted 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Read committed 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Repeatable read 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원); Serializable 격리: 값 검사 (이 백엔드에서 검증된 네이티브 격리 수준과 읽기 전용 매핑만 지원)지원하지 않음
bun-sql-sqlitesqlite 3.53.0 bun-embeddedbun-sql@1.3.14bun@1.3.14공식string · guarded · bun-sql-sqlite-1.3.14 / string · unsupported · bun-sql-sqlite-1.3.14지원하지 않음 / 보장됨지원하지 않음 / 보장됨트랜잭션: 보장됨; 세이브포인트: 보장됨; 읽기 전용 트랜잭션: 지원하지 않음; Read uncommitted 격리: 지원하지 않음; Read committed 격리: 지원하지 않음; Repeatable read 격리: 지원하지 않음; Serializable 격리: 보장됨지원하지 않음
d1-cloudflare-workerd-2026-07-30sqlite Cloudflare D1 managed SQLite (version unreported)cloudflare-d1@1.20260730.1workerd@1.20260730.1호환 가능string · guarded · d1-guarded-safe-integer / string · unsupported · d1-guarded-safe-integer보장됨보장됨읽기 전용 트랜잭션: 지원하지 않음; Read uncommitted 격리: 지원하지 않음; Read committed 격리: 지원하지 않음; Repeatable read 격리: 지원하지 않음; Serializable 격리: 지원하지 않음; 트랜잭션: 지원하지 않음; 세이브포인트: 지원하지 않음지원하지 않음
libsql-local-node-22-18-0sqlite libSQL local SQLitelibsql@0.18.0node@22.18.0호환 가능string · lossless · libsql-exact-string / string · unsupported · libsql-exact-string——트랜잭션: 보장됨; 세이브포인트: 보장됨—
mariadb-connector-node-11-8-9mariadb 11.8.9 communitymariadb@3.5.4node@22.18.0공식string · guarded · mariadb-lossless-text / string · guarded · mariadb-lossless-text보장됨보장됨읽기 전용 트랜잭션: 보장됨; Read uncommitted 격리: 보장됨; Read committed 격리: 보장됨; Repeatable read 격리: 보장됨; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨
mssql-tedious-developer-node-2022-cu18mssql 2022-CU18 Developertedious@20.0.0node@22.18.0공식string · guarded · mssql-tedious / string · unsupported · mssql-tedious보장됨값 검사 (SQL Server 시간 텍스트 캐스트 경로)읽기 전용 트랜잭션: 지원하지 않음; Read uncommitted 격리: 보장됨; Read committed 격리: 보장됨; Repeatable read 격리: 보장됨; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨
mysql-mysql2-deno-2-9-3mysql 8.4.2 communitymysql2@3.24.4deno@2.9.3공식string · guarded · mysql2-lossless-text / string · lossless · mysql2-lossless-text보장됨보장됨읽기 전용 트랜잭션: 보장됨; Read uncommitted 격리: 보장됨; Read committed 격리: 보장됨; Repeatable read 격리: 보장됨; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨
mysql-mysql2-node-8-4-2mysql 8.4.2 communitymysql2@3.24.4node@22.18.0공식string · guarded · mysql2-lossless-text / string · lossless · mysql2-lossless-text보장됨보장됨읽기 전용 트랜잭션: 보장됨; Read uncommitted 격리: 보장됨; Read committed 격리: 보장됨; Repeatable read 격리: 보장됨; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨
oracle-oracledb-thin-node-23-9oracle 23.9 Freenode-oracledb@7.0.1node@22.18.0공식string · unsupported · oracle-thin / string · lossless · oracle-thin보장됨 / 값 검사 (Oracle JSON_SERIALIZE 텍스트 경로)값 검사 (Oracle Date 밀리초 정밀도) / 값 검사 (Oracle 시간 텍스트 캐스트 경로)읽기 전용 트랜잭션: 보장됨; Read uncommitted 격리: 지원하지 않음; Read committed 격리: 보장됨; Repeatable read 격리: 지원하지 않음; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨
postgres-currentpostgres 18.6 alpinepg@8.23.0node@22.18.0공식string · lossless · pg-lossless-text / string · lossless · pg-lossless-text보장됨보장됨——
postgres-pg-deno-2-9-3postgres 16.4 alpinepg@8.23.0deno@2.9.3공식string · lossless · pg-lossless-text / string · lossless · pg-lossless-text보장됨보장됨읽기 전용 트랜잭션: 보장됨; Read uncommitted 격리: 값 검사 (PostgreSQL READ UNCOMMITTED는 READ COMMITTED 의미론 사용); Read committed 격리: 보장됨; Repeatable read 격리: 보장됨; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨
postgres-pg-node-16-4postgres 16.4 alpinepg@8.23.0node@22.18.0공식string · lossless · pg-lossless-text / string · lossless · pg-lossless-text보장됨보장됨읽기 전용 트랜잭션: 보장됨; Read uncommitted 격리: 값 검사 (PostgreSQL READ UNCOMMITTED는 READ COMMITTED 의미론 사용); Read committed 격리: 보장됨; Repeatable read 격리: 보장됨; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨
sqlite-node-sqlite-deno-2-9-3sqlite 3.53.2 Deno bundled SQLitenode-sqlite@2.9.3deno@2.9.3공식string · lossless · sqlite-exact-string / string · unsupported · sqlite-exact-string보장됨보장됨읽기 전용 트랜잭션: 지원하지 않음; Read uncommitted 격리: 지원하지 않음; Read committed 격리: 지원하지 않음; Repeatable read 격리: 지원하지 않음; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨지원하지 않음
sqlite-wasm-browser-3-53-4sqlite 3.53.4 official SQLite WASM OO1sqlite-wasm@3.53.4-build1browser@153.0.8010.12공식string · lossless · sqlite-wasm-exact-string / string · unsupported · sqlite-wasm-exact-string보장됨보장됨읽기 전용 트랜잭션: 지원하지 않음; Read uncommitted 격리: 지원하지 않음; Read committed 격리: 지원하지 않음; Repeatable read 격리: 지원하지 않음; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨
sqlite-node-sqlite-node-22-18-0sqlite 3.50.2 Node bundled SQLitenode-sqlite@22.18.0node@22.18.0공식string · lossless · sqlite-exact-string / string · unsupported · sqlite-exact-string보장됨보장됨읽기 전용 트랜잭션: 지원하지 않음; Read uncommitted 격리: 지원하지 않음; Read committed 격리: 지원하지 않음; Repeatable read 격리: 지원하지 않음; Serializable 격리: 보장됨; 트랜잭션: 보장됨; 세이브포인트: 보장됨보장됨

매트릭스는 기계가 읽을 수 있는 지원 대상과 기능 조건에서 생성됩니다. 근거를 보여 줄 뿐, 모든 어댑터가 모든 작업을 지원한다고 약속하지 않습니다.

방언, 드라이버, 런타임, 호스트, 데이터베이스 버전, 표현 방식 프로필, 기능은 서로 독립된 축입니다. 정규 기능 식별자는 다음과 같습니다.

sql.native-transparency sql.generated-structure
result.rows result.command
result.multiple-sets result.standard-schema
numeric.exact-integer numeric.exact-decimal
numeric.approximate-float numeric.approximate-special
numeric.bind-exact numeric.aggregate
numeric.command-metadata numeric.special-values
numeric.scale-greater-than-precision
numeric.negative-scale
data.json-parsed data.json-lossless-text
data.sql-variant data.oracle-object
data.oracle-collection data.vector
data.binary data.uuid
data.temporal-native data.temporal-lossless
data.timezone
metadata.command-safe
dml.insert-returning dml.update-returning
dml.delete-returning dml.merge-returning
dml.upsert-returning
session.pinned
statement.prepare statement.cancel
statement.stream statement.bulk
execution.bulk-fidelity
transaction transaction.savepoint
transaction.read-only
transaction.isolation.read-uncommitted
transaction.isolation.read-committed
transaction.isolation.repeatable-read
transaction.isolation.serializable
routine.call routine.out
routine.inout routine.result-sets
routine.out-cursor routine.return-value
metadata.identity metadata.generated
metadata.routines metadata.types

execution.prepared, execution.stream, routine.resultsets, routine.return-status 같은 예전 별칭을 추가하지 마세요.

statementBinding.describe()와 describeBulk()는 리스를 획득하기 전에 논리적인 RenderedStatement나 RenderedBulk를 검증합니다. 프로바이더와 리스는 같은 불변 바인딩 어댑터 객체를 노출합니다. 준비된 쿼리의 형태는 논리적 결과 종류, 정규화된 세그먼트, 방언, 그리고 순서가 있는 힌트·방향·출력 메타데이터입니다. 물리 플레이스홀더 표기는 형태를 바꾸지 않습니다.

db.session(callback)은 물리 프로바이더 리스 하나를 고정합니다. 중첩 세션은 같은 리스를 씁니다. db.tx(callback)은 그 리스를 쓰거나, 루트 리스 하나를 획득합니다. 지원하는 경우 중첩 트랜잭션은 세이브포인트를 씁니다.

명시적인 트랜잭션 옵션에는 정해진 격리 수준 리터럴 read-uncommitted, read-committed, repeatable-read, serializable과 readOnly만 쓸 수 있습니다.

  • 형식이 잘못된 런타임 옵션은 획득 전에 TypeError / BRAID_TX_OPTIONS_INVALID로 실패합니다.
  • 올바르지만 지원하지 않는 옵션은 UnsupportedFeatureError / BRAID_TX_OPTION_UNSUPPORTED를 씁니다.
  • 중첩 트랜잭션에 옵션을 명시하면 BRAID_TX_OPTIONS_NESTED를 씁니다.

이미 중단된 AbortSignal은 원래 reason을 유지합니다. 활성 시그널을 쓰려면 어댑터에 실제 취소 경로가 있어야 합니다. 없으면 작업은 I/O 전에 UnsupportedFeatureError(기능 statement.cancel, 코드 BRAID_CANCEL_UNSUPPORTED)로 거부됩니다. 세션 기능이 없으면 BRAID_SESSION_UNSUPPORTED, 트랜잭션 기능이 없으면 BRAID_TX_UNSUPPORTED를 씁니다.

Oracle의 guarded 조건 oracle.connection-break는 협력적인 방식입니다. 즉시 멈추거나 시간 제한을 지킨다고 보장하지 않습니다. 문서화된 DBMS_SESSION.SLEEP 원시 점검은 sleep이 끝날 때만 ORA-01013으로 reject될 수 있습니다. 어댑터는 결과가 확정될 때까지 물리 리스를 붙잡고 있습니다.

공식 루트는 PostgreSQL, MySQL, MariaDB, SQLite, Oracle, SQL Server를 다룹니다. 프로토콜과 정리 동작은 드라이버 하위 경로가 맡습니다. pg, mysql2, MariaDB Connector/Node.js, node:sqlite, SQLite WASM, D1, node-oracledb Thin, Tedious가 있습니다.

Bun은 SQL 어댑터 계열 하나를 쓰며, 사용자가 dialect: "postgres" | "mysql" | "mariadb" | "sqlite"를 고릅니다. 커넥션에서 SQL 의미를 추론하지 않습니다.

  • Bun 1.3.14에서는 활성 취소를 지원하지 않습니다(BRAID_CANCEL_UNSUPPORTED). 스트림과 루틴 출력 전달도 지원하지 않습니다.
  • result.rows와 result.command 메타데이터는 bun-sql.result-kind-metadata 조건으로 guarded입니다. MySQL과 MariaDB에서는 결과가 빈 SELECT와, 0행에 영향을 준 DML·DDL이 실행 후에야 BRAID_RESULT_KIND_AMBIGUOUS로 실패합니다. command가 null이고 affectedRows가 0이기 때문입니다.

Deno는 공개 드라이버 API가 호환되는 곳에서 기존 공식 어댑터를 씁니다.

스트림, 루틴, 출력, 힌트, 벌크, 트랜잭션, 취소 기능이 없으면 명시적인 UnsupportedFeatureError로 실패해야 합니다. SQLBraid는 다음을 하지 않습니다.

  • 스트리밍을 흉내 내려고 페이지 단위로 나눠 읽기
  • 루틴 출력 전달 방식 추측하기
  • 힌트 무시하기
  • 숨은 트랜잭션 만들기
  • 검증되지 않은 조합의 등급 올리기

D1의 관리형 SQLite 버전은 보고되지 않습니다. 로컬 Worker 바인딩 점검은 버전 인증이 아닙니다.

각 드라이버 프로필이 숫자, JSON, 날짜·시간, 컨테이너 동작을 정합니다. 정확한 데이터베이스 정수와 소수는 정규 문자열이고, 근사 IEEE 값은 숫자입니다. 프로필과 코드 생성 설명 객체는 서로 맞아야 합니다.

데이터베이스 메타데이터는 긍정적 근거를 줍니다. 메타데이터에 항목이 없다고 해서 항상 SQL이 잘못되었다는 뜻은 아닙니다.

Bun 1.3.14는 PostgreSQL, MySQL, MariaDB에 { bigint: true }를, SQLite에 { safeIntegers: true }를 씁니다.

  • Bun은 열 메타데이터를 제공하지 않습니다. 그래서 정수 값의 Number 행과 정수 값의 근사 Number 행은 모호하다는 이유로 거부합니다.
  • PostgreSQL decimal은 문자열입니다.
  • MySQL·MariaDB의 DECIMAL과 바이너리 출력은 타입 정보 없는 같은 바이트 형태로 전달되므로 거부합니다. SQL에 CAST(... AS CHAR)나 HEX(...)를 쓰세요.
  • SQLite 네이티브 decimal은 지원하지 않습니다.
  • MariaDB와 SQLite의 JSON은 텍스트입니다. PostgreSQL과 MySQL의 네이티브 JSON은 중첩된 숫자를 반올림할 수 있습니다.
  • Bun SQLite의 결과 종류는 bun-sql.sqlite-result-parser 조건으로 guarded입니다. Bun은 서로 다른 따옴표가 섞인 SQL 리터럴을 잘못 분류할 수 있습니다. JSON 값은 바인딩으로 넘기세요. SQLBraid는 SQL을 고쳐 쓰지 않습니다.

지원을 추가하려면 정확한 버전·프로필 조합, 실제 엔진에서의 검증, 기계가 읽을 수 있는 대상 조건이 필요합니다. 과거 링크나 설명만으로는 현재 소스 트리를 증명할 수 없습니다.