Postgresql数据库character varying和character的区别说明

目录
  • 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 字符类型

Name Description
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类型

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • PostgreSQL教程(四):数据类型详解

    一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 1. 整数类型: 类型smallint.integer和bigint存储各种范围的全部是数字的数,也就是没有小数部分的数字.试图存储超出范围以外的数值将导致一个错误.常用的类型是integer,因为它提供了在范围.存储空间和性能之间的最佳平衡.一般只有在磁盘空间紧张的时候才使用smallint.而只有在integer的范围不够的时候才使用bigint,因为前者(integer)绝对快得多.     2. 任意精度数值:

  • 浅谈postgresql数据库varchar、char、text的比较

    如下所示: 名字 描述 character varying(n), varchar(n) 变长,有长度限制 character(n), char(n) 定长,不足补空白 text 变长,无长度限制 简单来说,varchar的长度可变,而char的长度不可变,对于postgresql数据库来说varchar和char的区别仅仅在于前者是变长,而后者是定长,最大长度都是10485760(1GB) varchar不指定长度,可以存储最大长度(1GB)的字符串,而char不指定长度,默认则为1,这点需要

  • Postgresql在mybatis中报错:操作符不存在:character varying == unknown的问题

    错误: 操作符不存在: character varying == unknown , Hint: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换. 在Mybatis条件查询时,动态SQL的一个错误,sql写的也不多,没仔细看所以一直找不到错误,网上也找不到类似的错误,结果是低级错误... <div> <form:select path="finished" class="col-xs-12 form-control m-b"&g

  • Postgresql数据库character varying和character的区别说明

    目录 Postgresql character varying和character的区别 SQL 标准 postgreSQL 字符类型 Postgresql的character varying = bytea问题 Postgresql character varying和character的区别 SQL 标准 SQL 定义了两种基本的字符类型:character varying(n) 和 character(n) ,这里的 n 是一个正整数.两种类型都可以存储最多 n 个字符的字符串. 试图存储

  • Postgresql 数据库 varchar()字符占用多少字节介绍

    如下所示: create table tmp1 ( name varchar(3) ); select pg_size_pretty(pg_relation_size('tmp1')); -- 0 bytes insert into tmp(name) values('欧阳子'); -- 8192 bytes 8192 bytes = 8KB = 1页(数据库的最小单位) 8页 = 1区 = 64KB(记不清磁头一次取1区还是1页数据了) pg_relation_size()函数用于查询表占用空

  • postgreSQL数据库默认用户postgres常用命令分享

    1.修改用户postgres的密码 #alter user postgres with password 'xxxx';(其中xxxx是修改的密码). 2.查看下当前schema的所有者: // 查看当前schema的所有者,相当于\du元命令 SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHE

  • Postgresql 数据库转义字符操作

    产生问题 Postgresql数据库运行下面insert命令 insert into mapping_mac_brand(_id,mac,brand) values(777,'D86595','Toy\'s Myth Inc.') 提示下面的警告: Warning: nonstandard use of \' in a string literal HINT: Use '' to write quotes in strings or use the escape string syntax(E.

  • Postgresql 数据库权限功能的使用总结

    Postgresql数据库支持灵活的权限管理,可以控制一个角色(组.用户)对某张表的读.写.更新.删除等操作权限.执行某个函数的权限以及操作(使用.更新等)视图.序列的权限. PG的权限管理功能比较强大,可以细化到对一张表的各个字段,比如禁止用户访问一张表里的密码字段等,在稍后的内容中给出详细的解释. 虽然在PG数据库中把用户.角色统一叫做角色,甚至创建语句都为create role XXX,但用户和角色之间仍有一定的区别.在这里我们统一把拥有登录权限的叫做用户,没有登录权限的叫做角色,用此方式

  • 如何将postgresql数据库表内数据导出为excel格式(推荐)

    在上篇文章给大家介绍了如何将postgresql数据库表内数据导出为excel格式(推荐) 感兴趣的朋友点击查看. 本文主要用于介绍如何使用copy或者\copy命令将postgresql数据库内表的数据导出为excel格式,方便用户查看编辑. copy命令同\copy命令语法上相同,区别在于copy必须使用能够超级用户使用,copy - to file 中的文件都是数据库服务器所在的服务器上的文件,而\copy 一般用户即可执行且\copy 保存或者读取的文件是在客户端所在的服务器.本文主要以

  • 如何将excel表格数据导入postgresql数据库

    实际的工作中,我们经常会碰到统计数据的工作,有些维度的统计数据因为工作需要我们需要导出为excel作为报表附件供不同的部门审查.为了方便以后的对比工作,领导会让在数据库中创建一张表,用于专门记录这些数据.此时我们DBA需要将这些excel表格导入到数据库中,copy和\copy命令为我们提供了解决办法,本文主要通过copy命令的使用,介绍如何将excel表格导入至数据库中.关于copy及\copy命令的区别,请广大博友通过另一篇文章<如何将postgresql数据库表内数据导出为excel格式>

  • Qt5连接并操作PostgreSQL数据库的实现示例

    教你如何查看官方demo 1. 浏览器搜索Qt,打开第一个连接. 2. 鼠标悬浮Learning,点击下边的Documentation进入文档说明. 3. 找到Qt 5,点击进入. 4. 往下拉,找到Qt SQL,点击进入. 5. 点击进入SQL Programming.也可拉到下边,点击进入SQL Examples查看官方例子. 随便点击一个例子,进入查看 6. 进入数据库使用说明位置. 7. 此时地址栏显示是qt6,如果你使用的是qt5,可以将6改成5,目前不确定6跟5有什么区别. 到此这篇

随机推荐