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 ... < data.sql
运行它们
@brendan - 您的解决方案似乎解决了问题 - 非常感谢 - 我根本没想到 - 感谢您的宝贵时间。【参考方案2】:
错误字符串表示文本中有非ASCII字符。例如,char \xA0 在大多数编辑器中将显示为空白,但超出了 ascii 范围。在您的示例中,在“策略”一词之前必须有这些字符之一。
一个好的十六进制编辑器会告诉你字符串中的实际字符是什么。我用notepad++查看麻烦的文字,需要开启特殊字符查看。
【讨论】:
以上是关于Mysql - php上传数据 - 错误 - 1366 Incorrect String value的主要内容,如果未能解决你的问题,请参考以下文章
PHP将语句插入XAMPP MySQL数据库不会导致表更新[重复]
PHP与MySQL 8.0+错误:服务器请求客户端未知的身份验证方法[重复]