Документация по PostgreSQL 8.4.2 | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 8. Типы данных | Fast Forward | Next |
Тип bytea позволяет хранить двоичные строки; смотри Table 8-6.
Table 8-6. Двоичные типы данных
Имя | Размер хранения | Описание |
---|---|---|
bytea | 1 или 4 байта плюс сама двоичная строка | двоичная строка переменной длины |
Двоичная строка — это последовательность байт (или октетов). Есть два отличия двоичных строки от символьных: Во-первых, двоичные строки специально позволяют хранить байтовое представление таких символов как ноль и других "непечатаемых" символов (обычно, это символы представленные кодами в диапазоне до 32 и от 126). Символьные строки не позволяют содержать в себе символ ноль, а также любые другие значения и последовательности байт, которые не допускаются той кодировкой, с которой работает СУБД. Во-вторых, операции с двоичными строками осуществляются с байтами, в то время как операции с символьными строками зависят от установок используемой локали. В общем, двоичные строки подходят для хранения данных, которые программист считает "просто байтами", в то время как символьные строки походят для хранения текста.
При вводе значений типа bytea, байты определённых значений, которые используются как части строчных литералов в каких-либо операторах SQL должны быть экранированы (все байтовые значения могут быть экранированы). В общем случае, чтобы экранировать вводимое значение оно преобразуется в трёхциферное восьмеричное значение эквивалентное его десятичному значению и предваряется двумя символами обратная косая черта. Table 8-7 показывает символы которые должны быть экранированы и предоставляет альтернативные escape последовательности там где это возможно.
Table 8-7. bytea Экранируемые литеральные значения
Десятичное значение | Описание | Как нужно экранировать | Пример | Представление на выходе |
---|---|---|---|---|
0 | ноль | E'\\000' | SELECT E'\\000'::bytea; | \000 |
39 | одиночная кавычка | '''' or E'\\047' | SELECT E'\''::bytea; | ' |
92 | обратная косая черта | E'\\\\' or E'\\134' | SELECT E'\\\\'::bytea; | \\ |
от 0 до 31 и от 127 до 255 | "непечатаемый" символ | E'\\xxx' (octal value) | SELECT E'\\001'::bytea; | \001 |
Требование об экранировании непечатаемых символов варьируется в зависимости от установок локали. В некоторых случаях вы можете оставлять их незаэкранированными. Заметим, что результат в каждом примере в Table 8-7 составлял точно один байт в длину, даже если предоставление иногда выглядит как более одного символа.
Причина, по которой требуется так много символов обратная косая черта в Table 8-7 заключается в том, что вводимый строковый литерал должен пройти на сервере PostgreSQL через две фазы обработки. Первая обратная косая черта каждой пары итерпретируется для обработчика строкового литерала (включая использование синтаксиса экранирования) как символ экранирования и, таким образом, опускается, оставляя второй символ обратная косая черта в паре. (Для того, чтобы избежать этого уровня экранирования можно использовать строки доллар-кавычка.) Оставшийся символ обратная косая черта затем распознаётся функцией ввода типа bytea, как начинающий трёхциферное восьмеричное значение или символ экранирования следующего символа обратная косая черта. Например, строковый литерал, передаваемый на сервер как 'E\\001' принимает вид \001 после обработчика строкового литерала. Далее \001 посылается функции ввода типа bytea, где преобразовывается в одиночный байт с десятичным значением 1. Заметим, что символ одиночной кавычки для bytea не считается специальным, так как он отвечает обычным правилам строковых литералов. (См. также Section 4.1.2.1.)
Значения Bytea при выводе иногда экранируются. Обычно, в виде эквивалентного трёхциферного восьмеричного значения, предваряемого символом обратная косая черта. Большинство "печатаемых" байт выводится в их стандартном представлении, согласно кодировке клиента. Символ с десятичным значением 92 (обратная косая черта) выводится дважды. Подробности смотрите в Table 8-8.
Table 8-8. bytea Экранированные значения на выводе
Десятичное значение | Описание | Экранированное представление при выводе | Пример | Результат вывода |
---|---|---|---|---|
92 | обратная косая черта | \\ | SELECT E'\\134'::bytea; | \\ |
от 0 до 31 и от 127 до 255 | "непечатаемые" значения | \xxx (восьмеричное значение) | SELECT E'\\001'::bytea; | \001 |
от 32 до 126 | "печатаемые" значения | представление по кодировке клиента | SELECT E'\\176'::bytea; | ~ |
В зависимости от программы, которую вы используете для работы с PostgreSQL, у вас могут быть дополнительные иструменты для работы с экранированными и неэкранированными строками типа bytea. Например, роль экранирующего символа у вас можете также играть символ перевода строки и возврата каретки, если в таковые их автоматически будет преобразовывать ваш интерфейс.
Стандарт SQL определяет другой тип двочной строки, называемый BLOB или BINARY LARGE OBJECT. Формат ввода для этого типа отличается от bytea, но предоставляемые функции и операторы в большинстве своём такие же.