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。
推薦閱讀:
- JavaWeb倉庫管理系統詳解
- 詳解MySQL主鍵唯一鍵重復插入解決方法
- 關於mysql 8.x 中insert ignore的性能問題
- MySQL的主鍵命名策略相關
- 淺談MySql整型索引和字符串索引失效或隱式轉換問題