【问题标题】:mysql insert if not exists without unique index, or unique key but treat unicode and ASCII as different如果没有唯一索引或唯一键不存在,则 mysql 插入,但将 unicode 和 ASCII 视为不同
【发布时间】:2017-09-19 18:35:58
【问题描述】:

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

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

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

'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),

REPLACE ...但仍然是同样的问题。

我也尝试从这个旧答案中调整 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);    

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

欢迎任何帮助

【问题讨论】:

  • 我很困惑。你想要发生什么?
  • 。 . INSERT IGNORE 应该做你想做的事。
  • 正如我上面所说,我已经使用了 INSERT IGNORE 但我现在再试一次
  • IF NOT EXISTS 出现在 CREATEDROP 命令中,而不是 INSERT

标签: mysql sql unicode


【解决方案1】:

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

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

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

但您的问题可能还有更多问题——您是否会在中文中包括中文名称以及它们如何与英文字母拼写?排序不够。

【讨论】:

  • 目前我暂时解决了创建两个单独的表,一个用于 unicode,另一个用于 ASCII。 (我不知道这是否会影响查询性能)我明天会尝试您的建议(有 04:00 AM :D)谢谢。关于无法转换为 ASCII 的中文和其他字符,我在 PHP 中进行了检查,如果有 ??? chars 我只插入原始单词
  • @MTK - 对您的评论的 3 条回复: * 在一个表中,单独的列可以使用单独的字符集。 * 中文见stackoverflow.com/questions/38363566/…中的“问号”;并使用 utf8mb4。 * “Unicode”是错误的术语。
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2014-12-30
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多