You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,精准替换日期里的点。
  • 货币类型处理:去掉货币符号(比如$)和千位分隔符(,),保留数字和小数点。比如把$1,234.56改成1234.56,之后导入时设置字段类型为DECIMAL(10,2)即可。

二、导入时用MySQL函数实时转换(无需修改原始文件)

如果不想改动原始CSV,在MySQL Workbench的导入向导里自定义字段转换规则:

  1. 打开导入向导,选择CSV文件后,进入**“Column Mapping”**(字段映射)步骤。
  2. 对于日期时间戳字段:
    • 把目标字段类型设为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')
  3. 对于货币字段:
    • 目标字段类型设为DECIMAL(10,2)
    • 在“Expression”列输入:CAST(REPLACE(REPLACE(你的字段名, '$', ''), ',', '') AS DECIMAL(10,2))
    • 示例:如果字段叫order_amount,就写CAST(REPLACE(REPLACE(order_amount, '$', ''), ',', '') AS DECIMAL(10,2))
  4. 完成设置后继续导入,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

火山引擎 最新活动