好吧,我试着解释一下,但请原谅我的英语。
我有一个脚本将整个数据库转储到一个 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 = '';
}
}
最佳答案
我猜您正在导入的转储文件不是 UTF-8。
PHP 在不进行任何转换的情况下将字节从文件传输到 MySQL。根据您所做的更改,文件中的 é
字符可能位于 latin1
中,可能由值 > 127 的单个字节表示。这不是 UTF -8。您已向 MySQL promise 您将发送有效的 UTF-8,并且当它到达无效字节时它会停止读取字符串。
您可能会考虑:
- 将转储文件重新编码为 UTF-8
- 找出转储文件的编码,并使用该编码将其加载到 MySQL 中
我个人认为我会以不同的方式解决这个问题:
- 使用命令行客户端或类似工具将转储文件加载到 MySQL 中。你知道这行得通。
- 在导入后改变每列的字符集 - 您可以使用
information_schema
中的数据来组装ALTER TABLE
语句并让 MySQL 正确地进行转换。<
关于php - 在 MySQL 中插入字符串的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21594378/