我需要将 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/