mysql load file写法

本文详细介绍了如何使用MySQL的LOAD DATA INFILE命令来高效地从本地文件批量导入数据到数据库表中,包括设置字符集、字段分隔符等关键参数的使用方法。

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE ‘file_name’
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_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,…)]
[SET col_name = expr,…]

导入一个值以tab分割的txt文件的例子

mysql --local-infile=1 -uroot -p -Nse"load data local infile '/root/data.txt' into table mydb.mytable character set gbk fields terminated by '\t' ignore 1 lines"
<think> 我们已知用户在使用 gccli load 工具时,需要配置不可见字符作为字段分隔符(如ASCII控制字符)。现在用户进一步询问关于 `LOAD DATA LOCAL INFILE` 的使用方法,特别是结合不可见字符分隔符的配置。以下将基于用户提供的引用内容进行解答。 ### 关键点回顾 1. **`LOCAL` 关键字的作用**: - 使用 `LOCAL` 表示数据文件位于**客户端主机**,而不是服务器主机。客户端读取文件并发送到服务器[^1]。 - 安全限制:需要启用 `local_infile` 参数(通常通过 `--loose-local-infile=1` 启动客户端)[^1]。 2. **字段分隔符配置语法**: - 使用十六进制表示法定义不可见字符分隔符,例如 `FIELDS TERMINATED BY x'01'`(ASCII 1)[^5]。 3. **完整语法结构**(参考引用[2]): ```sql LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY 'string'] -- 字段分隔符 [[OPTIONALLY] ENCLOSED BY 'char'] -- 字段包裹符 [ESCAPED BY 'char'] -- 转义字符 ] [LINES [STARTING BY 'string'] -- 行起始符 [TERMINATED BY 'string'] -- 行结束符 ] [IGNORE number LINES] -- 忽略前N行 [(col_name_or_user_var,...)] -- 指定列顺序 [SET col_name = expr] -- 列值转换 ``` ### 实战配置:不可见字符分隔符 #### 场景描述 - 数据文件:`/data/user.dat`,字段分隔符为 ASCII 1 (`^A`, 十六进制 `0x01`) - 目标表:`user_info`(包含 `id, name, email` 三列) - 行结束符:`\n`(Linux换行符) #### 完整命令 ```sql -- 启用LOCAL加载(需客户端配置local_infile=1) LOAD DATA LOCAL INFILE '/data/user.dat' INTO TABLE user_info FIELDS TERMINATED BY x'01' -- 关键配置:十六进制表示分隔符 OPTIONALLY ENCLOSED BY '"' -- 字段可选双引号包裹 ESCAPED BY '\\' -- 转义符设为反斜杠 LINES TERMINATED BY '\n' -- 行结束符 IGNORE 1 LINES -- 跳过标题行 (id, name, email); -- 指定列顺序 ``` ### 安全配置要点 1. **客户端启用LOCAL**: - 启动 `gccli` 时添加参数:`gccli --loose-local-infile=1 -u user -p` - 或配置 `my.cnf` 文件: ```ini [client] loose-local-infile=1 ``` 2. **服务器端权限**: - 非 `LOCAL` 模式需要 `FILE` 权限和 `secure_file_priv` 目录限制[^1][^2]。 - `LOCAL` 模式无需 `FILE` 权限,但受客户端安全策略约束。 ### 错误处理技巧 - **转义冲突**:若数据包含分隔符 `0x01`,需用 `ESCAPED BY` 指定转义符(如 `\`)。 > 示例:数据 `"abc\x01def"` 将被解析为单字段 `abc\x01def`。 - **编码问题**:确保文件编码(如 UTF-8)与表字符集一致。 - **权限错误**: ```bash ERROR 1148 (42000): The used command is not allowed with this MySQL version ``` 解决方案:客户端启动时加 `--local-infile=1`。 ### 性能优化建议 - **并发加载**:添加 `CONCURRENT` 选项避免锁表(仅MyISAM支持)[^2]。 - **批量提交**:调整 `bulk_insert_buffer_size` 参数提升写入速度。 - **本地缓存**:服务器自动创建临时副本,需确保 `/tmp` 空间充足[^1]。 --- ### 验证步骤 1. **检查文件分隔符**: ```bash hexdump -C /data/user.dat | head -n 2 ``` 输出应显示 `01` 作为字段分隔符: ``` 00000000 31 01 4a 6f 68 6e 01 6a 6f 68 6e 40 67 6d 61 69 |1.John.john@gmai| ``` 2. **测试数据加载**: ```sql SELECT COUNT(*) FROM user_info; -- 加载前后记录数对比 ``` --- ### 与其他工具的对比 | 特性 | `gccli load` (LOCAL模式) | MySQL原生 `LOAD DATA` | |---------------------|---------------------------|----------------------------| | 分隔符灵活性 | ✅ 支持任意十六进制字符 | ✅ 相同 | | 跨平台文件路径 | ✅ 客户端路径 | ❌ 仅服务器路径 | | 权限要求 | ❌ 无需服务器FILE权限 | ✅ 需要FILE权限 | | 安全控制 | 依赖客户端`local-infile` | 依赖`secure_file_priv` | > 注:GBase语法与MySQL高度兼容,上述示例可直接用于GBase 8a/8s等版本。 --- §§相关问题§§ 1. 如何解决 `LOAD DATA LOCAL INFILE` 的 `ERROR 1261 (01000)` 字段截断警告? 2. GBase中是否支持使用多字符组合(如 `x'0102'`)作为字段分隔符? 3. 从HDFS加载数据到GBase时,分隔符配置与本地文件有何差异? </think> ### `LOAD DATA LOCAL INFILE` 结合不可见字符分隔符配置指南 #### 一、核心语法结构(基于GCcli特性) ```sql LOAD DATA LOCAL INFILE '/path/to/datafile.dat' INTO TABLE your_table FIELDS TERMINATED BY x'hh' -- 关键配置:hh替换为不可见字符的十六进制值 [OPTIONALLY ENCLOSED BY '"'] [ESCAPED BY '\\'] LINES TERMINATED BY '\n' -- 行分隔符(通常为\n或\r\n) [IGNORE n LINES] -- 跳过文件前n行 (col1, col2, ...); -- 指定列顺序 ``` #### 二、关键配置解析 1. **不可见字符分隔符设置** - **十六进制表示法**(强制要求): ```sql TERMINATED BY x'01' -- ASCII 1 (SOH) TERMINATED BY x'1B' -- ASCII 27 (ESC)[^5] ``` - **禁用错误写法**: ❌ `TERMINATED BY '\x01'` (C风格转义不兼容) ❌ `TERMINATED BY 0x01` (缺少引号) 2. **LOCAL模式特性** - **文件位置**: - 绝对路径:直接指定 `/home/user/file.dat` - 相对路径:相对于客户端工作目录[^1] - **安全配置**: ```sh # 启动客户端时必须启用local-infile gccli --loose-local-infile=1 -u user -p ``` 3. **转义处理机制** ```sql ESCAPED BY '\\' -- 推荐配置(反斜杠转义) ``` 当数据包含分隔符`x'01'`时,原始数据需写为:`value1\0x01value2` #### 三、完整实战案例 ##### 场景描述 - 数据文件:`user_data.dat` - 分隔符:ASCII 1 (`x'01'`) - 行结束符:`\n` - 目标表:`users (id INT, name VARCHAR(50))` ##### 执行步骤 1. **检查原始文件格式** ```bash hexdump -C user_data.dat | head # 输出应含:31 01 4a 6f 68 6e 0a (即 "1^AJohn\n") ``` 2. **执行加载命令** ```sql LOAD DATA LOCAL INFILE '/data/user_data.dat' INTO TABLE users FIELDS TERMINATED BY x'01' ESCAPED BY '\\' LINES TERMINATED BY '\n' (id, name); ``` 3. **验证结果** ```sql SELECT * FROM users; /* 预期输出 +----+-------+ | id | name | +----+-------+ | 1 | John | +----+-------+ */ ``` #### 四、常见错误解决方案 | 错误代码 | 原因 | 解决方法 | |---------|------|----------| | `ERROR 1148` | 未启用local-infile | 客户端启动时加 `--loose-local-infile=1`[^1] | | `ERROR 1261` | 数据含未转义分隔符 | 添加 `ESCAPED BY '\\'` 并检查数据 | | `ERROR 13` | 文件权限不足 | `chmod 644 /path/to/file.dat` | | 乱码 | 编码不匹配 | 添加 `CHARACTER SET utf8mb4` 子句 | #### 五、与标准MySQL的差异点 1. **分隔符长度限制**: - GBase:最大支持15字节组合分隔符(如 `x'010203'`) - MySQL:无明确限制 2. **安全策略**: ```ini # GBase特有配置 [client] gbase-allow-local-infile=1 ``` 3. **性能优化**: ```sql ALTER TABLE ... DISABLE KEYS; -- 加载前禁用索引 LOAD DATA ... -- 执行导入 ALTER TABLE ... ENABLE KEYS; -- 重建索引 ``` > 关键提示:生产环境建议先用 `SHOW WARNINGS` 检查截断数据,再正式导入[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰风漫天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值