使用数据类型“文本”存储字符串有什么缺点吗?

2023-12-07

根据PostgreSQL 文档,它们支持 3 种字符数据数据类型:

character varying(n), varchar(n)  variable-length with limit
character(n), char(n)             fixed-length, blank padded
text                              variable unlimited length

在我的应用程序中,我遇到了一些令人不快的情况,其中插入/更新查询失败,因为要插入的所需文本超出了varchar(n) or char(n) limit.

对于这种情况,将此类列的数据类型更改为text够了。

我的问题是:

  • 如果我们概括并将每个字符存储列的数据类型更改为text,在性能/内存方面有什么缺点吗?
  • 如果列的数据类型text每次存储 10 个或更少的字符,我应该选择吗text or varchar(10)?
  • 如果我去text有什么缺点?

一般来说,有no使用的缺点text在性能/内存方面。相反:text是最优的。其他类型或多或少都有相关的缺点。text从字面上看就是字符串类型中的“首选”类型在 Postgres 类型系统中,这可能会影响函数或运算符类型解析。

尤其,never使用char(n)罢工>(别名为character(n)罢工>),除非你知道自己在做什么。char or character只是缩写character(1),所以都一样。内部名称是bpchar(代表“空白填充字符”)。该类型只是为了与旧代码和标准兼容。如今它已经没有什么意义了,浪费内存并且可能会引起麻烦:

  • 比较 varchar 和 char
  • Postgresql 中的字符串字段长度

您可以使用varchar(n)带长度修饰符(别名为character varying(n)). But varchar(255) 通常表示误解从其他 RDBMS 继承而来,它可能是性能的局部最佳值。在Postgres中,长度修饰符(255)没有特殊意义,也很少有意义。

  • 我应该为 VARCHAR 列添加任意长度限制吗?

旧版本在尝试更改长度修饰符时会导致各种问题varchar(n)之后。其中大部分问题在现代 Postgres 中已经得到缓解,但是text or varchar(别名为character varying)没有长度说明符(和CHECK约束相反)从未遇到过任何这些问题。

A CHECK约束同样快,并且不太可能对依赖于列类型的视图、函数、FK 约束等造成麻烦。它不仅可以强制执行最大字符长度 - 您可以放入布尔表达式中的任何内容。看:

  • 更改视图中使用的 PostgreSQL 列

最后,还有"char"(带双引号):用作廉价内部枚举类型的单个 ASCII 字母的 1 字节数据类型。

