为何MySQL查询结果列值后出现与字符串长度等量的多余空格?
这是MySQL命令行客户端的正常显示逻辑,并非数据存储的问题
你在终端查询时看到的vsTxt列后方附带的大量空格,本质是交互式mysql客户端为了在终端输出整齐对齐的表格,临时在列值后补充的排版占位空格,这些空格并没有真正写入数据库的存储中——这也是你之前执行全表空格替换、trim操作时,没有任何行被实际修改的核心原因。
具体原因拆解
- 默认终端输出规则下,mysql客户端会先统计当前查询结果中每一列的最长内容长度,再把该列所有行的显示宽度统一撑到这个最大长度,给短于最大宽度的内容后方补空格,保证每一行的竖线分隔符上下完全对齐,避免排版错位。
- 你观察到的“补的空格数刚好和字符串总长度相等”只是巧合:你看到的几个样例值刚好是当前结果集里长度最长的几个,后续更短的行才会被补更多空格,整体视觉效果就会产生“每个值后面跟了和自己等长空格”的错觉。
- 可以直接用一条语句验证存储的真实数据长度,排除数据问题:
对比返回的SELECT seqNum, CHAR_LENGTH(vsTxt) AS 实际存储长度, vsTxt FROM cus WHERE seqNum = 你观察到异常的具体seqNum值;实际存储长度和肉眼看到的带空格总长度,就能确认数据库存储的字符串根本没有附带那些你看到的多余空格。
调整显示效果的可行方法
按照你能接受的显示效果选择对应操作即可:
- 想要最紧凑的输出效果,不需要竖线对齐,直接在当前mysql会话执行切换命令,切到无对齐的精简输出模式:
切换后列值之间只会用tab符分隔,完全不会为了排版补多余空格,重新查询就能看到干净的结果,可根据需要调整tab显示宽度,满足列值和分隔符之间仅保留1个空格间距的要求。\t - 想保留默认的竖线表格样式,只是想减少不必要的补空格长度,可以在查询时对vsTxt列做轻量处理,强制客户端不对该列做满宽对齐:
SELECT seqNum, bbRef, bkName, chNum, vsNum, CONCAT(vsTxt, '') AS vsTxt FROM cus; - 如果验证后发现,确实是导入CSV时把尾部多余空格存进了vsTxt字段(即查到的实际存储长度超出预期),用只清理尾部空格的语句修正即可,不要像之前那样把所有空格全部删掉:
UPDATE cus SET vsTxt = TRIM(TRAILING ' ' FROM vsTxt);
补充说明:你之前执行的
update cus set vsTxt = trim(replace(vsTxt, ' ', ''))语句,如果真的存在存储层面的多余空格,一定会匹配到并修改对应行。结果显示0行变更,就直接证明你看到的那些空格根本不在数据库存储里。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

