我正在使用LOAD DATA INFILE
.csv 文件中的 php 和 mysql。
一些单元格包含一个'€'
符号和一个数字,一些包含一个符号'$'
和一个数字,例如:2.13€, 5.4$
当我将 csv 文件加载到表中时,带有'$'
符号的单元格被正确插入并且带有的单元格'€'
是空的.
相关列定义如下:
VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci
如何确保'€'
正确插入标志?
我转换了文件编码:
$data = file_get_contents(PATH_TO_CSV_FILE);
$data = mb_convert_encoding($data, 'UTF-8', 'Windows-1252');
file_put_contents(PATH_TO_MODIFIED_CSV_FILE, $data);
然后将其加载到表中:
LOAD DATA INFILE '".PATH_TO_MODIFIED_CSV_FILE."' INTO TABLE ...
尝试:
LOAD DATA INFILE '".PATH_TO_CSV_FILE."' INTO TABLE tbl_name CHARACTER SET latin1
latin1 分别对应于 Windows-1252 和 CP-1252。
如有必要,我最终使用以下代码进行检测和转换:
<?php
# Detect and convert to utf-8
$data = file_get_contents($file_full_path);
if(mb_detect_encoding($str,"UTF-8, ISO-8859-1, Windows-1252") != "UTF-8") {
$data = mb_convert_encoding($data, 'UTF-8', 'Windows-1252');
file_put_contents($file_full_path, $data);
}
但是,如果您知道要加载的文件的字符集,您应该明确地使用 MySQL 命令,如文档中所述:
character_set_database 系统变量指示的字符集用于解释文件中的信息。SET NAMES 和 character_set_client 的设置不影响输入的解释。如果输入文件的内容使用不同于默认的字符集,通常最好使用 CHARACTER SET 子句指定文件的字符集,该子句从 MySQL 5.1.17 开始可用。二进制字符集指定“不转换”。</p>
使用以下语法:
LOAD DATA INFILE 'file_name' INTO TABLE tbl_name [CHARACTER SET charset_name]