3.2.9 LOAD DATA
3.2.9.1 Syntax
LOAD DATA
[LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
CHARACTER SET 'charset_name'
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES }]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]
3.2.9.2 与MySQL语法区别
下文中红色表示不支持的语法或关键字,红绿两色表示稍微不相同的地方
LOAD DATA
- [LOW_PRIORITY | CONCURRENT]
[LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
- [PARTITION (partition_name [, partition_name] ...)]
- [CHARACTER SET charset_name]
+ CHARACTER SET 'charset_name'
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {
LINES
- | ROWS
}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]
3.2.9.3 举例
load data infile 'data.txt' into table test_table CHARACTER SET 'utf8mb4' FIELDS TERMINATED by ',';
3.2.9.4 原理
dble解析MySQL协议之后,会根据数据路由拆分文件,每满足maxRowSizeToFile(可通过bootstrap.cnf配置)就写到文件中,再通过 load data local infile 的方式导入到后端结点。
所以,这里local_infile这个参数会影响到load data的正确性.
可参考#1085
3.2.9.5 限制
- 存在BUG导致在dble中CHARACTER SET charset_name必填
- 由于 dble 依赖的 druid 解析器的限制,charset_name必须单引号包括。比如 CHARACTER SET 'utf8mb4' ,不可使用CHARACTER SET "utf8mb4" 或者 CHARACTER SET utf8mb4
- 在mysql中如果插入的数据不符合规范会插入部分数据,相对来说dble的load data对正确性有更高的要求,一个错误的发生会导致整体操作的回滚
- 在ENCLOSED BY的时候存在BUG,使用的的时候会导致转义的数据无法被正确转义存储到数据库中
- 由于当前解析设定的限制,loaddata默认每列最大字节数65535,可通过bootstrap.cnf中的maxCharsPerColumn配置修改
- 使用load data导入数据时,若导入表是分片表,应保证导入文件中分片键数据符合分片规则的要求,否则dble将会报错.详细参考issue:https://github.com/actiontech/dble/issues/770
- load data语句需要严格按照语法书写,由于druid解析器的缘故,若语法或关键字错误,druid会解析出错误的语句,从而导致结果错误.详细请参照issue:https://github.com/actiontech/dble/issues/1248
- load data语句读字段的时候,如果遇到行结束符,会认为是本行结束了,需要注意:https://github.com/actiontech/dble/issues/1507
- load data中使用用户变量后,再次查询用户变量的值是不正确的,可参考issue:https://github.com/actiontech/dble/issues/1761