base85() SQL 함수

base85() SQL 함수

base85() 함수는 이진 데이터(BLOB)를 base-85 텍스트 인코딩으로, 또는 그 반대로 바꿔 주는 SQL 함수예요. base64()처럼 로더블 확장(loadable extension)으로 구현되어 있답니다.

출처: The Base85() SQL Function

본문

1. 개요 (Overview)

base85() 함수는 SQLite를 위한 loadable extension으로 구현된 SQL 함수예요. 이 함수는 이진 BLOB를 동등한 base-85 텍스트 인코딩으로 변환하거나, 그 base-85 텍스트 인코딩을 다시 BLOB로 변환해 줍니다.

base85() 함수는 SQLite 표준의 일부가 아니에요. 반드시 별도의 확장으로 불러와야 합니다. base85()의 소스 코드는 SQLite 소스 트리의 ext/misc/ 폴더에 있는 base85.c 소스 파일에 있어요.

base85() 함수는 SQLite 라이브러리의 표준 빌드에는 포함되지 않지만, CLI에서는 기본으로 불러와집니다. 이것은 CLI가 표준 SQLite 라이브러리에서 제공하는 것보다 더 다양한 확장을 불러오는 전형적인 모습이에요.

base64() 표현과 마찬가지로, base85() 함수는 이진 콘텐츠를 어떤 정상적인 ASCII 채널을 통해서도 손상 없이 전달할 수 있는 형식으로 만들어 줘요. CSV나 TCL의 중괄호 리터럴, SQL 문자열 리터럴로도 잘 동작해요. 다만 XML류 문서에서 수정 없이 그대로 쓰기에는 적합하지 않아요.

2. 인코딩 (Encoding)

사용되는 인코딩은 Ascii85와 비슷하지만, 저자(Larry Brasfield)가 Mozilla, Adobe, ZMODEM 같은 다른 Ascii85 계열 소스들이 존재하기 전인 1984년경 VAX 메인프레임에서 고안한 것이에요. 게다가 이것은 base85 체계의 독립적인 구현이에요. 그래서 저자는 당연히 이것을 public domain(퍼블릭 도메인)으로 공개했답니다.

Base85 숫자는 7-bit USASCII 코드 집합에서 제어 문자와 Space, !, ", ', (, ), {, |, }, ~, Del 을 제외한 코드들로 구성돼요. 이들은 코드 순서대로 숫자값 0에서 84(10진수)를 나타내요.

빅엔디안 32-bit 값으로 해석되는 4바이트 묶음은 MS에서 LS 숫자 순서의 5자리 base85 숫자로 표현돼요. 13바이트 묶음은 24자리로 표현되는데, 여전히 빅엔디안이지만 8~24-bit 값이에요. (빅엔디안을 쓰면 4바이트보다 작은 바이트 묶음으로의 전환이 가장 단순해져요. 이 바이트 묶음들은 base-256 숫자로도 볼 수 있어요.) 0바이트 묶음은 0자리로 표현되고 그 반대도 마찬가지예요. 패드 문자는 사용되지 않으며, 인코딩된 base85 숫자 열(즉 "묶음")의 길이는 디코딩된 이진 길이와 1:1로 대응해요.

base85 숫자 집합에 없는 어떤 문자든 묶음을 구분해 줘요. base85가 무한 크기의 컨테이너에 스트리밍되거나 저장될 때는, fgets()로 읽을 수 있도록 80자리를 넘지 않는 하위 시퀀스로 나누기 위해 줄바꿈이 사용돼요.

3. 특징 (Features)

  1. base85() 함수는 항상 인자를 하나만 받아요. 인자는 TEXT(base85→이진 변환용)나 BLOB(이진→base85 변환용)여야 해요.
  2. base85()의 인자가 BLOB이면, 반환값은 위에서 설명한 인코딩에 따른 TEXT예요.
  3. base85()의 인자가 위에서 설명한 TEXT라면, 반환값은 그 base85 텍스트에 해당하는 이진 데이터인 BLOB이에요.
  4. base85()의 인자가 TEXT나 BLOB 외의 것이면 오류가 발생해요.

4. 참고 (See Also)

더 알아보기 (Learn more)