Windows下mysql 5.7 設(shè)置區(qū)分大小寫(敏感),設(shè)置默認(rèn)編碼 utf8mb4
修改編碼
c盤下搜索
C:\ProgramData\MySQL\MySQL Server 5.7
在該my.ini文件下進(jìn)行配置修改
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'
區(qū)分大小寫
window下 改為2,
lower_case_table_names=2
最后保存 配置文件的時(shí)候注意 文件格式 ,類型 必須是 ANSI ,不小心保存成 utf-8 將不能啟動(dòng)服務(wù),
重啟mysql 服務(wù)ok
怎么從utf8轉(zhuǎn)換為utf8mb4
3.1 “偽”轉(zhuǎn)換
如果你的表定義和連接字符集都是utf8,那么直接在你的表上執(zhí)行
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4;
則能夠該表上所有的列的character類型變成 utf8mb4,表定義的默認(rèn)字符集也會(huì)修改。連接的時(shí)候需要使用set names utf8mb4便可以插入四字節(jié)字符。(如果依然使用 utf8 連接,只要不出現(xiàn)四字節(jié)字符則完全沒(méi)問(wèn)題)。
上面的 convert 有兩個(gè)問(wèn)題,一是它不能ONLINE,也就是執(zhí)行之后全表禁止修改,有關(guān)這方面的討論見 mysql 5.6 原生Online DDL解析;二是,它可能會(huì)自動(dòng)該表字段類型定義,如 VARCHAR 被轉(zhuǎn)成 MEDIUMTEXT,可以通過(guò) MODIFY 指定類型為原類型。
另外 ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4 這樣的語(yǔ)句就不要隨便執(zhí)行了,特別是當(dāng)表原本不是utf8時(shí),除非表是空的或者你確認(rèn)表里只有拉丁字符,否則正常和亂的就混在一起了。
最重要的是,你連接時(shí)使用的latin1字符集寫入了歷史數(shù)據(jù),表定義是latin1或utf8,不要期望通過(guò) ALTER ... CONVERT ... 能夠讓你達(dá)到用utf8讀取歷史中文數(shù)據(jù)的目的,沒(méi)卵用,老老實(shí)實(shí)做邏輯dump。所以我才叫它“偽”轉(zhuǎn)換
3.2 character-set-server
一旦你決定使用utf8mb4,強(qiáng)烈建議你要修改服務(wù)端 character-set-server=utf8mb4,不同的語(yǔ)言對(duì)它的處理方法不一樣,c , php, python可以設(shè)置character-set,但java驅(qū)動(dòng)依賴于 character-set-server 選項(xiàng),后面有介紹。
同時(shí)還要謹(jǐn)慎一些特殊選項(xiàng),如 遇到騰訊云CDB連接字符集設(shè)置一個(gè)坑。個(gè)人不建議設(shè)置全局 init_connect。
key 768 long 錯(cuò)誤
字符集從utf8轉(zhuǎn)到utf8mb4之后,最容易引起的就是索引鍵超長(zhǎng)的問(wèn)題。
對(duì)于表行格式是 COMPACT或 REDUNDANT,InnoDB有單個(gè)索引最大字節(jié)數(shù) 768 的限制,而字段定義的是能存儲(chǔ)的字符數(shù),比如 VARCHAR(200) 代表能夠存200個(gè)漢字,索引定義是字符集類型最大長(zhǎng)度算的,即 utf8 maxbytes=3, utf8mb4 maxbytes=4,算下來(lái)utf8和utf8mb4兩種情況的索引長(zhǎng)度分別為600 bytes和800bytes,后者超過(guò)了768,導(dǎo)致出錯(cuò):Error 1071: Specified key was too long; max key length is 767 bytes。
COMPRESSED和DYNAMIC格式不受限制,但也依然不建議索引太長(zhǎng),太浪費(fèi)空間和cpu搜索資源。
如果已有定義超過(guò)這個(gè)長(zhǎng)度的,可加上前綴索引,如果暫不能加上前綴索引(像唯一索引),可把該字段的字符集改回utf8或latin1。
但是,( 敲黑板啦,很重要 ),要防止出現(xiàn) Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '=' 錯(cuò)誤:連接字符集使用utf8mb4,但 SELECT/UPDATE where條件有utf8類型的列,且條件右邊存在不屬于utf8字符,就會(huì)觸發(fā)該異常。表示踩過(guò)這個(gè)坑。
再多加一個(gè)友好提示:EXPLAIN 結(jié)果里面的 key_len 指的搜索索引長(zhǎng)度,單位是bytes,而且是以字符集支持的單字符最大字節(jié)數(shù)算的,這也是為什么 INDEX_LENGTH 膨脹厲害的一個(gè)原因。
到此這篇關(guān)于Windows下mysql 5.7 設(shè)置區(qū)分大小寫(敏感),設(shè)置默認(rèn)編碼 utf8mb4的文章就介紹到這了,更多相關(guān)mysql 5.7區(qū)分大小寫utf8mb4編碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql增量恢復(fù)的幾種實(shí)現(xiàn)方法
本文主要介紹了MySql增量恢復(fù)的幾種實(shí)現(xiàn)方法,通過(guò)增量備份與恢復(fù),可以在系統(tǒng)發(fā)生故障或數(shù)據(jù)損壞時(shí)快速恢復(fù)到最新狀態(tài),提高系統(tǒng)的可靠性和可用性,感興趣的可以了解一下2023-08-08mysql如何導(dǎo)出服務(wù)器內(nèi)所有的數(shù)據(jù)庫(kù)
這篇文章主要介紹了mysql如何導(dǎo)出服務(wù)器內(nèi)所有的數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10mysql優(yōu)化的重要參數(shù) key_buffer_size table_cache
MySQL服務(wù)器端的參數(shù)有很多,但是對(duì)于大多數(shù)初學(xué)者來(lái)說(shuō),眾多的參數(shù)往往使得我們不知所措,但是哪些參數(shù)是需要我們調(diào)整的,哪些對(duì)服務(wù)器的性能影響最大呢2016-05-05mysql 數(shù)據(jù)庫(kù)基礎(chǔ)筆記
mysql 數(shù)據(jù)庫(kù)基礎(chǔ)筆記,剛開始接觸mysql的朋友可以參考下2012-07-07