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

标签 mysql sql unicode

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

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

在 mysql 中,我有一个包含两列的“words”表:

“id”主要和“单词”唯一 (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 索引,则会出现大量重复条目。

我已经尝试过:

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);    

但是没有成功。我遇到语法错误。

欢迎任何帮助

最佳答案

对于utf8mb4_general_ci,“julià”和“julia”被认为是相等的。

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

您想要将“julià”映射到“julia”吗?

但是您的问题可能还有更多 - 例如,您是否会在中文中包含中文名称以及如何用英文字母拼写它们?整理还不够。

关于mysql插入如果不存在没有唯一索引或唯一键但将unicode和ASCII视为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43565049/

相关文章:

mysql - 如果所有行都不同,则插入 sql

mysql - all方法未定义时如何查询所有记录?

objective-c - 从 NSString : How to ignore the timezone 转换为 NSDate

unicode - Perl 6字符将匹配哪些Unicode属性?

php - 模态内部的数据信息

mysql - 如何合并同年不同月份的行以获得总数量?

mysql - SELECT 不同日期的记录 SQL

mysql - 如何获取行数(记录 ID 所在的位置)

mysql - 将 Mysql 日期 (NOW()) 转换为 bigint

unicode - 使用请求库 PUT 二进制数据