我很少使用除此之外的任何东西text用于 Postgres 中的字符数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用数据类型“文本”存储字符串有什么缺点吗? 的相关文章

  • <表值函数> 不是可识别的内置函数名称

    我收到此错误 消息 195 第 15 级 状态 10 第 1 行 fnParseName 不是可识别的内置函数名称 对于这个查询 SELECT fnParseName DOCTORFIRSTNAME DOCTORLASTNAME FROM
  • FireDac 添加下划线 1 以区分具有相同名称的 2 个列名

    我有一个连接 2 个表的选择 因此这些表中存在具有相似名称的列 因此现在在检索结果时 FireDac 将下划线 1 添加到第二个列名称以区分这两个表 Select from Table1 inner join Table2 on Table
  • SQL Server 中全文搜索的奇怪行为

    我的 MyTable 带有列消息 NVARCHAR MAX ID 为 1 的记录包含消息 0123456789333444 Test 当我运行以下查询时 DECLARE Keyword NVARCHAR 100 SET Keyword 01
  • 授予用户 ALTER 函数的权限

    我试着ALTER一个新用户的函数 我收到错误 ERROR must be owner of function ACases Error ERROR must be owner of function ACases SQL state 425
  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • 使用显式创建表语句与 select into 创建表

    使用显式创建表语句和加载数据与选择数据之间是否存在性能差异 此示例仅显示 2 列 但问题是针对使用非常大的表 下面的示例也使用临时表 尽管我也想知道使用常规表的效果 我认为无论表格类型如何 它们都是相同的 临时表场景 Explicitly
  • 记录 Google Cloud SQL PostgreSQL 实例上的慢速查询

    我工作的公司使用 Google Cloud SQL 来管理生产中的 SQL 数据库 我们遇到了性能问题 我认为查看 监控高于特定阈值 例如 250 毫秒 的所有查询是一个好主意 除其他外 通过查看PostgreSQL 文档 https ww
  • SQL Server 2008 GUID 列全为 0

    我希望这是我做的一个简单的傻事 我的数据库中有一个表 设置如下 column name widget guid data type uniqueidentifier allow nulls false default value newid
  • 如何在postgresql中编写有关最大行数的约束?

    我认为这是一个很常见的问题 我有一张桌子user id INT 和一张桌子photo id BIGINT owner INT 所有者是一个参考user id 我想向表照片添加一个约束 以防止每个用户将超过 10 张照片输入数据库 写这个的最
  • 火鸟删除速度很慢

    我正在做这个简单的交易 DELETE FROM ominve01 WHERE CVE OBS IN SELECT CVE OBS FROM minve01 M WHERE M FECHA DOCU lt 31 12 2010 OR FECH
  • 将自动递增值添加到只有一列的表中

    我需要创建一个基本上仅保留索引列表的表 因此 我创建了一个只有一个名为 id 的自动递增列的表 但是 我似乎无法隐式地将自动递增值添加到该表中 我知道通常当您在表中有这样一列 不仅仅是此列 时 您可以执行以下操作 插入表 col1 col2
  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • 如何编写不返回任何内容的 postgres 存储过程?

    如何在 postgres 中编写一个根本不返回值的简单存储过程 即使使用 void 返回类型 当我调用存储过程时 我也会返回一行 CREATE FUNCTION somefunc in id bigint RETURNS void AS B
  • 迁移问题:MS SQL > MySQL:插入缓冲区内存

    我在使用 MySQL Workbench 上的内置迁移工具时遇到问题 我正在将一个非常大的数据库从 MS SQL 2014 迁移到 MySQL MS SQL 服务器本地部署在我的 Windows 8 1 桌面上 MySQL 服务器在我的网络
  • SQL Server - SQL 替换整个数据库中所有表中的所有列

    这是一个很遥远的事情 我猜这个问题没有简单的答案 但是 我继承了一个数据库 其中填充了一些可怕的数据 许多包含描述的行都有回车符 这意味着当我们 BCP 输出数据时 它会带有回车符 我的问题 有没有办法在 MS SQL Server 中对整
  • 在 Oracle 中使用数据透视表的建议

    我需要一份报告 我应该使用数据透视表 报告将按类别分组 使用 case when 语句不好 因为有很多类别 您可以将 Northwind 数据库视为示例 所有类别将显示为列和报告将显示客户在类别中的偏好 我不知道另一个解决方案 并在互联网上
  • 从一张表更新并插入另一张表

    我有两张桌子 table1 ID 代码 姓名 table2 ID 代码 姓名 具有相同的列 我想将数据从 table1 插入到 table2 或更新列 如果 table2 中存在 table1 ID table2 ID 执行此操作的简单方法
  • 如何删除MySQL中的所有事件

    如果我想删除某个事件 我需要查询类似的内容 DROP EVENT IF EXISTS eventname 但我找不到一次性删除所有事件的命令 必须一项一项地删除 有没有一次性删除所有事件的SQL DROP EVENT IF EXISTS S
  • 如何在 Postgresql 中将 GIST 或 GIN 索引与 hstore 列一起使用?

    我正在使用 postgresql 9 3 的 hstore 我正在尝试对 hstore 列使用索引就像文档所述 http www postgresql org docs 9 3 static hstore html 我的问题是索引似乎没有被
  • 如何在sql server 2008R2中将单个单元格拆分为多个列?

    我想将每个名称拆分为各个列 create table split test value integer Allnames varchar 40 insert into split test values 1 Vinoth Kumar Raj

随机推荐