将UTF8名称插入表会出现重复错误

时间:2018-07-19 16:08:19

标签: php mysql pdo character-encoding

我有以下两个名字的数组:

$x = ['Rodriguez', 'Rodríguez'];

现在,我想做的就是将这些值插入到我的表中,就像下面的

Collation: utf8mb4_unicode_520_ci
Engine: InnoDB
[id(primary_ai)  -  name(unique)]

我确实使用以下方法连接到数据库

<?php 
try {
    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8mb4;", 'root', 'root', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false
    ]);
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

然后我尝试使用

$paras = $x
$pdo->prepare("INSERT INTO names (name) VALUES (?), (?)")->execute($paras);

但是我不断收到错误消息

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'Rodríguez' for key 'name'

我该如何准确地处理此编码问题?

我尝试使用utf8_encode(),但第二个名称更改为Rodríguez,然后尝试utf8_decode()但得到Rodr�guez,然后尝试添加PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",但没有也不能解决重复的错误。

2 个答案:

答案 0 :(得分:1)

您需要从数据库中删除唯一限制,否则必须使用其他一些编码来识别i和í之间的差异。

这可能有效https://www.w3schools.com/html/html_entities.asp

答案 1 :(得分:1)

MySQL将Rodriguez和Rodríguez当作同一件事,您必须更改排序规则。

您可以使用以下方法修复排序规则:

CREATE TABLE Table (...) COLLATE utf8_bin;