当前位置:网站首页> 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类型
以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。
边栏推荐
- [MySQL - Basic] transactions
- 基于深度学习的目标检测的更新迭代总结(持续更新ing)
- Mongodb由浅入深学习
- Phoenix JDBC
- 目前股票开户安全吗?可以直接网上开户吗。
- Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
- 取两个集合的交集
- Mongodb learn from simple to deep
- 寫一下跳錶
- Precautions for cjson memory leakage
猜你喜欢

I Basic concepts

C语言多角度帮助你深入理解指针(1. 字符指针2. 数组指针和 指针数组 、数组传参和指针传参3. 函数指针4. 函数指针数组5. 指向函数指针数组的指针6. 回调函数)

智能软件分析平台Embold

Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city

CodeSonar如何帮助无人机查找软件缺陷?

写了个 Markdown 命令行小工具,希望能提高园友们发文的效率!

使用高斯Redis实现二级索引

Nebula Importer 数据导入实践

Small guide for rapid formation of manipulator (12): inverse kinematics analysis

Apifox interface integrated management new artifact
随机推荐
寫一下跳錶
恶魔奶爸 C
ERROR: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your
凌云出海记 | 易点天下&华为云:推动中国电商企业品牌全球化
Referrer和Referrer-Policy简介
Tensorflow2. How to run under x 1 Code of X
CodeSonar网络研讨会
数值法求解最优控制问题(〇)——定义
Get webkitformboundary post login
H3C s7000/s7500e/10500 series post stack BFD detection configuration method
Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city
FTP steps for downloading files from Huawei CE switches
一. 基础概念
Try the tuiroom of Tencent cloud (there is an appointment in the evening, which will be continued...)
网络原理(1)——基础原理概述
How to choose financial products? Novice doesn't know anything
Numerical method for solving optimal control problem (0) -- Definition
Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
2022如何评估与选择低代码开发平台?
字符串中数据排序