代码之家  ›  专栏  ›  技术社区  ›  Toleo

向表中插入utf8名称会产生重复错误

  •  0
  • Toleo  · 技术社区  · 7 年前

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

    $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 回复  |  直到 7 年前
        1
  •  1
  •   Syed Daniyal Asif    7 年前

    MySQL对rodriguez和rodrguez的处理是一样的,您必须更改排序规则。

    可以使用以下命令修复排序规则:

    CREATE TABLE Table (...) COLLATE utf8_bin;
    
        2
  •  1
  •   Paddy Hallihan    7 年前

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

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