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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
20天前
|
SQL 存储 关系型数据库
一文搞懂SQL优化——如何高效添加数据
**SQL优化关键点:** 1. **批量插入**提高效率,一次性建议不超过500条。 2. **手动事务**减少开销,多条插入语句用一个事务。 3. **主键顺序插入**避免页分裂,提升性能。 4. **使用`LOAD DATA INFILE`**大批量导入快速。 5. **避免主键乱序**,减少不必要的磁盘操作。 6. **选择合适主键类型**,避免UUID或长主键导致的性能问题。 7. **避免主键修改**,保持索引稳定。 这些技巧能优化数据库操作,提升系统性能。
215 4
一文搞懂SQL优化——如何高效添加数据
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
46 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
99 1
|
1月前
|
SQL 数据可视化 数据处理
使用SQL和Python处理Excel文件数据
使用SQL和Python处理Excel文件数据
52 0
|
30天前
|
SQL 安全 数据库
第三章用sql语句操作数据
第三章用sql语句操作数据
10 0
|
1月前
|
SQL 关系型数据库 分布式数据库
在PolarDB中,如果慢SQL导致了CPU升高,进而又产生了更多的慢SQL
【2月更文挑战第22天】在PolarDB中,如果慢SQL导致了CPU升高,进而又产生了更多的慢SQL
13 1
|
1月前
|
SQL 数据库 数据库管理
SQL中如何添加数据:基础指南
SQL中如何添加数据:基础指南
24 2
|
2月前
|
SQL 数据库 数据安全/隐私保护
sql注入碰到加密数据怎么办
sql注入碰到加密数据怎么办
19 1
|
2月前
|
分布式计算 资源调度 Hadoop
Flink报错问题之Sql往kafka表写聚合数据报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
2月前
|
SQL 消息中间件 Kafka
Flink sql 问题之主动使数据延时一段时间如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
53 2