• pg中char、varchar、text之区别


    在了解三者区别之前,

    我们来个实例:

    tt=# create table t3(a char,b varchar);
    CREATE TABLE
    Time: 14.543 ms
    tt=# insert into t3 values('aa','bb');
    ERROR: 22001: value too long for type character(1)
    LOCATION: bpchar, varchar.c:311
    Time: 0.443 ms
    tt=# insert into t3 values('a','bb');
    INSERT 0 1
    Time: 5.943 ms
    tt=# select char_length(a),character_length(a),octet_length(a),bit_length(a) from t3;
    char_length | character_length | octet_length | bit_length
    -------------+------------------+--------------+------------
    1 | 1 | 1 | 8
    (1 row)

    Time: 0.511 ms
    tt=# select char_length(b),character_length(b),octet_length(b),bit_length(b) from t3;
    char_length | character_length | octet_length | bit_length
    -------------+------------------+--------------+------------
    2 | 2 | 2 | 16
    (1 row)

    Time: 0.717 ms
    tt=# create table t3(a char(3),b varchar);
    ERROR: 42P07: relation "t3" already exists
    LOCATION: heap_create_with_catalog, heap.c:1202
    Time: 0.249 ms
    tt=# create table t4(a char(3),b varchar);
    CREATE TABLE
    Time: 13.305 ms
    tt=# insert into t4 values('aaaa','bbbbbb');
    ERROR: 22001: value too long for type character(3)
    LOCATION: bpchar, varchar.c:311
    Time: 0.354 ms
    tt=# insert into t4 values('aaa','bbbbbb');
    INSERT 0 1
    Time: 5.240 ms
    tt=# select char_length(b),character_length(b),octet_length(b),bit_length(b) from t3;
    char_length | character_length | octet_length | bit_length
    -------------+------------------+--------------+------------
    2 | 2 | 2 | 16
    (1 row)

    Time: 0.269 ms
    tt=# select char_length(b),character_length(b),octet_length(b),bit_length(b) from t4;
    char_length | character_length | octet_length | bit_length
    -------------+------------------+--------------+------------
    6 | 6 | 6 | 48
    (1 row)

    Time: 0.339 ms
    tt=# select char_length(a),character_length(a),octet_length(a),bit_length(a) from t4;
    char_length | character_length | octet_length | bit_length
    -------------+------------------+--------------+------------
    3 | 3 | 3 | 24
    (1 row)

    Time: 0.517 ms

    官网解释:

    字符变化(nvarchar(n 有限制的可变长度
    字符(n字符(n 固定长度,空白填充
    文本 可变无限长度

    SQL定义了两种主要的字符类型:character varying( n )character( n ),其中 n是一个正整数。这两种类型都可以存储最长为n 个字符(不是字节)的字符串。尝试将较长的字符串存储到这些类型的列中将导致错误,除非多余的字符都是空格,在这种情况下,字符串将被截断为最大长度。(这个有点奇怪的例外是 SQL标准所要求的。)如果要存储的字符串比声明的长度短, 字符类型的值将被空格填充;类型值字符变化将只存储较短的字符串。

    如果将一个值显式转换为字符变量(n字符(n,那么超长值将被截断为n 个字符而不会引发错误。(这也是SQL标准所要求的。)

    符号varchar( n )char( n )分别是character varying( n )character( n )的别名。没有长度说明符的字符等价于character (1)如果 在没有长度说明符的情况下使用字符变化,则该类型接受任何大小的字符串。后者是 PostgreSQL扩展。

    此外,PostgreSQL 还提供了text类型,可以存储任意长度的字符串。虽然类型文本不在SQL标准中,但其他几个 SQL 数据库管理系统也有它。

    character类型的值在物理上用空格填充到指定的宽度n,并以这种方式存储和显示。但是,填充空间在语义上被视为无关紧要。比较两个字符类型的值时,尾随空格将被忽略,并且在将字符值转换为其他字符串类型之一时,它们将被删除。请注意,尾随空格 在字符变化和 文本值中具有语义意义。

    短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际字符串,其中包括在character情况下的空格填充。较长的字符串有 4 个字节的开销,而不是 1 个。长字符串由系统自动压缩,因此对磁盘的物理要求可能会更少。非常长的值也存储在后台表中,因此它们不会干扰对较短列值的快速访问。无论如何,可以存储的最长的字符串大约是 1 GB。( n允许的最大值在数据类型声明中小于那个。更改它不会有用,因为使用多字节字符编码,字符数和字节数可能完全不同。如果您希望存储没有特定上限的长字符串,请使用不带长度说明符的文本或 字符变化,而不是构成任意长度限制。)

    提示:这三种类型之间没有性能差异,除了在使用空白填充类型时增加了存储空间,以及在存储到长度受限的列时需要一些额外的 CPU 周期来检查长度。虽然character( n )在其他一些数据库系统中具有性能优势,但在PostgreSQL中没有这样的优势 事实上 character( n )通常是三个中最慢的,因为它有额外的存储成本。在大多数情况下,应改为使用文本字符变化。

     
  • 相关阅读:
    linux操作系统及内核
    2.1.1Remove Duplicates from Sorted Arr
    顺序表
    开博篇
    ssh无法root用户登录与登录界面无法选择用户登录
    Ubuntu 18.04 Server安装GUI桌面
    Linux 命令 su 和 sudo 区别
    坑(二十六)—— mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法
    redhat安装wps
    gitlab重置root密码
  • 原文地址:https://www.cnblogs.com/chinaops/p/16689330.html
Copyright © 2020-2023  润新知