好吧,生病了,试着解释一下,但是请为我的英语道歉。
我有一个脚本将整个数据库转储到SQL文件中,然后另一个脚本拆分行并执行它们以删除,创建和插入数据。 问题是一些字符串被“修剪”。它只是插入字符串,直到它到达第一个特殊字符,例如:
对于字符串:
"Pantalon azul marino de Poliéster con cinta blanca bordada con el nombre de la institución en uno de sus costados."
它只是插入:
"Pantalon azul marino de Poli"
不会抛出任何错误。但这只发生在脚本中,但是当我手动运行查询并在phpMyAdmin中导入SQL文件时,一切正常。 顺便说一下,一切都设置为utf8。
我没有想法,任何帮助都将非常感激。
include ('../core/connection.inc.php');
$conn = dbConnect('admin');
$conn->query("SET NAMES 'utf8'");
$conn->set_charset("utf8");
$type = 0;
// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file('db-backup.sql');
// Loop through each line
$correct = 0;
$failed = 0;
foreach ($lines as $line){
// Skip it if it's a comment
if (substr($line, 0, 2) == '--' || $line == '')
continue;
// Add this line to the current segment
$templine .= $line;
// If it has a semicolon at the end, it's the end of the query
if (substr(trim($line), -1, 1) == ';'){
$templine = str_replace("latin1","utf8",$templine);
$templine = trim($templine);
// Perform the query
$conn->query($templine);
$errno = $conn->errno;
$error = $conn->error;
if($conn->affected_rows > 0){
echo "OK: (".$templine.")<br/>";
$correct++;
} else {
echo "Failed: (".$templine.")<br/>";
echo " Errno: ".$errno." <br/>";
echo " Error: ".$error." <br/>";
$failed++;
}
$templine = '';
}
}
答案 0 :(得分:2)
我猜你导入的转储文件不是UTF-8。
PHP正在将文件中的字节传递给MySQL而不进行任何转换。根据您所做的更改,文件中的é
字符可能位于latin1
,可能由值为&gt;的单个字节表示。 127.这不是UTF-8。您已经向MySQL承诺,您将发送有效的UTF-8,当它到达无效字节时,它会停止读取该字符串。
您可以考虑:
我个人认为我会以不同的方式解决问题:
information_schema
中的数据汇编ALTER TABLE
语句并让MySQL正确进行转换。答案 1 :(得分:0)
我不知道你的桌子是怎么样的,但我可以给你一些额外的建议以防万一。确保将DB cols设置为UTF8:
ALTER TABLE {table_name} CHANGE COLUMN {col_name} {col_name} TEXT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NOT NULL ;