2017-02-19 3 views
0

J'ai une table que je remplir avec des données séparées par des tabulations des fichiers dont le codage ne semble pas être utf-8 exactement, comme ceci:Redshift varchar trop étroite

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

COPY tab 
FROM 's3://input.tsv' 

Une fois la copie a terminé je cours

SELECT 
MAX(LEN(url)) 
FROM tab 

qui renvoie 1525. Je figure, puisque je gaspille l'espace que je pourrais aussi bien redimensionner la colonne par près d'un quart à l'aide varchar(2000) au lieu de varchar(1525). Mais ni refaire le COPY ni la mise en place d'une nouvelle table et l'insertion des œuvres de données déjà importées. Dans les deux cas, je reçois

error: Value too long for character type 

Pourquoi la colonne ne conserve-t-elle pas ces valeurs?

Répondre

5

Votre fichier peut être dans un format multi-octets.

De l'LEN Function documentation:

La fonction LEN renvoie un nombre entier indiquant le nombre de caractères dans la chaîne d'entrée. La fonction LEN renvoie le nombre réel de caractères dans les chaînes multi-octets, pas le nombre d'octets. Par exemple, une colonne VARCHAR (12) est nécessaire pour stocker trois caractères chinois sur quatre octets. La fonction LEN retournera 3 pour cette même chaîne.

La taille supplémentaire d'un VARCHAR ne sera pas perdre de l'espace disque en raison des méthodes de compression utilisées par Amazon Redshift, mais il gaspillera en mémoire l'espace tampon lorsqu'un bloc est lu à partir du disque et décompressé en mémoire.