在 Redshift 中确定字段的字节
Posted
技术标签:
【中文标题】在 Redshift 中确定字段的字节【英文标题】:Determine field's bytes in Redshift 【发布时间】:2014-07-31 20:28:58 【问题描述】:我正在将一个表从 SQL Server 移动到 Redshift。我已导出数据并将其放入 UTF-8 文本文件中。尝试加载到 Redshift 时,COPY 命令失败,抱怨数据超出了字段的宽度。
目标 Redshift 表架构与源 SQL Server 表的架构匹配(即 varchar 字段宽度相同)。如果我理解正确,Redshift 的 varchar 大小以字节为单位,而不是字符,如 SQL Server。所以,多字节字符会导致“太宽”的问题。
我想运行一个查询来确定我的 varchar 字段有多大,但似乎没有一个函数可以返回字符串所需的字节数,只返回该字符串中的字符数。
其他人是如何解决这个问题的?
【问题讨论】:
SQL Server 数据类型是varchar
还是nvarchar
?如果是nvarchar
,那么在迁移到 Redshift 时,您需要将 SQL 服务器的最大长度加倍,即 nvarchar(50)
变为 varchar(100)
VARCHAR 数据类型支持最多四个字节的 UTF-8 多字节字符。不支持五字节或更长的字符。要计算包含多字节字符的 VARCHAR 列的大小,请将字符数乘以每个字符的字节数。例如,如果一个字符串有四个汉字,每个字符是三个字节长,那么您将需要一个 VARCHAR(12) 列来存储该字符串。
Brian,在两个数据库中,字段都定义为 varchar(不是 nvarchar)
Sandesh - 这正是问题所在 - 在 65 亿行中查找每个字符的字节数,每行有 5 个潜在问题字段。
托德,桑德什有正确的答案。如果 SQL Server 中的字段是 varchar(3),那么您只需将字段长度乘以 4,然后在 Redshift 中使用 varchar(12)(尽管我们发现 x3 适用于所有迁移的数据)。如果您不想使用该默认配置,则必须在 SQL Server 中运行 max(length(字段长度和字段类型在 Redshift 中可能很关键。将样本数据加载到具有最大字段大小的 RedShift 表中。样品必须尽可能大。比您能够计算实际字段大小而忽略 MSSQL Server 中的定义,这可能比您真正需要的要大得多。
【讨论】:
以上是关于在 Redshift 中确定字段的字节的主要内容,如果未能解决你的问题,请参考以下文章
将 IntelliJ 连接到 Amazon Redshift
(REDSHIFT) 垂直合并 / FIRST_VALUE() 作为聚合