Redshift varchar太窄了

Roy*_*lTS 0 varchar amazon-web-services amazon-redshift

我有一个表,我填充了来自文件的制表符分隔数据,这些数据的编码似乎不是utf-8,如下所示:

CREATE TABLE tab (
    url varchar(2000),
    ...
);

COPY tab
FROM 's3://input.tsv'
Run Code Online (Sandbox Code Playgroud)

复制完成后,我运行

SELECT
MAX(LEN(url))
FROM tab
Run Code Online (Sandbox Code Playgroud)

返回1525.我想,因为我在浪费空间,所以我可以通过使用varchar(2000)而不是将列重新调整大约四分之一varchar(1525).但是既不重做COPY也不重新设置新表并插入已导入的数据.在这两种情况下,我得到

error:  Value too long for character type
Run Code Online (Sandbox Code Playgroud)

为什么列不能保存这些值?

Joh*_*ein 5

您的文件可能是多字节格式.

LEN功能文档:

LEN函数返回一个整数,表示输入字符串中的字符数.LEN函数返回多字节字符串中的实际字符数,而不是字节数.例如,需要VARCHAR(12)列来存储三个四字节中文字符.LEN函数将为同一个字符串返回3.

由于Amazon Redshift使用的压缩方法,VARCHAR的额外大小不会浪费磁盘空间,但是当从磁盘读取块并将其解压缩到内存中时,它将浪费内存缓冲区空间.