2025年sqlldr(Sqlldr多字节字符错误)

sqlldr(Sqlldr多字节字符错误)我是 Porterxie 一个爱问为什么的程序员 最近在使用 flink jdbc connector 读取 SqlServer 表数据时 因为读取字段与关键字冲突导致读取报错 本文将对该问题进行详细的分析 1 启动 sql client 运行如下语句 2 在 sql client 中 执行如下查询语句 3 查看报错信息 4

大家好,我是讯享网,很高兴认识大家。



我是 Porterxie,一个爱问为什么的程序员。最近在使用 flink-jdbc-connector 读取 SqlServer 表数据时,因为读取字段与关键字冲突导致读取报错。本文将对该问题进行详细的分析。

1、启动 sql-client,运行如下语句

 
  
讯享网

2、在 sql-client 中,执行如下查询语句

讯享网

3、查看报错信息


讯享网

4、此时不论将 ·select· 修改成 "select" 或者 [select],在 flink sql 的层面上都是无法解析的

5、在翻阅了 flink 官方文档未果后,我把问题解决方式转移到 flink-jdbc-connector 的源码上(此处我用的 flink-jdbc-connector 3.2 的源码)。同时我们不难梳理出这样一个 flink sql 的处理流程:flink sql 在接收输入的 sql 之后,先进行 flink sql 解析及校验,然后在具体 sink 类中进行最终执行 sql 的构建,调用驱动执行数据查询。

6、因为 flink connector 都是通过 SPI 的方式实现的插件注册,因此代码结构非常清晰明了。因为是读取发生问题,所以我们需要关注的是 DynamicTableSource 的创建,如下所示

7、我们来到 DynamicTableSource getScanRuntimeProvider 看一下通过驱动读取数据库的语句的生成过程,如下所示

8、代码跟进去,来到 AbstractDialect 类

我们可以看到 field 使用了 quoteIdentifier 方法进行包装,因此我们看一下这个方法在 SqlServer 中的实现

可以看到是原样返回,此处我们可以做如下修改进行测试(测试代码仅供参考)

9、重新打包 flink connector jdbc,替换掉 flink lib 中的 flink connector jdbc 包,重启 cluster,执行 sql

在数据集成时,肯定会存在数据表字段与内部字段冲突的情况,因为在数据库表层面来看,能建立这样的字段,就是合理的。而因为数据表字段与内部字段冲突引发报错的问题,建议官方进行文档的完善及给出相应问题修复方案。


小讯
上一篇 2025-06-10 23:44
下一篇 2025-06-12 12:53

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/138546.html