Mysql - php上传数据 - 错误 - 1366 Incorrect String value

Posted

技术标签:

【中文标题】Mysql - php上传数据 - 错误 - 1366 Incorrect String value【英文标题】:Mysql - php upload data - error - 1366 Incorrect String value 【发布时间】:2012-07-23 14:17:19 【问题描述】:

我有一个需要上传到数据库的 .csv 文件。已经有一个现有的 php 脚本,它解析该数据并将其插入到多个数据库表中,并且运行良好。最新的 csv 文件给了我错误。

我无法让自己解决这个问题。这是没有特殊字符的简单英文文本,但我在某些行上不断收到错误。

这是一个这样的行的示例

这是一种旨在平衡风险和回报的投资策略

这是我上传时遇到的错误

ERROR=1366 - 不正确的字符串值:第 1 行的列 'question' 的 '\xA0strat...'

表格字符集为 UTF-8,列问题为 TEXT 类型

我在 Windows 命令提示符下运行 PHP 脚本 - 我感觉它与此有关。但在以前的所有情况下,对于其他 CSV 文件 - php 脚本都在 Windows 本身上运行。

现在,当我在记事本中键入上述英文文本并将其插入 CSV 文件时 - 它工作正常 - 但我有超过 500 行出现此错误,我无法继续在记事本中输入每一行,然后将其粘贴到 CSV .

*** 编辑 ***** **** 这是产生错误的代码

foreach($question_array 作为 $question) //插入问题表 mysql_query("INSERT INTO adl_question (question) VALUES ('".$question."')",$con); echo 'ERROR='.mysql_errno($con).'-'.mysql_error($con); $question_id = mysql_insert_id();

任何见解 谢谢

【问题讨论】:

请提供一些代码 文件似乎没有以 UTF-8 编码。该位置中的字节0xA0(可能旨在表示U+00A0,一个不间断的空格)导致无效的UTF-8编码(U+00A0在UTF-8中编码为0xC2A0)。 @Ron - 我将添加一些代码 - 但它在 php 中的标准插入查询 @eggyal - 感谢您提供的信息 - 我可以做的任何事情将其转换为 UTF-8 首先要找出文件当前的编码。它是如何产生的? 【参考方案1】:

我最近在做数据转换时遇到了这个问题。您需要做的是使用 iconv 将其显式读取为 WINDOWS-1250(或任何编码“坏”文本的字符),然后转换回 UTF-8。

<?php 
$string = iconv('windows-1250', 'utf-8', $badString);
?>

更多信息请参见http://us3.php.net/manual/en/function.iconv.php。

如果您需要对整个文件执行此操作,您可以使用这个函数(我没有写):

<?php 
function utf8_fopen_read($fileName) 
    $fc = iconv('windows-1250', 'utf-8', file_get_contents($fileName));
    $handle=fopen("php://memory", "rw");
    fwrite($handle, $fc);
    fseek($handle, 0);
    return $handle;

?>

然后这样实现:

<?php 
if (($handle = utf8_fopen_read("mycsv.csv")) !== FALSE) 

    while($file = fgetcsv($handle)) 
        $csv[] = $file;
    

    foreach($csv as $row) 
        // run insert here
    

?>

【讨论】:

与其做所有这些,不如用CHARACTER SET子句通知MySQL文件的编码到LOAD DATA命令:例如LOAD DATA INFILE '/path/to/mycsv.csv' INTO TABLE adl_question CHARACTER SET latin1 ... 我个人不相信 MySQL 会处理数据转换,但您的解决方案可能会奏效。然而,我认为,他试图在插入数据之前对其进行格式化,所以无论如何这可能是一个有争议的问题...... MySQL 只使用 libiconv 本身,所以我不明白为什么它应该更不可靠。如果有的话,通常最好使用已经存在的工具,而不是尝试使用自己的工具。此外,LOAD DATA 比为每一行调用 INSERT 语句要快得多(the manual says 大约 20 倍)。 确实如此。通常我只是打印出插入语句并使用mysql ... &lt; data.sql 运行它们 @brendan - 您的解决方案似乎解决了问题 - 非常感谢 - 我根本没想到 - 感谢您的宝贵时间。【参考方案2】:

错误字符串表示文本中有非ASCII字符。例如,char \xA0 在大多数编辑器中将显示为空白,但超出了 ascii 范围。在您的示例中,在“策略”一词之前必须有这些字符之一。

一个好的十六进制编辑器会告诉你字符串中的实际字符是什么。我用notepad++查看麻烦的文字,需要开启特殊字符查看。

【讨论】:

以上是关于Mysql - php上传数据 - 错误 - 1366 Incorrect String value的主要内容,如果未能解决你的问题,请参考以下文章

PHP将语句插入XAMPP MySQL数据库不会导致表更新[重复]

尝试从 php FORM 上传到 MYSQL 数据库时出错

PHP与MySQL 8.0+错误:服务器请求客户端未知的身份验证方法[重复]

上传文件并将文件名保存在 MySQL 数据库中

从database.php中的mysql导入数据库信息[复制]

从mdb文件导入数据到mysql数据库无法上传数据