MySQL Workbench表导入向导导入CSV选Datetime/Double类型0条导入问题
CSV导入MySQL Workbench类型不匹配问题解决
导入失败原因
- Date字段格式不匹配:若数值型Date是Unix时间戳(10位/13位整数)或Excel日期序列号,MySQL DATETIME类型无法直接识别这类整数输入,导入向导会默认尝试按
YYYY-MM-DD HH:MM:SS格式解析,格式校验失败直接拒绝该行导入。 - Revenue字段解析失败:CSV内的数值可能存在隐藏字符(前后空格、千位分隔符、货币符号、引号包裹标记),导入向导转DOUBLE时无法识别这类非纯数值内容,触发类型转换错误。
- TEXT类型无格式校验规则:任意内容都可以作为字符串存储,不会触发转换失败,因此全字段设为TEXT可导入成功。
解决方案
方案1:手动写SQL导入直接转换为目标类型
无需使用图形化向导,通过LOAD DATA命令自定义转换规则,可一步导入为目标类型,示例代码如下:
-- 第一步:创建符合类型要求的目标表 CREATE TABLE sales_data ( ID INT PRIMARY KEY, Product VARCHAR(255), Type VARCHAR(255), Date DATETIME, Revenue DOUBLE ); -- 第二步:执行CSV导入,替换路径、分隔符等参数为你实际的CSV配置 LOAD DATA INFILE 'C:/your_file_path/data.csv' INTO TABLE sales_data FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS -- CSV第一行是表头则保留该行,否则删除 (ID, Product, Type, @raw_date, @raw_revenue) SET -- 转换时间戳:10位是秒级、13位是毫秒级自动适配 Date = FROM_UNIXTIME(IF(LENGTH(@raw_date)=13, @raw_date/1000, @raw_date)), -- 如果是Excel日期序列号,上面的Date转换替换为下面的语句 -- Date = DATE_ADD('1900-01-01', INTERVAL (CAST(@raw_date AS UNSIGNED) - 2) DAY), -- 先去除前后空格再转DOUBLE Revenue = CAST(TRIM(@raw_revenue) AS DOUBLE);
如果执行时报secure_file_priv权限错误,将CSV文件放到MySQL配置项secure_file_priv指定的目录下再执行即可。
方案2:先全量导入为TEXT再转换类型
如果不想写导入SQL,可用向导先把所有字段设为TEXT导入到临时表,再执行类型转换:
-- 新增目标类型的字段 ALTER TABLE your_temp_table ADD COLUMN Date_New DATETIME, ADD COLUMN Revenue_New DOUBLE; -- 执行类型转换赋值 UPDATE your_temp_table SET Date_New = FROM_UNIXTIME(IF(LENGTH(Date)=13, Date/1000, Date)), -- 同样如果是Excel序列号替换上面的Date_New转换逻辑即可 Revenue_New = CAST(TRIM(Revenue) AS DOUBLE); -- 验证数据无误后,替换原字段 ALTER TABLE your_temp_table DROP COLUMN Date, DROP COLUMN Revenue, CHANGE COLUMN Date_New Date DATETIME, CHANGE COLUMN Revenue_New Revenue DOUBLE;
内容的提问来源于stack exchange,提问作者SylviaS
相关产品推荐
相关产品推荐

