tidb企业版7.1.8 java查询空字段数据返回\u0000问题

【TiDB 使用环境】测试环境
【TiDB 版本】企业版7.1.8
【部署方式】机器部署
【操作系统/CPU 架构/芯片详情】麒麟V10
【数据库连接url】jdbc:mysql://:1234/*?useSSL=false&useServerPrepStmts=true&useConfigs=maxPerformance&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=1000&prepStmtCacheSqlLimit=2048&characterEncoding=UTF-8
【驱动】
com.tidb
tidb-connector-j
8.0


mysql-connector-java
mysql



遇到的问题:
tidb varchar(200) 字段是空内容的时候 java查询返回内容’\u0000’ 会导致一些判空逻辑异常
我更新字段所有空数据为空 再hex查询证明字段内容是空的
UPDATE iplatzk.tedpi10 a SET a.node_url = ‘’ WHERE node_url=‘’;

SELECT HEX(node_url)
FROM iplatzk.tedpi10
WHERE node_url=‘’;

我java程序内返回的数据结果是’\u0000’


但是我在DBeaver工具内 手动编辑字段加个空格保存 再删除空格保存 java查询出来的结果就是正常的""空字符串了

经过排查 确实是有特殊字符导致的,应该是从db2做数据迁移时候带进来的

  • TiDB 兼容模式 / 字符集问题:TiDB 在特定字符集(如 GBK / 非 UTF8MB4)、旧版本兼容模式下,会将空字符串错误映射为 \u0000 空字符;
  • JDBC 驱动双重依赖冲突:你同时引入了 tidb-connector-jmysql-connector-java驱动冲突会导致字符串解析异常;
  • 连接串参数无空值处理配置:缺少 TiDB 专用的空字符串解析参数。

这个要怎么解决呢

  • 迁移链路整改:DB2→TiDB 的同步 / 迁移工具(DM/DTS),增加特殊字符清洗规则,源头过滤0x00
  • 驱动差异:tidb-connector-j 8.0 和官方 MySQL 驱动对于NUL字符默认解析行为存在差异,优先对齐使用兼容稳定的驱动版本
  • 校验逻辑:业务判空不要仅用 str.isEmpty(),增加非空字符校验

还有这方面兼容性问题吗

是驱动或者参数的兼容性问题吗

TiDB 兼容模式 / 字符集问题 :不存在 使用的UTF8MB4字符集
JDBC 驱动双重依赖冲突:不存在 已经过滤mysql驱动
连接串参数无空值处理配置 :这个配置不知道是啥,证实数据库里存的是‘\0’ 数据 是从db2数据迁移导致的

我是通过生成sql 全量刷了 数据库每一个字段,我的问题原因就是db2迁移数据到tidb导致的
SELECT CONCAT(
‘UPDATE ', table_schema, '.', table_name, ' SET ', column_name, ' = ‘’’’ WHERE ', column_name, ' = ‘’\0’‘;’
) AS execute_sql
FROM information_schema.columns
WHERE
table_schema = ‘数据库名字’ – 你的数据库名
AND data_type IN (‘varchar’,‘char’,‘text’,‘tinytext’,‘mediumtext’,‘longtext’) – 只处理字符串类型(安全)
ORDER BY table_name, ordinal_position;

好的,是过来的数据类型可能因为数据库类型差异填了特别的补全富符号

刷完之后就正常了吧

当 TiDB 中字段值为纯空字符串 '',且满足以下条件时,JDBC 驱动会将其解析为 \u0000

  • 使用了 tidb-connector-j/mysql-connector-java 8.x 驱动
  • 连接串开启了 useServerPrepStmts=true(服务端预处理)

建议:删除连接串中的 useServerPrepStmts=true;

刷完就好了

不是驱动的问题 数据库字段里存的有特殊字符 内容是‘\0’ 导致的
如果数据库里字段内容是纯空的 ‘’ 不会出现这个问题的

嗯嗯,所以是mssql里面本身就存了特殊字符,而不是兼容问题