PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.4. 二进制数据类型

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 8.4. 二进制数据类型 8.4.1. bytea的十六进制格式 8.4.2. bytea的逃逸格式 bytea数据类型允许存储二进制串,参见表 8.6。 表 8.6. 二进制数据类型 名字 存储尺寸 描述 bytea 1或4字节外加真正的二进制串 变长二进制串 二进制串是一个八位位组(或字节)的序列。

8.4. 二进制数据类型

bytea数据类型允许存储二进制串,参见表 8.6

表 8.6. 二进制数据类型

名字 存储尺寸 描述
bytea 1或4字节外加真正的二进制串 变长二进制串

二进制串是一个八位位组(或字节)的序列。 二进制串和字符串的区别有两个: 首先,二进制串明确允许存储零值的字节以及其它不可打印的字节(通常是位于范围 32 到 126 之外的字节)。 字符串不允许零字节,并且也不允许那些对于数据库的选定字符集编码是非法的任何其它字节值或者字节值序列。 第二,对二进制串的操作会处理实际上的字节,而字符串的处理和取决于区域设置。 简单说,二进制字串适用于存储那些程序员认为是裸字节的数据,而字符串适合存储文本。

bytea类型支持两种用于输入和输出的外部格式:PostgreSQL的历史的逃逸格式和十六进制格式。在输入时这两种格式总是会被接受。输出格式则取决于配置参数bytea_output,其默认值为十六进制(注意十六进制格式是在PostgreSQL 9.0中被引入的,早期的版本和某些工具无法理解它)。

SQL标准定义了一种不同的二进制串类型, 叫做BLOB或者BINARY LARGE OBJECT。其输入格式和bytea不同,但是提供的函数和操作符大多一样。

8.4.1. bytea的十六进制格式

十六进制格式将二进制数据编码为每个字节2个十六进制位,最高有效位在前。整个串以序列\x开头(用以和逃逸格式区分)。在某些情景中,开头的反斜线可能需要通过双写来逃逸,在相同的情况中逃逸格式必须要双写反斜线,下文描述了细节。十六进制位可以是大写也可以是小写,在位对之间可以有空白(但是在位对内部以及开头的\x序列中不能有空白)。十六进制格式和很多外部应用及协议相兼容,并且其转换速度要比逃逸格式更快,因此人们更愿意用它。

例子:

SELECT E'\\xDEADBEEF';

8.4.2. bytea的逃逸格式

逃逸格式是bytea类型的传统PostgreSQL格式。它采用将二进制串表示成ASCII字符序列的方法,而将那些无法用ASCII字符表示的字节转换成特殊的逃逸语句。从应用的角度来看,如果将字节表示为字符有意义,那么这种表示将很方便。但是在实际中,这常常是令人困扰的,因为它使二进制串和字符串之间的区别变得模糊,并且这种特别的逃逸机制也有点难于处理。因此这种格式可能会在大部分新应用中避免使用。

在逃逸模式下输入bytea值时,某些值的字节必须被逃逸,而所有的字节值都可以被逃逸。通常,要逃逸一个字节,需要把它转换成与它的三位八进制值, 并且前导一个反斜线(或者两个反斜线,如果使用逃逸串语法将值写成一个字面含义)。反斜线本身(字节值92)也可以用双写的反斜线表示。表 8.7显示了必须被逃逸的字符,并给出了可以使用的替代逃逸序列。

表 8.7. bytea文字逃逸字节

十进制字节值 描述 逃逸输入表示 例子 输出表示
0 0字节 E'\\000' SELECT E'\\000'::bytea; \000
39 单引号 ''''E'\\047' SELECT E'\''::bytea; '
92 反斜线 E'\\\\'E'\\134' SELECT E'\\\\'::bytea; \\
0到31和127到255 不可打印的字节 E'\\xxx'(八进制值) SELECT E'\\001'::bytea; \001

逃逸不可打印的字节的要求取决于区域设置。在某些实例中,你可以不理睬它们,让它们保持未逃逸的状态。注意在表 8.7的每一个例子中的结果的长度正好是一个字节,即使其输出表示有时超过一个字符。

表 8.7中所示,要求多个反斜线的原因是写成一个串文字的输入串在PostgreSQL服务器中必须经过两个分析阶段。每一对中的第一个反斜线被串文字分析器(假设使用了逃逸串语法)解释为一个逃逸字符并且因此被消耗,只留下该对中的第二个反斜线(美元符号包围的串可以被用于防止这一层的逃逸)。剩下的反斜线接着被bytea输入函数识别为开始一个三位八进制值或逃逸另一个反斜线。例如,一个传递给服务器的串文字是E'\\001',它在通过逃逸串分析器后变成\001\001接着被送给bytea输入函数,这里它被转换成一个十进制值为1的单字节。注意单引号字符串不会被bytea特殊对待,因此它遵循串文字的正常规则(参见第 4.1.2.1 节)。

Bytea字节有时在输出时被逃逸。通常,每一个不可打印的字节会被转换成与之等效的三位八进制值并且前置一个反斜线。大部分可打印的字节被表示为它们在客户端字符集中的标准表示形式。十进制值为92(反斜线)的字节在输出时被双写。详情请见表 8.8

表 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串方面可能需要做额外的工作。例如,如果你的接口自动翻译换行和回车,你可能也不得不逃逸它们。

本文转自PostgreSQL中文社区,原文链接:8.4. 二进制数据类型

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
9月前
|
SQL 人工智能 关系型数据库
PostgreSQL 常用SQL(持续更新...)
PostgreSQL 常用SQL(持续更新...)
|
9月前
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错之使用SQL 将 PostgreSQL 的 date 类型字段转换为 TIMESTAMP 类型时遇到报错,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
6月前
|
SQL 存储 关系型数据库
PostgreSQL核心之SQL基础学习
PostgreSQL核心之SQL基础学习
72 3
|
6月前
|
SQL 安全 关系型数据库
PostgreSQL SQL注入漏洞(CVE-2018-10915)--处理
【8月更文挑战第8天】漏洞描述:PostgreSQL是一款自由的对象关系型数据库管理系统,支持多种SQL标准及特性。存在SQL注入漏洞,源于应用未有效验证外部输入的SQL语句,允许攻击者执行非法命令。受影响版本包括10.5及更早版本等。解决方法为升级PostgreSQL
378 2
|
6月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
679 0
|
6月前
|
开发框架 关系型数据库 数据库
在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。
在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。
|
8月前
|
SQL 关系型数据库 数据库
nacos 2.2.3版本 查看配置文件的历史版本的接口 是针对MySQL数据库的sql 改成postgresql后 sql语句报错 该怎么解决
在Nacos 2.2.3中切换到PostgreSQL后,执行配置文件历史版本分页查询出错,因`LIMIT 0, 10`语法不被PostgreSQL支持,需改为`LIMIT 10 OFFSET 0`。仅当存在历史版本时报错。解决方案是调整查询SQL以兼容PostgreSQL语法。
|
8月前
|
SQL 关系型数据库 PostgreSQL
【sql】PostgreSQL物化视图表使用案例
【sql】PostgreSQL物化视图表使用案例
79 0
|
9月前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
555 0