mysql通過INSERT IGNORE INTO插入拼音字符無效問題及解決

前言

在做一個批量導入關鍵詞的功能時,發現關鍵詞如果帶有像é這樣的拼音字符時,存入數據庫時會識別為e,造成部分關鍵詞沒有被導入,且與原來部分關鍵詞可能重復的情況,因此記錄下來避免以後再踩坑。

提示:以下是本篇文章正文內容,下面案例可供參考 

一、準備工作

準備一份批量導入關鍵詞excel,其中包含2個關鍵詞

1.pokemon

2.pokémon

註意:這2個關鍵詞中一個是普通的e,一個是帶音節的é

準備數據庫表sql腳本

-- 導入關鍵詞表
CREATE TABLE `keyword_lexicon` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `keyword` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '搜索關鍵詞',
  PRIMARY KEY ("id"),
  UNIQUE KEY "idx_keyword" ("keyword") USING BTREE COMMENT '關鍵詞'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='導入關鍵詞表';

二、場景復現

簡單寫一個導入接口,代碼就不附上瞭,需要註意的是導入sql用的是INSERT IGNORE INTO的方式,如果表中已經有該關鍵詞瞭則不會寫入表中。(keyword字段設為唯一索引)

導入sql例子如下

INSERT IGNORE INTO keyword_lexicon (`keyword`) VALUES ('pokemon'),('pokémon')

調接口完成導入後,查看數據庫表,發現隻有一條pokemon的數據。

三、解決問題

查看表結構發現,keyword字段的排序規則為

  • utf8mb4_general_ci

這種排序規則在識別é這種帶有音節的字符時,會識別為e,導致2個關鍵詞在通過INSERT IGNORE INTO導入後隻會有一條記錄,隻要將排序規則改為

  • utf8mb4_bin

然後再重新導入,查看結果可發現2條數據都已經插入表中,問題解決。

總結

  • utf8mb4_bin是區分大小寫的,也區分e和é這類字符的
  • utf8_genera_ci是不區分大小寫的,也不區分e和é這類字符

註:utf8_general_cs是區分大小寫的,但不區分e和é這類字符

如果需要區分帶有音節的字符,又不想要區分大小寫,可在sql查詢對應字段時用LOWER()函數

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: