我有一张桌子,我填充了来自文件的标签分隔数据,这些文件的编码似乎不是utf-8,如下所示:
CREATE TABLE tab (
url varchar(2000),
...
);
COPY tab
FROM 's3://input.tsv'
复制完成后,我运行
SELECT
MAX(LEN(url))
FROM tab
返回1525
。我想,由于我浪费了空间,我可能会使用varchar(2000)
代替varchar(1525)
将列调整近四分之一。但是既不重做COPY
也不重新设置新表并插入已导入的数据。在这两种情况下,我都会
error: Value too long for character type
为什么列不会保留这些值?
答案 0 :(得分:5)
您的文件可能是多字节格式。
LEN函数返回一个整数,表示输入字符串中的字符数。 LEN函数返回多字节字符串中的实际字符数,而不是字节数。例如,需要VARCHAR(12)列来存储三个四字节中文字符。对于同一个字符串,LEN函数将返回3。
由于Amazon Redshift使用的压缩方法,VARCHAR的额外大小不会浪费磁盘空间,但是当从磁盘读取块并将其解压缩到内存中时,它将浪费内存缓冲区空间。