Kingbase-Mysql兼容模式下LOAD DATA INFILE语法再体验
之前mysql体验官中的部分内容,还有些问题,今天刚好有时间进行更深入些的测试,我们再次来回顾一下:
1、准备测试数据
CREATE TABLE IF NOT EXISTS products (
id INT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category VARCHAR(50),
price DECIMAL(10,2),
stock INT,
created_at TIMESTAMP
);
data.csv
“id”,“product_name”,“category”,“price”,“stock”,“created_at”
1,“笔记本电脑”,“电子产品”,5999.99,50,“2023-01-15 10:30:00”
2,“智能手机”,“电子产品”,3999.00,100,“2023-01-16 11:15:00”
3,“无线耳机”,“电子产品”,299.90,200,“2023-01-17 09:45:00”
4,“办公椅”,“家具”,899.00,30,“2023-01-18 14:20:00”
5,“台灯”,“家居用品”,159.50,80,“2023-01-19 16:10:00”
6,“咖啡机”,“厨房电器”,1299.00,25,“2023-01-20 13:25:00”
7,“运动鞋”,“服装鞋帽”,459.00,60,“2023-01-21 10:50:00”
2、Load data 测试
哈哈,熟悉的报错。
报错原因可能是,Kingbase里面的LOAD DATA 语法不支持IGNORE子句,为了方便后续的测试我们先使用copy进行加载数据:
##使用COPY命令导入数据:
COPY products (id, product_name, category, price, stock, created_at)
FROM ‘/data/soft/data.csv’
WITH (
FORMAT csv,
HEADER true,
DELIMITER ‘,’,
QUOTE ‘"’,
NULL ‘’
);
可以看到使用copy命令是可以正常加载文件获取数据的,说明文件格式是没有问题的。
然后我们先将表进行导出到本地文件:
同时使用copy出来的文件进行重新load
这样是可以正常进行LOAD数据的。
那么对比data.csv文件和products2.csv差异
然后我们将data.csv文件的header去掉之后再次使用load data
差异点是LINES TERMINATED BY ‘\n’;
FIELDS|COLUMNS TERMINATED BY ‘string’ 设置字段之间的分隔符,默认值为 ‘t’
FIELDS|COLUMNS ENCLOSED BY ‘char’ 设置括住字段的值的符号,默认不使用任何符号。
FIELDS|COLUMNS OPTIONALLY ENCLOSED BY ‘char’ 设置括住CHAR、VARCHAR、TEXT等字符型字段的值的符号,默认不使用任何符号。
FIELDS|COLUMNS ESCAPED BY ‘char’ 设置转义字符,默认值为’’。
LINES STARTING By ‘string’ 设置每行数据开头的字符,默认不使用任何符号。
LINES TERMINATED By ‘string’ 设置每行数据结尾的字符,默认值为’n’。
如上是新产品的文档内容:
然后我们去看下Mysql兼容模式下的语法:
所以问题可能出现在转义的问题:’\n’
数据库默认值是’n’,所以命令里面不加即可,前面截图就是使用了’\n’就报错了。
我们前面的字段包围符时 " 可以正常执行了,那么接下来测试一下 ’ 时是否正常。
将前面的测试数据,准备好进行验证:
LOAD DATA INFILE ‘/data/soft/data.csv’
INTO TABLE products
FIELDS TERMINATED BY ‘,’
ENCLOSED BY ‘’’
LINES TERMINATED BY ‘\n’;
可以看到’转义字符并没有生效,而且命令被截断了,为什么会出现这种情况呢?
因此想到到了 是不是关于反斜杠\转义处理有啥差异设置呢?
因为我们使用命令查看时一般是\dt \dv \l,所以查看官方文档
然后进行测试:
好像没有生效。我们继续翻阅官方文档,看到有如下三个参数值:
standard_conforming_strings
解释:
这个参数控制字符串字面量中反斜杠 \ 的处理方式。
• on(推荐,默认值):反斜杠被视为普通字符,不是转义字符。这是 SQL 标准行为。
• off:反斜杠被当作转义字符处理(类似 MySQL 的行为)。
• – 查看标准字符串符合设置(最关键)
• SHOW standard_conforming_strings;
– 返回两个字符: \ 和 n
– 返回一个换行符
关于警告是下边的参数显示问题
2. escape_string_warning
解释:
这个参数控制是否对可能有问题反斜杠转义发出警告。
• on(默认值):当在普通字符串中使用反斜杠转义时发出警告
• off:不发出警告
当standard_conforming_strings 为off时,反斜杠被当作转义字符处理,因此会发出警告。
如图所示将 escape_string_warning为off时,就不会发出警告。
backslash_quote
解释:
这个参数控制是否允许在引号前使用反斜杠进行转义。
• on:允许使用 ’ 表示单引号
• off:不允许(默认值)
• safe_encoding:只有在客户端编码不会产生歧义时才允许
首先 先看下我们数据库里面的配置:
– 查看backslash_quote设置
SHOW backslash_quote;
– 当 backslash_quote = on 时
SELECT ‘It’s a test’; – 正确
– 当 backslash_quote = off 时
SELECT ‘It’‘s a test’; – 需要使用两个单引号
测试如下:
那么我们和Load 语法一起使用的时候,
先设置会话反斜杠作为转义字符
SET standard_conforming_strings = off;
设置开启警告使用反斜杠警告
SET escape_string_warning = on;
设置会话允许使用反斜杠转义单引号
SET backslash_quote = on;
单独将警告关闭:
SET escape_string_warning = off;
如果不想设置参数,怎么执行load呢?使用双美元符号避免转义
回退之前设置的参数:
SET standard_conforming_strings = on;
SET escape_string_warning = on;
SET backslash_quote = safe_encoding;
LOAD DATA INFILE ‘/data/soft/data.csv’
INTO TABLE products
FIELDS TERMINATED BY ‘,’
ENCLOSED BY $$’$$;
总结:
通过今天的深入测试与实践,对 KingbaseES 的 MySQL 兼容模式有了更深刻的理解:这并非简单的语法映射,而是一种有选择的兼容艺术。今天的实践再次验证了数据库迁移的本质不是语法转换,而是思维模式的转变。金仓数据库的 MySQL 兼容模式为我们提供了平滑迁移的路径,但真正的高效使用需要:
理解底层原理:不止知道怎么用,更要明白为什么这样设计
建立验证体系:任何语法都要经过充分测试验证
保持技术敏感:持续关注官方更新和最佳实践演进
准备备选方案:总有兼容模式无法覆盖的场景,需要有多套解决方案
通过这样系统性的方法和持续实践,我们能够真正掌握金仓数据库的强大功能,在兼容性与性能之间找到最佳平衡点。