Redshift CREATE TABLE错误-无效字符

时间:2019-01-11 23:31:57

标签: join casting ascii amazon-redshift

我有两个Redshift表。我可以在它们之间的JOIN上执行select *(在id列上执行join):

SELECT * FROM
table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.user_id

但是,当我将此语句包装在CREATE TABLE子句中时,得到以下内容:

error: Invalid characters: code: 8001 context: Only ASCII characters are allowed in fixed length strings. Invalid ASCII char: c3 a1 query: 5183418 location: funcs_string.cpp:1545

c3a1似乎是非ASCII字符。根据{{​​3}}和Redshift docs,VARCHAR最多可以处理4个字节的字符。因此,我认为这可能与我选择的列无法正确转换有关,因此我尝试了以下操作:

CREATE TABLE table3 AS
SELECT CAST(t1.id AS VARCHAR(255)) 
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.user_id

但是我仍然遇到相同的错误。

只要不对t1和t2进行联接,我就可以成功地在SELECT *上成功创建TABLE *。

我不知所措。值得注意的是,其中一个表(t2)具有一组相当复杂的REGEXP_SUBSTR,它们从JSON中提取值;我不确定这是否有意义,因为即使我没有从t2中选择任何内容,联接也会失败。

2 个答案:

答案 0 :(得分:2)

让我避免出现此问题的方法是使用func_sha1()函数将文本连接列转换为十六进制。这可能很昂贵,但是对我有用。 charvarchar都在联接中失败,但是func_sha1是产生结果的解决方法。

答案 1 :(得分:1)

根据我的评论,此问题是由查询的JOIN条件而不是结果集中的列引起的。

似乎正在发生的事情是,当联接中的一列是CHAR数据类型而一列是VARCHAR时,Redshift会将VARCHAR数据类型隐式转换为CHAR以便评估联接。但是,如果VARCHAR列中有任何字符,则CHAR不允许非ASCII字符,这将失败并产生显示的错误。

解决方法是在联接中将CHAR列强制转换为VARCHAR,这应该意味着联接的两端均被评估为VARCHAR。

请参见https://docs.aws.amazon.com/redshift/latest/dg/r_Character_types.html#r_Character_types-char-or-character

  

CHAR列只能包含单字节字符