迁移至tidb后查询某些存在大写字段的表报错

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.2
  • 【问题描述】:1 使用lightning从上游mysql数据库迁移数据,正常结束没有报错
    2 迁移完成后,业务系统连接tidb,当连接的数据库表存在大写字段时,查询报错.(上游mysql无此问题)
    3 tidb和上游mysql lower-case-table-names参数的值都是2
    4 具体情况和TiDB.txt (3.1 KB) 日志见附件

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

看您反馈的报错是:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Duplicate column name ‘DIV_CODE’

重复的 div_code 列名称,这个和大小写是什么关系呢?

启动的时候JPA对表结构进行校验,发现"DIV_CODE"(大写)没有,于是创建"DIV_CODE"(大写)字段,但是表结构中的字段名是"div_code"(小写),于是数据库返回列名重复

JPA校验的时候有大小写敏感,但是,TiDB创建列的时候没有大小写敏感切换回原来的mysql是没这个问题的

  1. 请检查下 mysql 的参数变量
    show global variables like ‘%lower_case%’;

  2. tidb 中的参数配置说明如下

  3. 如果mysql 设置了区分大小写,那么这里需要您修改配置为小写了,多谢。

多谢~
单体mysql参数如下:
lower_case_file_system OFF
|lower_case_table_names 1

tidb 参数如下:
lower_case_file_system 1
lower_case_table_names 2
l
昨天我把tidb lower_case_table_names的值 改为1,和单体mysql的值一样.仍然报错.
所以我想,问题可能出在lower_case_file_system 上? 不知道mysql中lower_case_file_system 的值OFF对应tidblower_case_file_system的哪个值?
如果对应的不是1,似乎这个参数也改不了,据说是只读的:disappointed:

可以看到注意里,tidb 只支持值为 2 ,按照小写来比较,所以是否可能您的JPA配置里修改下为小写,多谢。

hi,请问下 column 大小写识别的问题是否已经解决

木有,我们改过jpa的参数.还是会报错.也改过 tidb lower_case_table_names 值为1,也不行.这两个修改同时进行,还是不行.总之各种组合都试过了,奏是不行:slight_smile:

这样,辛苦提供下 mysql 中该表的表结构,和 tidb 中该表的表结构,我们对比验证一下。show create table tbl;

再辛苦提供下 show variables like ‘%lower%’; 在 mysql 和 tidb 中的结果都反馈下,

辛苦上传下程序报错时间点 tidb log 的信息,感谢配合

我们这边验证 mysql 和 tidb 都是不区分 column name 大小写的。

tidb与jpa兼容.txt (2.0 KB)
tidb log 日志里没有有关的信息

hi,提供的附件中没有出现 DIV_CODE 列,辛苦确认下

tidb与jpa兼容1.txt (2.0 KB)
表搞错了

CREATE TABLE sys_division (
id varchar(64) COLLATE utf8_general_ci NOT NULL,
div_code varchar(11) COLLATE utf8_general_ci DEFAULT NULL,
div_name varchar(50) COLLATE utf8_general_ci DEFAULT NULL,
mnemonic_code varchar(20) COLLATE utf8_general_ci DEFAULT NULL,
ver_num bigint(20) DEFAULT NULL,
pid varchar(64) COLLATE utf8_general_ci DEFAULT NULL,
div_desc varchar(255) COLLATE utf8_general_ci DEFAULT NULL,
weight int(11) DEFAULT NULL,
wordnum varchar(10) COLLATE utf8_general_ci DEFAULT NULL,
new_order bigint(20) DEFAULT NULL,
div_type varchar(20) COLLATE utf8_general_ci DEFAULT NULL,
jingdu double DEFAULT NULL,
weidu double DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

select DIV_CODE from sys_division
insert into sys_division(DIV_CODE) select ‘1’;

以上语句在 tidb 中均可正常执行,辛苦看下是否为工具区分大小写的问题,tidb 这边对列名处理大小写是不敏感的。

通过navicat和mysql客户端连接tidb确实是没有问题的,我们的问题是jpa的问题

这个问题,我们在 tidb 侧还有什么需要关注的吗。

我的疑惑是:没有改代码,应用连接到mysql就不会有字段大小写的问题,而连接到tidb就会有。当然不是说tidb有bug,只是一个疑惑,以及带来一些移植后的工作量。

看下工具连接数据库时是否有参数可以设置大小写敏感的情况?JPA 不是很了解,可以尝试找下