Postgresql Postgres文本数据类型截断问题

Postgresql Postgres文本数据类型截断问题,postgresql,Postgresql,我正在使用Postgres 9.3。当我在数据类型为“text”的列中插入一个大字符串时,它会不断被截断为256个字符 我很困惑。博士后的文档称“文本”数据类型是可变的,长度不限 请帮忙 您的应用程序框架正在截断这些值。PostgreSQL从不截断text或varchar的值。它将截断传统的字符空格填充类型的值,但仅在显式强制转换上 CREATE TABLE testtruncation( text_unlimited text, text_limit255 text check

我正在使用Postgres 9.3。当我在数据类型为“text”的列中插入一个大字符串时,它会不断被截断为256个字符

我很困惑。博士后的文档称“文本”数据类型是可变的,长度不限


请帮忙

您的应用程序框架正在截断这些值。PostgreSQL从不截断
text
varchar
的值。它将截断传统的
字符
空格填充类型的值,但仅在显式强制转换上

CREATE TABLE testtruncation(
    text_unlimited text,
    text_limit255 text check (length(text_limit255) <= 255),
    varchar_unlimited varchar,  
    varchar_255 varchar(255), 
    char_nosize character,
    char_255 character(255)
);

regress=> insert into testtruncation(text_unlimited) values ('abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789');
INSERT 0 1

regress=> insert into testtruncation(text_limit255) values ('abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789');
ERROR:  new row for relation "testtruncation" violates check constraint "testtruncation_text_limit255_check"
DETAIL:  Failing row contains (null, abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEF..., null, null, null, null).

regress=> insert into testtruncation(varchar_unlimited) values ('abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789');
INSERT 0 1

regress=> insert into testtruncation(varchar_255) values ('abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789');
ERROR:  value too long for type character varying(255)

regress=> insert into testtruncation(char_nosize) values ('abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789');
ERROR:  value too long for type character(1)

regress=> insert into testtruncation(char_255) values ('abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789');
ERROR:  value too long for type character(255)

但是最好使用
子字符串
来代替它,而且在任何情况下,在您不知情的情况下都不太可能发生这种情况。

与其他一些DBMS不同,Postgres不会自动截断值。如果某个值太大,无法放入列中,则会收到一个错误。运行SQL语句并将值发送到数据库的任何代码都会截断您的值。感谢您提供您的版本。如果您正在连接特定的应用程序框架或程序,那么如果您包含诸如所使用的语言和客户端驱动程序之类的详细信息,那么它也很有用。
regress=> SELECT CAST('abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789abcdefghijklmnopABCDEFGHIJKLMNOP0123456789' AS character(20));
        bpchar        
----------------------
 abcdefghijklmnopABCD
(1 row)