源码解析由于mysql驱动包升级, “LOAD DATA” 出现The used command is not allowed with this MySQL version错误
问题背景
最近在一次项目的开发中,由于在pom文件中没有指定mysql-connector-java的version,则自动依赖了最新版的8.0.18包,在执行“LOAD DATA”时出现“nested exception is java.sql.SQLSyntaxErrorException: The used command is not allowed with this MySQL version” 的错误。
问题分析
- SQL语句写的有问题
- 8.0.18的驱动包对MySQL server版本有要求
- 8.0.18的驱动包对“LOAD DATA” 执行有问题
问题定位
- 对于验证SQL是否有问题:直接将语句在mysql客户端执行,没有问题;
- 升级的驱动包是否对mysql server版本有要求:我使用的mysql版本是5.6的,由于5.7是一个大的升级,于是在本地快速安装了个5.7的,再次验证,还是报同样的错误;
- 使用5.1.27版本的驱动包,执行SQL语句成功,由此可以定位到是mysql驱动包的问题。
问题原因
- 通过一步一步的跟踪代码发现,8.0.18的包中,将发送给mysql的信息包装在定义类NativePacketPayload的byte[] byteBuffer中,在执行"LOAD DATA" 语句时,查看byteBuffer中的内容为:
03 4c 4f 41 44 20 44 41
54 41 20 4c 4f 43 41 4c
20 49 4e 46 49 4c 45 20
27 44 3a 5c 5c 74 65 73
74 5c 5c 6d 79 73 71 6c
5f 32 30 31 39 31 32 31
32 5f 31 36 31 36 30 31
5f 74 65 73 74 2e 74 78
74 27 20 49 4e 54 4f 20
54 41 42 4c 45 20 54 5f
56 45 52 43 4b 5f 47 52
41 59 55 53 45 52 20 63
68 61 72 61 63 74 65 72
20 73 65 74 20 75 74 66
38 20 28 53 4f 47 4f 55
41 50 50 5f 49 44 2c 44
45 56 49 43 45 5f 49 44
29 - 5.1.27版本中,将发送给mysql的信息包装在定义Buffer类的byte[] byteBuffer 中,在执行"LOAD DATA" 语句时,查看byteBuffer中的内容为:
1e 00 00 00 03 4c 4f 41
44 20 44 41 54 41 20 4c
4f 43 41 4c 20 49 4e 46
49 4c 45 20 27 44 3a 5c
5c 74 65 73 74 5c 5c 6d
79 73 71 6c 5f 32 30 31
39 31 32 31 32 5f 31 36
31 36 30 31 5f 74 65 73
74 2e 74 78 74 27 20 49
4e 54 4f 20 54 41 42 4c
45 20 54 5f 56 45 52 43
4b 5f 47 52 41 59 55 53
45 52 20 63 68 61 72 61
63 74 65 72 20 73 65 74
20 75 74 66 38 20 28 53
4f 47 4f 55 41 50 50 5f
49 44 2c 44 45 56 49 43
45 5f 49 44 29
-通过对比,很容易发现,5.1.27的包的信息中,前面多了四个字节,1e 00 00 00,而8.0.18的包中缺少这几个字节,导致发送mysql server执行命令是报错误。
总结
- 该问题可能是mysql驱动包的bug,我只测试的是8.0.18版本,后期版本是否已修复未测试
- 若在开发中遇到类似的问题,在SQL没问题的情况下,试试替换下低版本的包
- 在平常遇到比较棘手的问题时,要擅于通过跟踪源码,找到出现问题的根本原因
源码解析由于mysql驱动包升级, “LOAD DATA” 出现The used command is not allowed with this MySQL version错误相关推荐
- python 解包_【源码解析】python解包操作一文完全理解
解包是如何操作? >>> a, b = [1, 2] # 以下为此解包操作的字节码 0 LOAD_CONST 1 (1) 2 LOAD_CONST 2 (2) 4 BUILD_LIS ...
- jQuery源码解析(1)—— jq基础、data缓存系统
闲话 jquery 的源码已经到了1.12.0 版本,据官网说1版本和2版本若无意外将不再更新,3版本将做一个架构上大的调整.但估计能兼容IE6-8的,也许这已经是最后的样子了. 我学习jq的时间很短 ...
- MYSQL驱动包升级到5.1.17版本之后会出现的问题
原来用的是5. .5的包,替换成5. . 7之后,如下生成主键的代码都会报错: ps getConnection .prepareStatement sql.toString ; .... rs ps ...
- PrepareStatement用法(附源码解析)
PrepareStatement 基本用法 1. 加载驱动 首先在pom.xml 中引入 mysql 依赖 <dependency><groupId>mysql</gro ...
- 【Vue3】源码解析
[Vue3]源码解析 首先得知道 Proxy Reflect Symbol Map和Set diff算法 patchChildren diff算法具体做了什么(重点)? patchKeyedChild ...
- 【源码解析】如何从零实现一个回归模型?
说明:本文源代码来源于MACHINE LEARNING 2022 SPRING课程,我只是针对源代码进行了一些加工处理.感谢互联网,让我们能免费接触到这些优秀的课程. 前置知识 什么是回归模型?简单说 ...
- mistletoe 源码解析
文章目录 mistletoe 安装 mistletoe 使用 mistletoe 入口 mistletoe 源码解析 document Document Heading SetextHeading Q ...
- mysql 网络io_分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识
作者:路路 热爱技术.乐于分享的技术人,目前主要从事数据库相关技术的研究. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 前言 对于计算机学科来说 ...
- Linux-4.20.8内核桥收包源码解析(一)----------sk_buff(详细)
作者:lwyang? 内核版本:Linux-4.20.8 网络子系统中用来存储数据的缓冲区叫做套接字缓存,简称SKB,可处理变长数据,尽量避免数据的复制. 每一个SKB都在设备中标识发送报文的目的或接 ...
- 【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析
1.mac控制器,phy芯片,rgmii协议 2.寄存器介绍 3.驱动源码解析 4.nanopi t2 移植rtl8211e网卡驱动(首发) 驱动注册入口 驱动的注册分两个部分,一个部分是静态编译的时 ...
最新文章
- Python3 编程第一步
- 什么数字万用表可以测量噪声?
- OC基础 代理和协议
- Python之format格式化输出
- js笔记(9)之定时器数字时钟延时提示框
- 斯特林公式(Stirling's approximation)
- build.gradle里dependencies标签页的实现原理
- 云服务器开启TCP Server 客户端无法连接的解决方法
- hadoop记录topk
- 2021温州市高考成绩查询,温州2021高考成绩排名榜单,温州各高中高考成绩喜报
- 「CJOJ2723」Reserve
- 图 子类 数据库_构造知识图的语义模型
- 凭据分配没有加密oracle_远程连接身份验证错误,又找不到加密Oracle修正
- C++primer 13.1.2节练习
- CarMaker试用版许可证申请与软件安装过程
- Java EJB到底是什么?
- jsp遍历List map
- iPhone自定义铃声(iOS12 + iTunes in macOS Mojave)
- 59% 的程序员曾担心自己猝死!
- 【云栖大会】三个物联网案例,看懂阿里巴巴为何布局最难的物联网道路
热门文章
- dls 深度受限搜索java_JAVA深入学习(栈和队列)之栈
- mysql 计算math_MySQL Math – 可以在查询中计算相关性吗?
- 算术表达式:前缀表达式、中缀表达式、后缀表达式相互转换(手算法)
- Go语言:数组练习—冒泡排序
- c语言暂存按键数据变量,ET6218R按键检测程序
- .net模式子窗口传值给父窗口
- 【一天一个C++小知识】008.内联函数
- 火灾检测、人流量统计、安全帽检测,飞桨开源一键运行的产业案例教程
- AI发展“风口”在哪里?陪伴才是“蓝海”
- 给定一列非负整数,求这些数连接起来能组成的最大的数。