2017-02-19 36 views
0

我已經得到了我從文件其編碼製表符分隔的數據填充似乎並不爲UTF-8完全相同,像這樣的表:紅移VARCHAR太窄

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 

爲什麼列不能保存這些值?

回答

5

您的文件可能是多字節格式。

LEN Function documentation

Len函數返回一個整數,指示字符的輸入字符串的數目。 LEN函數返回多字節字符串中的實際字符數,而不是字節數。例如,需要VARCHAR(12)列來存儲三個四字節中文字符。 LEN函數將返回3用於相同的字符串。

一個VARCHAR的額外的大小不會由於亞馬遜紅移使用的壓縮方法浪費的磁盤空間,但它會浪費內存緩衝區空間時的塊從磁盤讀出並解壓縮到內存中。