varchar类型定义长度与实际容纳字...
 
通知
清除全部

varchar类型定义长度与实际容纳字符长度不一致  


k8king
帖子: 8
青梅新星
已加入: 2月 前

GP版本:6.11.2

varchar类型最大可定义长度为10485760,但是实际容纳字符串长度为12157,超过及报错(line too long),这是bug还是隐藏的限制?

问题标签
11 回复
rlei
帖子: 4
 rlei
Greenplum专家
初出茅庐
已加入: 2月 前

你是创建表报错,还是插入数据报错?把具体错误信息发出来看看吧。

还可以用length()看看你存的字符串到底有多长。

回复
1 回复
k8king
已加入: 2月 前

青梅新星
帖子: 8

@rlei 是数据插入报错,第一封帖子我有个地方错了,就是纯中文放不了12157个字符,只能放10921。

建表语句如下:

create table tmp_t1(
uid int,
desc varchar(10485760) -- varchar类型最大长度
);

length()语句运行结果如下:

语句:select length(desc) from tmp_t1 where uid = '1';

结果:10921

数据生成脚本如下(Python3):

#! -*- coding:utf-8 -*-
file_path='/home/xxx/tmp/1.txt'

with open(file_path, 'w', encoding='utf-8') as f1:
    #x_content = '中'*10922
    x_content = '中'*10921
    line = f'1|{x_content}'
    f1.write(line)

gpload 命令行报错如下:

2020-11-04 10:16:14|ERROR|ERROR: gpfdist error: unknown meta type 108 (url_curl.c:1656) (seg4 slice1 xx.xx.xx.xx:30001 pid=60373) (url_curl.c:1656)

select * from gp_read_error_log('ext_gpload_reusable_xxxx') 报错如下

gpfdist error - line too long in file 1.txt near (0 bytes)

gpload 控制文件如下:

---
VERSION: 1.0.0.1
DATABASE: xxx
USER: xxx
HOST: xxx
PORT: xxx
GPLOAD:
  INPUT:
  - SOURCE:
  FILE: ['1.txt']
  - FORMAT: TEXT
  - ESCAPE: 'OFF'
  - DELIMITER: '|'
  - QUOTE: ""
  - HEADER: FALSE
  - ENCODING: UTF8
  - ERROR_LIMIT: 10
  - LOG_ERRORS: TRUE
  OUTPUT:
  - TABLE: tmp_t1
  - MODE: insert
  PRELOAD:
  - REUSE_TABLES: TRUE
  - TRUNCATE: TRUE

回复
阿福
帖子: 39
Greenplum专家
青梅少侠
已加入: 2月 前

用text类型试试

回复
1 回复
k8king
已加入: 2月 前

青梅新星
帖子: 8

@chris text类型同样报错

回复
阿福
帖子: 39
Greenplum专家
青梅少侠
已加入: 2月 前

#! -*- coding:utf8 -*-
file_path='/home/xdb/1.txt'

with open(file_path, 'w', encoding='utf-8') as f1:
#x_content = '中'*10922
x_content = '中'*109210
f1.write(x_content)

 

刚试了一下这个脚本copy入库是可以的,你可以用copy看看是不是gpload有bug

回复
5 回复
k8king
已加入: 2月 前

青梅新星
帖子: 8

@chris 你说的对,经测试copy是可以导入的,这样一来,就必须使用超级用户gpadmin,在安全上是有问题的。需要提一个issue吗?

另外,还发现导入数据时,行尾有"\"也无法导入(gpload与copy均无法导入),这是bug还是限制?

回复
阿福
Greenplum专家
已加入: 2月 前

青梅少侠
帖子: 39

@k8king 没太明白你的意思,执行gpload的用户需要具有创建外部表的权限,这个可以看一下手册。

"\"目前可能需要自己处理一下

回复
k8king
已加入: 2月 前

青梅新星
帖子: 8

@chris 这是两个问题。

1. 第一个问题(主贴):varchar类型定义长度与实际容纳长度不一致。

我按照你的建议测试了一下,copy的确能够导入。

说明varchar类型是能够容纳声明的长度的,数据库本身没问题。

但是只有gpadmin用户才能使用copy导入数据,作为管理员用户,不应该拿来执行数据导入任务。

日常加载还需要使用gpload(我能够正常使用gpload)。

能否确认这是gpload的bug而不是故意做出的限制?是否需要在在github上提一个issue来发起修正流程?

 

2. 第二个问题:数据行尾有"\",导致gpload无法导入。

有些数是很怪,基于某些原因不能在导入时变更,需要原样导入,不允许自行处理。

提这个问题,是因为发现数据行尾的"\"被gpload当做shell中的折行来处理,下面一行并到上面一行去了。

即使控制文件中关闭逃逸字符也不能避免,我觉得是逃逸字符关闭的不彻底,所以想要确认是否为bug。

如果是,是否也需要在在github上提一个issue来发起修正流程?

回复
阿福
Greenplum专家
已加入: 2月 前

青梅少侠
帖子: 39

@k8king 不属于bug,暂时不支持,需要自己想办法处理一下。

回复
k8king
已加入: 2月 前

青梅新星
帖子: 8

@阿福 第一个问题,gpload无法导入过长的中文字段,也是这个结论吗?

回复
Peter
帖子: 5
青梅新星
已加入: 2月 前

这个是不是超了gpfdist的对单行数据长度的限制了?

回复

关注微信公众号

Greenplum中文社区

Greenplum官方微信群

扫码加入我们的技术讨论,请备注“网站”