Join 红移创建表错误-无效字符

Join 红移创建表错误-无效字符,join,casting,ascii,amazon-redshift,Join,Casting,Ascii,Amazon Redshift,我有两张红移的桌子。我可以对它们之间的联接执行select*(正在对id列执行联接): 但是,当我将此语句包装到CREATETABLE子句中时,会得到以下结果: CREATE TABLE table3 AS SELECT CAST(t1.id AS VARCHAR(255)) FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.user_id 错误:无效字符:代码:8001上下文:固定长度字符串中只允许使用ASCII字符。无效的ASCII字符:c

我有两张红移的桌子。我可以对它们之间的联接执行select*(正在对id列执行联接):

但是,当我将此语句包装到CREATETABLE子句中时,会得到以下结果:

CREATE TABLE table3 AS
SELECT CAST(t1.id AS VARCHAR(255)) 
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.user_id
错误:无效字符:代码:8001上下文:固定长度字符串中只允许使用ASCII字符。无效的ASCII字符:c3 a1查询:5183418位置:funcs_字符串。cpp:1545

c3a1似乎是非ASCII字符。根据and,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
但我还是犯了同样的错误

我可以独立地在SELECT*上为t1和t2创建表,只要我不在它们之间进行连接


我不知道这里会发生什么事。值得注意的是,其中一个表(t2)有一组非常复杂的REGEXP_SUBSTR,从JSON中提取值;我不确定这是否相关,因为即使我没有从t2中选择任何内容,连接也会失败。

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

当联接中的一列是CHAR数据类型,而另一列是VARCHAR数据类型时,可能发生的情况是,Redshift会隐式地将VARCHAR数据类型转换为CHAR,以便对联接进行求值。但是,由于CHAR不允许使用非ASCII字符,如果VARCHAR列中有任何字符,则此操作将失败并生成所示的错误

解决方法是将CHAR列强制转换为联接中的VARCHAR,这意味着联接的两侧都将计算为VARCHAR

CHAR列只能包含单字节字符


根据我的评论,这个问题是由查询的连接条件而不是结果集中的列引起的

当联接中的一列是CHAR数据类型,而另一列是VARCHAR数据类型时,可能发生的情况是,Redshift会隐式地将VARCHAR数据类型转换为CHAR,以便对联接进行求值。但是,由于CHAR不允许使用非ASCII字符,如果VARCHAR列中有任何字符,则此操作将失败并生成所示的错误

解决方法是将CHAR列强制转换为联接中的VARCHAR,这意味着联接的两侧都将计算为VARCHAR

CHAR列只能包含单字节字符


允许我避免这个问题的是使用
func\u sha1()
函数将文本连接列强制转换为十六进制。这可能是昂贵的,但它为我工作
char
vs
varchar
在联接中都失败了,但是
func\u sha1
是一种产生结果的变通方法。

允许我避免问题的是使用
func\u sha1()
函数将文本联接列强制转换为十六进制。这可能是昂贵的,但它为我工作
char
vs
varchar
两者在联接中都失败,但
func_sha1
是一种产生结果的变通方法。

如果要使用该查询
UNLOAD
,您可以尝试
复制它。如果它有一个类似的错误,它会告诉你是哪一行导致了这个问题,这应该有助于调试。另请参见:您可以只使用
VARCHAR
而不使用长度?t1.id
t2.user\u id
的数据类型是什么?它们中有一个是CHAR数据类型吗?如果是,请尝试将它们转换为VARCHAR。如果要使用该查询
卸载
,则可以尝试
复制
它。如果它有一个类似的错误,它会告诉你是哪一行导致了这个问题,这应该有助于调试。另请参见:您可以只使用
VARCHAR
而不使用长度?t1.id和
t2.user\u id
的数据类型是什么?它们中有一个是CHAR数据类型吗?如果是的话,试着将它们转换为VARCHAR。