当前位置:网站首页> Postgresql数据库character varying和character的区别说明
Postgresql数据库character varying和character的区别说明
2022-07-07 18:38:00 【1024问】
Postgresql character varying和character的区别
SQL 标准
postgreSQL 字符类型
Postgresql的character varying = bytea问题
Postgresql character varying和character的区别SQL 标准SQL 定义了两种基本的字符类型:character varying(n) 和 character(n) ,这里的 n 是一个正整数。两种类型都可以存储最多 n 个字符的字符串。
试图存储更长的字符串到这些类型的字段里会产生一个错误,除非超出长度的字符都是空白,这种情况下该字符串将被截断为最大长度。
这个看上去有点怪异的例外是 SQL 标准要求的。如果要存储的字符串比声明的长度短,类型为 character 的数值将会用空白填满;而类型为 character varying 的数值将只是存储短些的字符串。
如果我们明确地把一个数值转换成 character varying(n) 或 character(n) ,那么超长的数值将被截断成 n 个字符,且不会抛出错误。这也是 SQL 标准的要求。
postgreSQL 字符类型character varying(n), varchar(n) | 变长,有长度限制 |
character(n), char(n) | 定长,不足补空白 |
text | 变长,无长度限制 |
长度区别
varchar(n) 和 char(n) 分别是 character varying(n) 和 character(n) 的别名,没有声明长度的 character 等于 character(1) ;character varying 不带长度使用 ,那么该类型接受任何长度的字符串。后者是 PostgreSQL 的扩展。
另外,PostgreSQL 提供 text 类型,它可以存储任何长度的字符串。尽管text类型不是 SQL 标准,但是许多 SQL 数据库系统也有它。
物理存储
character 类型的数据,在物理上都用空格(原文: space)填充到指定长度 n 并且以这种方式存储和显示。不过,填充的空白在是无语意的。
在比较两个 character 值的时候,填充的空白都会被忽略,在转换成其它字符串类型的时候,character 值里面的空格会被删除。请注意,在 character varying 和 text 类型的数据里,结尾的空白是有语意的。
这些类型的存储需求是 4 字节加上实际的字符串,如果是 character 的话再加上填充的字节(上面提到的空格)。
长字符串将会自动被系统压缩,因此在磁盘上的物理需求可能会更少些。长字符串也会存储在后台表里面,这样它们就不会干扰对短字段的快速访问(我的理解是:磁盘寻址路径或者次数更少?有知道的还望指出!!!)。不管怎样,允许存储的最长字符串大概是 1GB 。
允许在数据类型声明中出现的 n 的最大值小于该最大值。更改此值不是很有用,因为使用多字节字符编码时,字符和字节数可能会完全不同。
如果你想存储没有特定上限的长字符串,那么使用 text 或没有长度声明词的 character varying ,而不要设定长度限制。
性能差异
这三种类型之间没有性能差别,只不过是在使用 character 的时候增加了存储尺寸。
虽然在某些其它的数据库系统里,character(n) 有一定的性能优势,但在 PostgreSQL 里没有。
在大多数情况下,应该使用 text 或 character varying 。
参考:pg 8.2.23文档
Postgresql的character varying = bytea问题Java开发Postgresql 数据库兼容应用的问题,与Oracle有一些不同:
Java类型映射数据库类型的不同,Oracle jdbc驱动程序处理Java String类型可正常映射到数据库的Numberic(Integer),而Postgres则会出错。
另外,则是使用hibernate时经常的错误: operator不存在:character varying = bytea问题,不要被这个描述误导了,并不是sql语句中character varying = bytea类型的比较,而是当使用hibernate使用参数绑定,而参数的值为null时,hibernate或者Postgresql驱动将这个参数 映射为varbinary类型,Postgresql将varbinary认为为bytea类型
以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。
边栏推荐
- Codesonar enhances software reliability through innovative static analysis
- [award publicity] issue 22 publicity of the award list in June 2022: Community star selection | Newcomer Award | blog synchronization | recommendation Award
- AADL Inspector 故障树安全分析模块
- Apifox interface integrated management new artifact
- Jenkins 用户权限管理
- TS quick start - Generic
- 静态测试工具
- 深度学习模型压缩与加速技术(七):混合方式
- 恶魔奶爸 B3 少量泛读,完成两万词汇量+
- Mongodb由浅入深学习
猜你喜欢
Implement secondary index with Gaussian redis
上海交大最新《标签高效深度分割》研究进展综述,全面阐述无监督、粗监督、不完全监督和噪声监督的深度分割方法
H3C s7000/s7500e/10500 series post stack BFD detection configuration method
Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
【OpenCV 例程200篇】223. 特征提取之多边形拟合(cv.approxPolyDP)
Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city
Nebula Importer 数据导入实践
H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法
Codesonar enhances software reliability through innovative static analysis
【C语言】指针进阶---指针你真的学懂了吗?
随机推荐
Measure the height of the building
Tensorflow2.x下如何运行1.x的代码
Small guide for rapid formation of manipulator (12): inverse kinematics analysis
How does codesonar help UAVs find software defects?
How to choose fund products? What fund is suitable to buy in July 2022?
神兵利器——敏感文件发现工具
网络原理(1)——基础原理概述
guava多线程,futurecallback线程调用不平均
理财产品要怎么选?新手还什么都不懂
Validutil, "Rethinking the setting of semi supervised learning on graphs"
Lingyun going to sea | yidiantianxia & Huawei cloud: promoting the globalization of Chinese e-commerce enterprise brands
机械臂速成小指南(十二):逆运动学分析
Implement secondary index with Gaussian redis
上海交大最新《标签高效深度分割》研究进展综述,全面阐述无监督、粗监督、不完全监督和噪声监督的深度分割方法
不落人后!简单好用的低代码开发,快速搭建智慧管理信息系统
ISO 26262 - 基于需求测试以外的考虑因素
Intelligent software analysis platform embold
微服务远程Debug,Nocalhost + Rainbond微服务开发第二弹
最新版本的CodeSonar改进了功能安全性,支持MISRA,C ++解析和可视化
Helix QAC 2020.2 new static test tool maximizes the coverage of standard compliance