0

我需要从 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因为它是电子商务包的一部分 - 各种事情都可能会中断。

4

1 回答 1

1

好吧,您绝对应该将值转换为 UTF-8 并使用 UTF-8 连接编码。否则,您的应用程序根本无法利用 UTF-8,因为您的应用程序将只能发送和接收 ISO-8859-1 包含的字符。与 Unicode ☹ 相比,这是非常非常少的数量。


这与您的问题无关*,在unicode_ci排序规则中,î被认为与i. 如果您需要将它们视为不同的字符,请使用其他排序规则:

SELECT 'î' = 'i' COLLATE 'utf8_unicode_ci'
//1

SELECT 'î' = 'i' COLLATE 'utf8_bin'
//0

没有 German** 排序规则,所以我想utf8_bin这就是您想要的。


*只有当声明的连接编码与您发送的物理字节的编码不匹配时才会出现问题。IE 如果您使用 UTF-8 连接编码发送 ISO-8859-1 字节,如果没有错误,您将得到废话。反之亦然。

**我从您的个人资料中查找了该内容,如果您实际上需要其他语言,则可能会对此进行整理。

于 2013-03-22T18:16:52.423 回答