忒星科技
(Ti D Ber Rnzy E Hw G)
2026 年4 月 25 日 03:08
1
【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做数据迁移时候带进来的
忒星科技
(Ti D Ber Rnzy E Hw G)
2026 年4 月 27 日 02:12
7
TiDB 兼容模式 / 字符集问题 :不存在 使用的UTF8MB4字符集
JDBC 驱动双重依赖冲突 :不存在 已经过滤mysql驱动
连接串参数无空值处理配置 :这个配置不知道是啥,证实数据库里存的是‘\0’ 数据 是从db2数据迁移导致的
忒星科技
(Ti D Ber Rnzy E Hw G)
2026 年4 月 27 日 02:15
8
我是通过生成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;
Royce1220
(Ti D Ber Kwxb3 N7 I)
2026 年4 月 27 日 02:28
9
好的,是过来的数据类型可能因为数据库类型差异填了特别的补全富符号
北南南北
(Ti D Ber 7stzly6a)
2026 年4 月 27 日 02:36
11
当 TiDB 中字段值为纯空字符串 '' ,且满足以下条件时,JDBC 驱动会将其解析为 \u0000:
使用了 tidb-connector-j/mysql-connector-java 8.x 驱动
连接串开启了 useServerPrepStmts=true(服务端预处理)
建议:删除连接串中的 useServerPrepStmts=true;
忒星科技
(Ti D Ber Rnzy E Hw G)
2026 年4 月 27 日 07:59
13
不是驱动的问题 数据库字段里存的有特殊字符 内容是‘\0’ 导致的
如果数据库里字段内容是纯空的 ‘’ 不会出现这个问题的
Royce1220
(Ti D Ber Kwxb3 N7 I)
2026 年4 月 27 日 08:18
14
嗯嗯,所以是mssql里面本身就存了特殊字符,而不是兼容问题