MySQL执行select *查询Orders表时首列OrderID显示异常
问题根因
两个问题叠加导致显示异常:
- 字段长度修改未生效:从
describe Orders输出可以看到,Description字段目前仍是varchar(50),并没有改成你预期的100,之前导入CSV的截断报错就是字段长度不足导致的。 - 字段内存在回车控制符脏数据:导入时长度不足截断内容,加上CSV里未正确转义的
\r(Windows格式回车符)被存入Description字段,会直接打乱MySQL命令行客户端的输出逻辑:客户端输出碰到\r时会把光标移回当前行首,后续输出的内容会覆盖行首的OrderID位置,看起来就像OrderID值丢失、列错位。这也完全匹配你观察到的现象:不查询Description字段时,不会输出这些带控制符的内容,显示就完全正常。
修复步骤
按顺序执行即可:
- 先把Description字段长度调大,避免后续写入截断:
ALTER TABLE Orders MODIFY COLUMN Description VARCHAR(255) DEFAULT NULL; - 清理现有数据里残留的回车、换行控制符,修复脏数据:
UPDATE Orders SET Description = REPLACE(REPLACE(Description, '\r', ''), '\n', ' ') WHERE Description LIKE '%\r%' OR Description LIKE '%\n%'; - 后续重新导入CSV时,注意配置正确的导入参数:如果CSV字段内容本身带换行,要通过
FIELDS ENCLOSED BY指定字段包裹符,同时确认行终止符配置和CSV实际格式一致,别把字段内的换行识别成整行结束标记。
修复完重新执行select * from Orders limit 50;就能看到正常对齐的结果,OrderID不会再出现显示错位的问题。
内容的提问来源于stack exchange,提问作者Jennifer Valenti
相关产品推荐
相关产品推荐

