我需要从 PHP 中的 ISO-8859-1 编码文件中读取值,并使用 PDO 将它们写入已编码utf8_unicode_ci
并具有唯一索引的数据库表中。有时数据缺少特殊字符,导致重复键错误。示例:数据包含“Entrainement”和“Entraînement”。有没有我可以用来避免这种情况的 PHP 字符串函数?
最好是一个转换函数,这样我就不必遍历整个数组来检查是否已经插入了一个值。
这是我正在尝试做的一个例子:
$values = array("Entraînement", "Entrainement");
$db = new PDO("mysql:dbname=mydb;host=localhost;charset=utf8", "user", "pw");
$db->exec("SET NAMES 'UTF-8'");
$stmt = $db->prepare("INSERT INTO mytable(myvalue) VALUES(?)");
$already_inserted = array();
foreach($values as $v) {
$v = $v_inserted = iconv('iso-8859-1', 'utf-8', $v);
// Do magic string conversion here
// $v_inserted = collation_convert($v_inserted)
if(isset($already_inserted[$v_inserted])) {
continue;
}
if($stmt->execute(array($v))) {
$already_inserted[$v_inserted] = true;
}
}
此示例应仅插入“Entraînement”并跳过“Entrainement”。
在原始程序中,我使用 Doctrine ORM 而不是 PDO,所以我可以在 SQL 中做很多事情。此外,我在整个 Latin1 范围内都有特殊字符 - 法语、德语、西班牙语等。
我无法将 DB 字段定义更改为,utf8_bin
因为它是电子商务包的一部分 - 各种事情都可能会中断。