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

人气:161 发布:2022-10-16 标签: join casting ascii amazon-redshift

问题描述

我有两张红移表。我可以在它们之间的联接上执行SELECT*(在id列上执行联接):

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字符。根据Redshift docs和forum postings,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*上为T1和T2单独创建表。

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

推荐答案

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

发生的情况似乎是,当联接中的一列是CHAR数据类型,另一列是VARCHAR时,RedShift会隐式地将VARCHAR数据类型转换为CHAR,以便对联接求值。但是,由于CHAR不允许非ASCII字符(如果VARCHAR列中有非ASCII字符),因此此操作将失败并生成显示的错误。

解决方法是在联接中将CHAR列转换为VARCHAR,这应该意味着联接的两端都被计算为VARCHAR。

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

CHAR列只能包含单字节字符

661