Redshift CREATE TABLE 错误 - 无效字符

sna*_*k17 1 ascii casting join amazon-redshift

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

SELECT * FROM
table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.user_id
Run Code Online (Sandbox Code Playgroud)

但是,当我将此语句包装在 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 文档论坛帖子,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
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误。

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

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

Nat*_*ths 5

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

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

解决方法是在连接中将 CHAR 列转换为 VARCHAR,这意味着连接的两侧都被评估为 VARCHAR。

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

CHAR 列只能包含单字节字符