Redshift 如何治疗海龟?
Posted
技术标签:
【中文标题】Redshift 如何治疗海龟?【英文标题】:How does Redshift treat guillemets? 【发布时间】:2016-05-31 23:17:35 【问题描述】:我正在尝试使用 COPY
命令对包含 guillemet (»
) 的某些数据运行 CSV 导入。 Redshift 抱怨我定义的varchar
列的列值太长。 Redshift GUI 中“加载”选项卡中的错误将这个字符显示为两个点:..
- 如果将其视为一个,它会适合 varchar
列。目前尚不清楚是否发生某种转换错误或是否存在显示问题。
当我尝试做简单的INSERT
s 时,我也遇到了奇怪的行为:
dev=# create table test (name varchar(3));
CREATE TABLE
dev=# insert into test values ('bla');
INSERT 0 1
3 个字符被视为 4 个?
dev=# insert into test values ('bl»');
ERROR: value too long for type character varying(3)
dev=# insert into test values ('b»');
INSERT 0 1
为什么char_length
返回 2?
dev=# select char_length(name), name from test;
char_length | name
-------------+------
2 | b»
我检查了客户端编码和数据库编码,这些似乎都是 UTF8/UNICODE。
【问题讨论】:
【参考方案1】:您需要增加 varchar 字段的长度。多字节字符使用多个字符,并且 varchar 字段定义中的长度是基于字节的。因此,您的特殊字符可能会占用超过一个字节。如果它仍然不起作用,请参阅下面的 Redshift 文档页面,
http://docs.aws.amazon.com/redshift/latest/dg/multi-byte-character-load-errors.html
【讨论】:
一开始我也这么认为,但我希望看到与该页面上列出的 UTF-8 相关的错误,而不是我看到的“太长”错误消息。 每个多字节字符实际上可能需要多个字符,而您的列大小还不够。您是否尝试过增加列的大小,是否仍然遇到同样的问题? 在上面的示例中,请注意,当我仅尝试两个字符b»
时,第三次 INSERT 成功,因此增加列大小会起作用。这种行为似乎与文档中描述的不同,我试图理解为什么会这样。以上是关于Redshift 如何治疗海龟?的主要内容,如果未能解决你的问题,请参考以下文章