问题背景

最近在一次项目的开发中,由于在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错误相关推荐

  1. python 解包_【源码解析】python解包操作一文完全理解

    解包是如何操作? >>> a, b = [1, 2] # 以下为此解包操作的字节码 0 LOAD_CONST 1 (1) 2 LOAD_CONST 2 (2) 4 BUILD_LIS ...

  2. jQuery源码解析(1)—— jq基础、data缓存系统

    闲话 jquery 的源码已经到了1.12.0 版本,据官网说1版本和2版本若无意外将不再更新,3版本将做一个架构上大的调整.但估计能兼容IE6-8的,也许这已经是最后的样子了. 我学习jq的时间很短 ...

  3. MYSQL驱动包升级到5.1.17版本之后会出现的问题

    原来用的是5. .5的包,替换成5. . 7之后,如下生成主键的代码都会报错: ps getConnection .prepareStatement sql.toString ; .... rs ps ...

  4. PrepareStatement用法(附源码解析)

    PrepareStatement 基本用法 1. 加载驱动 首先在pom.xml 中引入 mysql 依赖 <dependency><groupId>mysql</gro ...

  5. 【Vue3】源码解析

    [Vue3]源码解析 首先得知道 Proxy Reflect Symbol Map和Set diff算法 patchChildren diff算法具体做了什么(重点)? patchKeyedChild ...

  6. 【源码解析】如何从零实现一个回归模型?

    说明:本文源代码来源于MACHINE LEARNING 2022 SPRING课程,我只是针对源代码进行了一些加工处理.感谢互联网,让我们能免费接触到这些优秀的课程. 前置知识 什么是回归模型?简单说 ...

  7. mistletoe 源码解析

    文章目录 mistletoe 安装 mistletoe 使用 mistletoe 入口 mistletoe 源码解析 document Document Heading SetextHeading Q ...

  8. mysql 网络io_分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识

    作者:路路 热爱技术.乐于分享的技术人,目前主要从事数据库相关技术的研究. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 前言 对于计算机学科来说 ...

  9. Linux-4.20.8内核桥收包源码解析(一)----------sk_buff(详细)

    作者:lwyang? 内核版本:Linux-4.20.8 网络子系统中用来存储数据的缓冲区叫做套接字缓存,简称SKB,可处理变长数据,尽量避免数据的复制. 每一个SKB都在设备中标识发送报文的目的或接 ...

  10. 【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析

    1.mac控制器,phy芯片,rgmii协议 2.寄存器介绍 3.驱动源码解析 4.nanopi t2 移植rtl8211e网卡驱动(首发) 驱动注册入口 驱动的注册分两个部分,一个部分是静态编译的时 ...

最新文章

  1. Python3 编程第一步
  2. 什么数字万用表可以测量噪声?
  3. OC基础 代理和协议
  4. Python之format格式化输出
  5. js笔记(9)之定时器数字时钟延时提示框
  6. 斯特林公式(Stirling's approximation)
  7. build.gradle里dependencies标签页的实现原理
  8. 云服务器开启TCP Server 客户端无法连接的解决方法
  9. hadoop记录topk
  10. 2021温州市高考成绩查询,温州2021高考成绩排名榜单,温州各高中高考成绩喜报
  11. 「CJOJ2723」Reserve
  12. 图 子类 数据库_构造知识图的语义模型
  13. 凭据分配没有加密oracle_远程连接身份验证错误,又找不到加密Oracle修正
  14. C++primer 13.1.2节练习
  15. CarMaker试用版许可证申请与软件安装过程
  16. Java EJB到底是什么?
  17. jsp遍历List map
  18. iPhone自定义铃声(iOS12 + iTunes in macOS Mojave)
  19. 59% 的程序员曾担心自己猝死!
  20. 【云栖大会】三个物联网案例,看懂阿里巴巴为何布局最难的物联网道路

热门文章

  1. dls 深度受限搜索java_JAVA深入学习(栈和队列)之栈
  2. mysql 计算math_MySQL Math – 可以在查询中计算相关性吗?
  3. 算术表达式:前缀表达式、中缀表达式、后缀表达式相互转换(手算法)
  4. Go语言:数组练习—冒泡排序
  5. c语言暂存按键数据变量,ET6218R按键检测程序
  6. .net模式子窗口传值给父窗口
  7. 【一天一个C++小知识】008.内联函数
  8. 火灾检测、人流量统计、安全帽检测,飞桨开源一键运行的产业案例教程
  9. AI发展“风口”在哪里?陪伴才是“蓝海”
  10. 给定一列非负整数,求这些数连接起来能组成的最大的数。