当前位置:网站首页> 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类型
以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。
边栏推荐
- 复杂因子计算优化案例:深度不平衡、买卖压力指标、波动率计算
- How to meet the dual needs of security and confidentiality of medical devices?
- 目前股票开户安全吗?可以直接网上开户吗。
- Is it safe to open a stock account at present? Can I open an account online directly.
- 有用的win11小技巧
- 测量楼的高度
- 【解决】package ‘xxxx‘ is not in GOROOT
- Static analysis of software defects codesonar 5.2 release
- Lingyun going to sea | saihe & Huawei cloud: jointly help the sustainable development of cross-border e-commerce industry
- Jenkins 用户权限管理
猜你喜欢
Codesonar enhances software reliability through innovative static analysis
【C语言】指针进阶---指针你真的学懂了吗?
H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法
How to meet the dual needs of security and confidentiality of medical devices?
Static analysis of software defects codesonar 5.2 release
测量楼的高度
使用高斯Redis实现二级索引
Opencv learning notes high dynamic range (HDR) imaging
软件缺陷静态分析 CodeSonar 5.2 新版发布
Measure the height of the building
随机推荐
Referrer和Referrer-Policy简介
Phoenix JDBC
Mongodb由浅入深学习
大厂经典指针笔试题
How to test CIS chip?
目前股票开户安全吗?可以直接网上开户吗。
恢复持久卷上的备份数据
awk处理JSON处理
机械臂速成小指南(十一):坐标系的标准命名
Tensorflow2.x下如何运行1.x的代码
最新版本的CodeSonar改进了功能安全性,支持MISRA,C ++解析和可视化
Flask1.1.4 werkzeug1.0.1 source code analysis: Routing
AADL Inspector 故障树安全分析模块
理财产品要怎么选?新手还什么都不懂
九度 1201 -二叉排序数遍历- 二叉排序树「建议收藏」
有用的win11小技巧
Is embedded system really safe? [how does onespin comprehensively solve the IC integrity problem for the development team]
How to meet the dual needs of security and confidentiality of medical devices?
华为CE交换机下载文件FTP步骤
【解决】package ‘xxxx‘ is not in GOROOT