当前位置:网站首页> 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如何帮助无人机查找软件缺陷?
- 凌云出海记 | 易点天下&华为云:推动中国电商企业品牌全球化
- Small guide for rapid formation of manipulator (12): inverse kinematics analysis
- AADL inspector fault tree safety analysis module
- Mongodb由浅入深学习
- 如何满足医疗设备对安全性和保密性的双重需求?
- Static analysis of software defects codesonar 5.2 release
- 使用 BR 备份 TiDB 集群数据到 Azure Blob Storage
- 测量楼的高度
- 静态测试工具
猜你喜欢
AADL Inspector 故障树安全分析模块
Mongodb由浅入深学习
测量楼的高度
智能软件分析平台Embold
Tensorflow2.x下如何运行1.x的代码
Helix QAC 2020.2 new static test tool maximizes the coverage of standard compliance
How does codesonar help UAVs find software defects?
一. 基础概念
大厂经典指针笔试题
Codesonar enhances software reliability through innovative static analysis
随机推荐
微服务远程Debug,Nocalhost + Rainbond微服务开发第二弹
Mrs offline data analysis: process OBS data through Flink job
Numerical method for solving optimal control problem (0) -- Definition
Intelligent software analysis platform embold
Implement secondary index with Gaussian redis
【解决】package ‘xxxx‘ is not in GOROOT
Details of C language integer and floating-point data storage in memory (including details of original code, inverse code, complement, size end storage, etc.)
guava多线程,futurecallback线程调用不平均
Try the tuiroom of Tencent cloud (there is an appointment in the evening, which will be continued...)
恶魔奶爸 C
使用高斯Redis实现二级索引
如何满足医疗设备对安全性和保密性的双重需求?
C语言 整型 和 浮点型 数据在内存中存储详解(内含原码反码补码,大小端存储等详解)
Flask1.1.4 Werkzeug1.0.1 源码分析:路由
POJ 1742 Coins ( 单调队列解法 )「建议收藏」
You want to kill a port process, but you can't find it in the service list. You can find this process and kill it through the command line to reduce restarting the computer and find the root cause of
最新版本的CodeSonar改进了功能安全性,支持MISRA,C ++解析和可视化
With st7008, the Bluetooth test is completely grasped
[résolution] le paquet « xxxx» n'est pas dans goroot
如何挑选基金产品?2022年7月份适合买什么基金?