MYSQL 5.7 升級 8.0 後的 由於字符集導致的大問題 ?
MYSQL 8.0 已經很多年了,但是,但是,但是,還有很多公司和業務專案在MYSQL5.6 ,5.7上繼續奮鬥,這還不是一個重要的問題,重要的問題是早期在MYSQL 5.7 上的一些基礎,並未進行改變後到了MYSQL 8 上的使用一段時間產生的問題。
這裡在MYSQL5.6,MYSQL.5.7上大部分的表還都是 utf8 , default charset =utf8 而在這些資料庫升級的情況下,表基本上是照搬到MYSQL 8.0上的,但是後續會產生一個問題。建立新的表。此次我們採用MYSQL 最新的版本之一,MYSQL 8.030 來進行相關的問題的分析和查詢。
下面就是一個典型的例子,在建立一個MYSQL的表的情況下,如果開發部指定 default charset=utf8 則預設建立新表就是utf8mb4 ,而這樣就會產生一個嚴重的問題。
CREATE TABLE `payments` (
`customerNumber` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`checkNumber` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`paymentDate` date NOT NULL,
`amount` decimal(10,2) NOT NULL,
那麼我們如果反過來進行查詢的話情況是不是有變化,有些文章中提到變換驅動表關係,可以在有些版本上可以解決由於字符集不同的問題,導致的索引失效的問題。
那麼我們變換一下驅動表的位置,整體的查詢計劃進行了變化,相關的執行計劃的效率稍有提高。
我們將語句實際執行,並檢視profilings ,這裡可以看到的是,我們將payments 放到上面的情況下 executing 為 700 而將ORDER 放到驅動表的情況下,execute 變為 1742
這裡我們再次做相關的測試,發現調整後,
我看可以看到,實際上經過以上的操作和分析,如果作為驅動表,表小並且是utf8mb4的情況下,要比驅動表大並且是 utf8 的情況略好。
但如何,都不如統一的字符集讓資料庫的查詢更能良好的執行。在我們統一字元到 utf8mb4 後,整體的查詢正常了
所以以上列子中,主要是說明在MYSQL 5.7 遷移過來的表大部分都是 UTF8MB3 ,而如果MYSQL 8 不做任何處理,則新建的表是 UTF8MB4 ,所以,希望MYSQL 的同學注意以上問題,注意這樣的情況,儘量避免。
另外還有一些事情,需要深入,有的時候即使字符集不同,collation的排序在某些情況下,在字符集不同的情況下還可以走索引。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2936854/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 5.7 升級到 8.0MySql
- MySQL8.0 view導致的效能問題MySqlView
- GitHub是怎樣把MySQL 5.7升級到8.0的?GithubMySql
- windows10 MySQL5.7升級至MySQL8.0WindowsMySql
- Centos 7 升級通過 yum 安裝的 MySQL 5.7 到 MySQL 8.0CentOSMySql
- 不可不知的 MySQL 升級利器及 5.7 升級到 8.0 的注意事項MySql
- spring boot 2.0.0由於版本不匹配導致的NoSuchMethodError問題解析Spring BootError
- chorme自動升級導致跨域問題ORM跨域
- 基於Windows的MySQL5.7本地升級WindowsMySql
- MySQL:5.6 升級 5.7MySql
- 基於centos7的MySQL5.7的RPM本地升級CentOSMySql
- 升級MySQL8.0的歷險記MySql
- java由於越界導致的報錯Java
- mysql 字符集造成的效能問題MySql
- 記一次升級Gradle外掛導致相容問題的解決方案Gradle
- PHP study 升級預設的MYSQL版本 為5.7PHPMySql
- 伺服器由於防火牆問題導致埠不通解決方法伺服器防火牆
- 由Nginx的DNS快取導致的訪問404NginxDNS快取
- 關於 Laravel mix 導致 Bootstrap 失效的問題Laravelboot
- a-select由於位置不夠,導致下拉選單擋住搜尋框的問題
- 記錄一個由於倉庫層錯誤導致軟刪除失效的問題
- 【Cocos2d-x】遮蔽Emoji並解決由於Emoji導致的崩潰問題
- 由於無法分配ip而導致的FailedCreatePodSandBoxAI
- Laravel 5.5.* 升級到 5.7.* 問題記錄Laravel
- 誤升級GLIBC導致系統崩潰之後
- PostgreSQL 字符集烏龍導致資料查詢排序的問題,與 MySQL 穩定 "PG不穩定"排序MySql
- MyBatis版本升級導致OffsetDateTime入參解析異常問題覆盤MyBatis
- Angular CLI 升級 6.0 之後遇到的問題Angular
- MySQL8.0的一個bug導致複製延時MySql
- MySQL5.6升級5.7時,出現主從延遲問題排查過程MySql
- centos7 mysql5.6升級5.7CentOSMySql
- 由於CND cache導致的小程式使用者資訊串號的線上問題回顧
- 專案升級到.Net8.0 Autofac引發詭異的問題
- MySQL8升級遇到的各式各樣問題MySql
- Laravel5.5 升級到 5.7 問題及解決方法Laravel
- 關於mysql查詢字符集不匹配問題的解決方法MySql
- MySQL 5.7 版本的 UTF8 字符集調研MySql
- 故障分析 | MySQL convert 函式導致的字符集報錯處理MySql函式