MySQL导入CSV数据时日期、时间戳等类型解析异常问题咨询
解决MySQL导入CSV时日期时间戳、货币类型解析异常的问题
我之前处理CSV导入MySQL时也碰到过完全一样的问题——点分隔的日期时间戳被识别成无效值,货币格式也没法正确映射。下面是几个经过验证的解决方案,按操作复杂度排序:
一、预处理CSV文件(最简单直接)
如果原始CSV文件可以修改,先统一格式再导入:
- 日期时间戳处理:用文本编辑器(比如Notepad++)或Excel批量替换日期中的
.为-。比如把2018.03.05 18:38:41改成2018-03-05 18:38:41,这样MySQL就能自动识别为DATETIME类型。- Excel里可以用公式:
=SUBSTITUTE(A1,".","-"),计算完成后复制粘贴为值即可。 - Notepad++用快捷键
Ctrl+H,如果怕误改其他内容,可使用正则表达式查找(\d{4})\.(\d{2})\.(\d{2}),替换为$1-$2-$3,精准替换日期里的点。
- Excel里可以用公式:
- 货币类型处理:去掉货币符号(比如
$)和千位分隔符(,),保留数字和小数点。比如把$1,234.56改成1234.56,之后导入时设置字段类型为DECIMAL(10,2)即可。
二、导入时用MySQL函数实时转换(无需修改原始文件)
如果不想改动原始CSV,在MySQL Workbench的导入向导里自定义字段转换规则:
- 打开导入向导,选择CSV文件后,进入**“Column Mapping”**(字段映射)步骤。
- 对于日期时间戳字段:
- 把目标字段类型设为
DATETIME。 - 在“Expression”(表达式)列输入转换函数:
STR_TO_DATE(你的字段名, '%Y.%m.%d %H:%i:%s') - 示例:如果CSV里的字段叫
record_time,就写STR_TO_DATE(record_time, '%Y.%m.%d %H:%i:%s')
- 把目标字段类型设为
- 对于货币字段:
- 目标字段类型设为
DECIMAL(10,2)。 - 在“Expression”列输入:
CAST(REPLACE(REPLACE(你的字段名, '$', ''), ',', '') AS DECIMAL(10,2)) - 示例:如果字段叫
order_amount,就写CAST(REPLACE(REPLACE(order_amount, '$', ''), ',', '') AS DECIMAL(10,2))
- 目标字段类型设为
- 完成设置后继续导入,MySQL会自动转换格式并正确存储。
三、用LOAD DATA INFILE命令导入(适合批量自动化场景)
如果需要频繁导入这类CSV,可以写SQL脚本用LOAD DATA INFILE命令,直接在语句里处理格式转换:
LOAD DATA INFILE '/path/to/your/data.csv' INTO TABLE your_target_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS -- 跳过CSV表头行 ( id, @raw_time, @raw_currency, product_name ) SET record_time = STR_TO_DATE(@raw_time, '%Y.%m.%d %H:%i:%s'), order_amount = CAST(REPLACE(REPLACE(@raw_currency, '$', ''), ',', '') AS DECIMAL(10,2));
- 说明:
@raw_time和@raw_currency是临时变量,先读取CSV里的原始值,再通过函数转换后赋值给目标字段,灵活度很高。
这些方法都能解决你遇到的解析问题,根据你的实际场景选最方便的就行。
内容的提问来源于stack exchange,提问作者Steven Smith




