mysql5.7虛擬列的實際應用


1、背景/原因

請教一下 mysql 字符集為utf8mb4的表,如果需求要把其中一列含有中英文數字符號的varchar列按照中文首字母排序,直接把校對集改成gbk_chinese_ci可以么,會不會有什么問題?

還是說直接在sql用order by convert(colname using gbk) asc?

2、問題分析

通過上述問題的描述及進一步的溝通,開發人員是想完成對昵稱列中文排序的功能。

3、解決方案

3.1、由於數據庫默認設置的字符集為utf8,這也就是為什么開發人員,直觀想將字段改成gbk來完成中文排序的功能了。
3.2、確實可以通過sql語句來進行轉換字段編碼,來完成中文排序功能,但想過去轉換+排序這效率應該高不到哪里去(用不上索引)
3.3、也可以新建一個字段,用於存儲所有昵稱列的拼音(犧牲存儲空間,提升了程序的復雜度)

4、MySQL5.7的新做法
與開發人員溝通后,目前MySQL實例已經用上了5.7版本(這也歸功於DBA運維不斷推薦新業務嘗試新版本),可以使用上MySQL5.7提供的虛擬列功能
以下為測試虛擬列功能:
4.1、新增虛擬列

root@localhost Wed Dec 13 10:46:14 2017 10:46:14 [liufofu]> alter table users add vir_nickname varchar(26) character set gbk generated always as (convert(nickname using gbk));
Query OK, 0 rows affected (0.13 sec)
查看虛擬列

root@localhost Wed Dec 13 10:46:26 2017 10:46:26 [liufofu]> show create table users;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Table | Create Table
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------
| users | CREATE TABLE `users` (
.....

`vir_nickname` varchar(26) CHARACTER SET gbk GENERATED ALWAYS AS (convert(`nickname` using gbk)) VIRTUAL,
.......
4.2、使用虛擬列:

root@localhost Wed Dec 13 10:47:06 2017 10:47:06 [liufofu]> select nickname from users ORDER BY vir_nickname ASC; 

| 阿布在雨林 |
| 畢打天下 |
| 畢打天下 |
| 冰涼火焰_pyan |
| 的的喀喀_fdwi |
| 的的喀喀_ng36 |
| 該昵稱已被占用 |
| 獦獦獦 |
| 哈哈哈 |
| 寒天 |
| 和氣生財_ajv5 |
| 傑蘭特 |
| 咖啡的秋 |
| 卡農來澤_173397702 |
| 凱類視覺_byhp |

通過以上排序來看,基本達到了需求。

5、參考資料:

https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
虛擬列方式:virtual(默認),stored
1、If a generated column is indexed, the optimizer recognizes query expressions that match the column definition and uses indexes from the column as appropriate during query execution
2、Stored generated columns can be used as a materialized cache for complicated conditions that are costly to calculate on the fly
https://dev.mysql.com/doc/refman/5.7/en/generated-column-index-optimizations.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM