mysql插入如果不存在没有唯一索引或唯一键但是将unicode和ASCII视为不同的

时间:2017-04-22 21:52:14

标签: mysql sql unicode

我需要从php数组中插入字符串(unicode words)到mysql表中,但我不需要重复的值 在php中无法检查重复项,因为单个单词来自各种来源的爆炸文本,而某些单词可能与之前插入的单词相同

对于每个单词,我还需要在同一列中插入ASCII版本,但前提是unicode单词与ASCII转换单词不同

在mysql中,我有一个表'words',有两列:

'id'PRIMARY和'word'UNIQUE(utf8mb4_general_ci)

$sql = "
    INSERT INTO ´words´ (´word´) VALUES ('$word')
    ON DUPLICATE KEY UPDATE
    SET ´word´ = '$word'
";

$query->execute();


//ex: if $word = "peter" and $word_ascii = "peter" do not insert $word_ascii
//but if $word = "julià" and $word_ascii = "julia" inert also $word_ascii
if($word != $word_ascii){
    $sql = "
        INSERT INTO ´words´ (´word´) VALUES ('$word_ascii')
        ON DUPLICATE KEY UPDATE
        SET ´word´ = '$word_ascii'
    ";  
    $query->execute();
} 

但是在这种模式下,当我尝试插入$ word_ascii =“julia”时,覆盖我之前插入的“julià”(由于UNIQUE索引和ON DUPLICATE KEY UPDATE)

如果我退出UNIQUE索引,那么会有很多重复的条目。

我试过了:

INSERT IGNORE(有和没有UNIQUE),

更换......但仍然是同样的问题。

我也尝试过这个旧答案中的IF NOT EXIST:How to 'insert if not exists' in MySQL?

INSERT INTO ´words´ (´word´) VALUES ('$word')
WHERE NOT EXISTS (SELECT * FROM ´words´ WHERE ´word´ = '$word' LIMIT 1);    

但不成功。我遇到了语法错误。

欢迎任何帮助

1 个答案:

答案 0 :(得分:1)

utf8mb4_general_ci,“julià”和“julia”被认为是平等的。

一种可能的解决方案是将word的排序规则更改为utf8_bin。然后INSERT IGNORE将按预期工作,您将获得两行,一行“julià”,一行“julia”。

你想把“julià”映射到“julia”吗?

但是你的问题可能还有更多 - 你会不会用中文包括中文名字以及如何拼写英文字母?整理是不够的。