MySQL生成带表头CSV文件时UNION排序规则冲突与乱码问题
方案1:添加UTF8 BOM头(优先推荐)
这个方案不需要修改表的字符集,也不需要处理编码转换,从根源解决Excel识别UTF8编码异常的问题:
Excel默认不会主动识别无BOM的UTF8编码文件,只要在导出的CSV文件开头插入UTF8 BOM头(固定二进制值0xEFBBBF),Excel就会正常识别UTF8编码,不会出现乱码。
修改后的SQL语句如下:
SELECT 0xEFBBBF, -- 插入UTF8 BOM头 'Erheüößbungsstelle', 'Bevorzugtes PLZ Gebiet', 'alternatives PLZ Gebiet', 'Vorname', 'Nachname', 'Geburtsdatum' UNION ALL SELECT '', -- BOM头对应的空列,不影响内容 mitarbeite.region, mitarbeite.preferred_regions_primary, mitarbeite.preferred_regions_secondary, mitarbeite.firstname, mitarbeite.lastname, mitarbeite.birthday FROM mitarbeite WHERE mitarbeite.region = 'Kiel' INTO OUTFILE 'd:/TransferMysql/Kiel20211115.csv' FIELDS TERMINATED BY ';' ENCLOSED BY '"' -- 可选,避免字段内容包含分隔符时格式错乱 LINES TERMINATED BY '\r\n';
方案2:修正字符集适配Windows ANSI
你之前用的cp1250是中欧字符集,不支持德语的ß等特殊字符,德语区Windows默认的ANSI编码是cp1252,替换字符集即可解决表头乱码问题:
- 建表时将所有字符集和排序规则替换为
cp1252和cp1252_general_ci - 表头转换编码时指定
cp1252和对应排序规则,避免UNION报错,示例写法:
SELECT CONVERT('Erheüößbungsstelle' USING cp1252) COLLATE cp1252_general_ci, CONVERT('Bevorzugtes PLZ Gebiet' USING cp1252) COLLATE cp1252_general_ci, CONVERT('alternatives PLZ Gebiet' USING cp1252) COLLATE cp1252_general_ci, CONVERT('Vorname' USING cp1252) COLLATE cp1252_general_ci, CONVERT('Nachname' USING cp1252) COLLATE cp1252_general_ci, CONVERT('Geburtsdatum' USING cp1252) COLLATE cp1252_general_ci UNION ALL SELECT mitarbeite.region, mitarbeite.preferred_regions_primary, mitarbeite.preferred_regions_secondary, mitarbeite.firstname, mitarbeite.lastname, mitarbeite.birthday FROM mitarbeite WHERE mitarbeite.region = 'Kiel' INTO OUTFILE 'd:/TransferMysql/Kiel20211115.csv' FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n';
内容的提问来源于stack exchange,提问作者Klatty
相关产品推荐
相关产品推荐

