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”
 

image.png

image.png

2、Load data 测试

image.png


哈哈,熟悉的报错。
报错原因可能是,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 ‘’
);
 

image.png


可以看到使用copy命令是可以正常加载文件获取数据的,说明文件格式是没有问题的。
然后我们先将表进行导出到本地文件:
 

image.png


同时使用copy出来的文件进行重新load
 

image.png


这样是可以正常进行LOAD数据的。
那么对比data.csv文件和products2.csv差异
 

image.png


然后我们将data.csv文件的header去掉之后再次使用load data

image.png

差异点是LINES TERMINATED BY ‘\n’;

image.png

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兼容模式下的语法:
 

image.png


所以问题可能出现在转义的问题:’\n’

数据库默认值是’n’,所以命令里面不加即可,前面截图就是使用了’\n’就报错了。

我们前面的字段包围符时 " 可以正常执行了,那么接下来测试一下 ’ 时是否正常。

image.png

将前面的测试数据,准备好进行验证:
LOAD DATA INFILE ‘/data/soft/data.csv’
INTO TABLE products
FIELDS TERMINATED BY ‘,’
ENCLOSED BY ‘’’
LINES TERMINATED BY ‘\n’;

image.png

可以看到’转义字符并没有生效,而且命令被截断了,为什么会出现这种情况呢?
因此想到到了 是不是关于反斜杠\转义处理有啥差异设置呢?
因为我们使用命令查看时一般是\dt \dv \l,所以查看官方文档

image.png

image.png


然后进行测试:

image.png

好像没有生效。我们继续翻阅官方文档,看到有如下三个参数值:

image.png

image.png

image.png

  1. standard_conforming_strings
    解释:
    这个参数控制字符串字面量中反斜杠 \ 的处理方式。
    • on(推荐,默认值):反斜杠被视为普通字符,不是转义字符。这是 SQL 标准行为。
    • off:反斜杠被当作转义字符处理(类似 MySQL 的行为)。
    • – 查看标准字符串符合设置(最关键)
    • SHOW standard_conforming_strings;

image.png


 

image.png


– 返回两个字符: \ 和 n
 

image.png


– 返回一个换行符
关于警告是下边的参数显示问题
2. escape_string_warning
解释:
这个参数控制是否对可能有问题反斜杠转义发出警告。
• on(默认值):当在普通字符串中使用反斜杠转义时发出警告
• off:不发出警告

image.png

image.png


当standard_conforming_strings 为off时,反斜杠被当作转义字符处理,因此会发出警告。
 

image.png


如图所示将 escape_string_warning为off时,就不会发出警告。

  1. backslash_quote
    解释:
    这个参数控制是否允许在引号前使用反斜杠进行转义。
    • on:允许使用 ’ 表示单引号
    • off:不允许(默认值)
    • safe_encoding:只有在客户端编码不会产生歧义时才允许
    首先 先看下我们数据库里面的配置:
    – 查看backslash_quote设置
    SHOW backslash_quote;
     

    image.png


    – 当 backslash_quote = on 时
    SELECT ‘It’s a test’; – 正确

– 当 backslash_quote = off 时
SELECT ‘It’‘s a test’; – 需要使用两个单引号
测试如下:
 

image.png


那么我们和Load 语法一起使用的时候,
先设置会话反斜杠作为转义字符
SET standard_conforming_strings = off;

设置开启警告使用反斜杠警告
SET escape_string_warning = on;

设置会话允许使用反斜杠转义单引号
SET backslash_quote = on;
 

image.png


 

image.png


单独将警告关闭:
SET escape_string_warning = off;

image.png

如果不想设置参数,怎么执行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 $$’$$;

image.png

总结:
通过今天的深入测试与实践,对 KingbaseES 的 MySQL 兼容模式有了更深刻的理解:这并非简单的语法映射,而是一种有选择的兼容艺术。今天的实践再次验证了数据库迁移的本质不是语法转换,而是思维模式的转变。金仓数据库的 MySQL 兼容模式为我们提供了平滑迁移的路径,但真正的高效使用需要:
理解底层原理:不止知道怎么用,更要明白为什么这样设计
建立验证体系:任何语法都要经过充分测试验证
保持技术敏感:持续关注官方更新和最佳实践演进
准备备选方案:总有兼容模式无法覆盖的场景,需要有多套解决方案
通过这样系统性的方法和持续实践,我们能够真正掌握金仓数据库的强大功能,在兼容性与性能之间找到最佳平衡点。

### 安装 Kingbase8 数据库 为了在 Linux 环境下安装 Kingbase8 并将其配置为 MySQL 兼容模式,需遵循一系列特定的操作流程。以下是详细的说明: #### 准备工作 确保操作系统已更新至最新状态,并安装必要的依赖包。 ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install libaio1 wget -y ``` #### 下载与安装 访问官方下载页面获取适用于 Linux 的 Kingbase8 版本。通常情况下,可以从官方网站或通过命令行工具 `wget` 获取安装文件。 ```bash cd /tmp/ wget http://example.com/path_to_kingbase_package/kingbasees8_x.x_linux.bin # 替换URL为实际地址 chmod +x kingbasees8_x.x_linux.bin ./kingbasees8_x.x_linux.bin --mode text --prefix /opt/KINGBASEES/V8 ``` 此过程会引导完成基本的软件部署[^2]。 #### 配置环境变量 编辑 `.bashrc` 或者 `/etc/profile` 文件来添加 KINGPATH 和 PATH 变量。 ```bash echo 'export KINGPATH=/opt/KINGBASEES/V8' >> ~/.bashrc echo 'export PATH=$KINGPATH/bin:$PATH' >> ~/.bashrc source ~/.bashrc ``` #### 初始化数据库实例 创建一个新的数据库集群并初始化它。 ```bash mkdir -p ~/db_cluster initdb -D ~/db_cluster -E UTF8 --locale=C.UTF-8 ``` #### 启动服务 启动 Kingbase8 数据库服务器以便可以连接到新建立的数据集。 ```bash pg_ctl -D ~/db_cluster start ``` #### 设置 MySQL 兼容模式 要使 Kingbase8 运行于 MySQL 兼容模式,在配置文件中调整参数以匹配 MySQL 行为特性。 修改 PostgreSQL 配置文件 `postgresql.conf` 来启用 MySQL 兼容选项: ```plaintext # postgresql.conf compatible_mode = 'mysql' sql_standard_functions = on default_transaction_isolation = 'read committed' synchronize_seqscans = off ``` 重启数据库让更改生效。 ```bash pg_ctl reload ``` 以上操作完成后,Kingbase8 已经被成功设置成接近 MySQL 的行为方式[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值