bytea 자료형은 이진 문자열의 저장이 가능하다; Table 8-6 를 보도록 하라.
Table 8-6. Binary Data Types
Name |
Storage Size |
Description |
bytea |
4 bytes plus the actual binary string |
variable-length binary string |
이진 문자열은 8진수 (또는 bytes)가 연속된 문자열이다. 이진 문자열은 두가지점에서 일반적인 문자와는 구별이 된다: 첫째로 이진 문자열은 zero 값이나 또는 "출력할 수 없는" 문자열의 저장이 가능하다. 둘째로 이진문자열 처리를 위한 연산자는 문자열을 실제로 byte 단위로 처리를 한다. 반면에 일반 문자는 그 처리와 encoding 이 시스템의 locale 설정에 따라 달라지게 된다.
bytea 값을 입력할때, 어떤 octets 값들은 SQL 구문 내에서 문자열 (string literal)의 일부로 사용될 때, 반드시 escape 시켜줘야 한다. (그러나 대부분의 octet 값들이 escape 되어져야 할 것이다) 일반적으로, octet을 escape 시키기 위해서, 그 십진 octet 값에 해당하는 세자리 숫자의 octet number (three-digit octet number) 를 이용해야 하며, 이 숫자 앞에 두개의 backslash 를 적어줘야 한다. Table 8-7 에는 escape 시켜야 하는 문자를 적어 두었으며, 이용할수 있는 대체 escape sequence 를 표기하였다.
Table 8-7. bytea Literal Escaped Octets
Decimal Octet Value |
Description |
Escaped Input Representation |
Example |
Output Representation |
0 |
zero octet |
'\\000' |
SELECT '\\000'::bytea; |
\000 |
39 |
single quote |
'\'' or '\\047' |
SELECT '\''::bytea; |
' |
92 |
backslash |
'\\\\' or '\\134' |
SELECT '\\\\'::bytea; |
\\ |
Table 8-7 에 기록된 octet 은 비록 화면 출력시에는 한글자 이상의 backslash 와 zero octet 로 표시되더라도, 정확히 한자의 길이라는 것을 명심하기 바란다.
Table 8-7 에서 처럼 많은 backslash 를 적어 줘야 하는 이유는 입력 문자열들이 PostgreSQL 서버내에서 두단계의 구문분석기를 통과해야 하기 때문이다. 첫번째 쌍의 backslash 는 string-literal parser 에 의해서 escape 문자로서 해석되어지면서 사용되고, 두번째 backslash 쌍을 남겨 둔다. 남은 backslash 는 bytea 입력 함수에서 three-digit octal value 의 시작임을 표시하거나 또는 또다른 backslash 를 escape 시키기 위해서 사용되어 지는 것이다. 예를 들면, 서버에 '\\001' 가 전달되면, string-literal parser 에서 \001 로 변환된다. \001 은 bytea 입력함수로 전단되는데, 이곳에서 십진수 1의 값을 가지는 octet value 로 변환된다. apostrophe (') 문자는 bytea 에서는 특수 문자로서 취급되지 않는다. 그러므로 일반 문자열과 같이 취급된다는 점을 명심하기 바란다. (Section 4.1.2.1 참조바란다.)
Bytea octets 은 출력시에도 escape 되어진다. 일반적으로 각 "출력할수 없는" octet 은 해당하는 동일한 three-digit octal value 로 변환되고, 앞에 하나의 backslash가 추가된다. 대부분의 "출력할수 있는" octets 은 클라이언트의 character set 에 따라서 적절한 표준적인 문자로서 표시된다. 십진수 92 (backslash)에 해당하는 octet 은 특별히 다른 형태로 출력된다. 자세한 것은 Table 8-8 을 참조바란다.
Table 8-8. bytea Output Escaped Octets
Decimal Octet Value |
Description |
Escaped Output Representation |
Example |
Output Result |
92 |
backslash |
\\ |
SELECT '\\134'::bytea; |
\\ |
0 to 31 and 127 to 255 |
"non-printable" octets |
\xxx (octal value) |
SELECT '\\001'::bytea; |
\001 |
32 to 126 |
"printable" octets |
ASCII representation |
SELECT '\\176'::bytea; |
~ |
여러분들이 사용하는 PostgreSQL 의 frontend 에 따라서, bytea strings 들을 escaping 또는 unescaping 시키기 위해서 추가적인 작업을 해줘야 할 것이다. 예를 들면, 만약 여러분들이 사용하는 인터페이스가 line feeds와 carrage return 을 자동으로 해석해 버린다면 이것을 적당히 escape 시켜줘야 할것이다.
SQL 표준에는 다른 형태의 binary string type 이 정의되어 있는데, 이들은 BLOB 또는 BINARY LARGE OBJECT로 불린다. 입력 형식은 bytea 와 비교하면 다르다. 그러나 거의 동일한 함수와 연산자를 제공한다. |