我有两个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中选择任何内容,联接也会失败。
答案 0 :(得分:2)
让我避免出现此问题的方法是使用func_sha1()
函数将文本连接列转换为十六进制。这可能很昂贵,但是对我有用。 char
和varchar
都在联接中失败,但是func_sha1
是产生结果的解决方法。
答案 1 :(得分:1)
根据我的评论,此问题是由查询的JOIN条件而不是结果集中的列引起的。
似乎正在发生的事情是,当联接中的一列是CHAR数据类型而一列是VARCHAR时,Redshift会将VARCHAR数据类型隐式转换为CHAR以便评估联接。但是,如果VARCHAR列中有任何字符,则CHAR不允许非ASCII字符,这将失败并产生显示的错误。
解决方法是在联接中将CHAR列强制转换为VARCHAR,这应该意味着联接的两端均被评估为VARCHAR。
CHAR列只能包含单字节字符