在項(xiàng)目開發(fā)的過程中丢烘,包括測試人員提出的一些bug廊移,慢慢總結(jié)出一些Mysql的使用經(jīng)驗(yàn)导披。
1. decimal類型的字段總長度包括了精度長度。
比如decimal(10, 2)剧浸,則表示小數(shù)點(diǎn)左邊為8位锹引,右邊為2位。decimal類型字段常用于存儲精度要求高的數(shù)字唆香。
2. 字段默認(rèn)不區(qū)分大小寫。
測試跟我說吨艇,產(chǎn)品名判斷是否重名時有bug躬它,不能區(qū)分大小寫。存在名為test的產(chǎn)品东涡,再取TEST時竟然提示重名冯吓。
解決方法有幾種:
(1)添加binary關(guān)鍵字
SELECT * FROM table WHERE BINARY name = 'test';
(2)設(shè)置字符集為utf8_bin?
utf8_bin:區(qū)分大小寫; ? ?utf8_general_ci:不區(qū)分大小寫
3. 當(dāng)有GROUP BY時疮跑,不能直接用COUNT(*)計(jì)算行數(shù)组贺。
比如:
SELECT * FROM table WHERE conditions GROUP BY column_1, column_2 LIMIT pagestart, pagesize;
無法用以下sql語句來計(jì)算行數(shù):
SELECT COUNT(*) FROM table WHERE conditions GROUP BY column_1, column_2;
需將GROUP BY的部分放入COUNT里,即改成:
SELECT COUNT(DISTINCT column_1, column_2) FROM table WHERE conditions;
4.用LIMIT來實(shí)現(xiàn)分頁祖娘,需要兩條sql語句失尖。
(1)用LIMIT offset, pagesize來實(shí)現(xiàn)分頁;
(2)同時要獲取同等sql(去除分頁條件)結(jié)果的總數(shù)量渐苏,來給前端進(jìn)行分頁計(jì)算掀潮。
這里有個優(yōu)化sql的地方:LIMIT的offset越大,效率越低
原本:
SELECT id FROM table LIMIT 100000, 10;
改進(jìn):
SELECT id FROM table WHERE id > 100000 LIMIT 10;
5. datetime類型字段自動更新時間的問題琼富。
項(xiàng)目發(fā)現(xiàn)一個bug仪吧,修改表中數(shù)據(jù)會記錄修改時間updated_at,結(jié)果創(chuàng)建時間created_at也跟著更新鞠眉,導(dǎo)致某個定時任務(wù)的邏輯判斷出了問題薯鼠。
當(dāng)表中有datetime類型的字段a和b,其中b字段設(shè)置了ON UPDATE CURRENT_TIMESTAMP械蹋。當(dāng)修改了字段a時出皇,b會自動更新為最新時間。
所以盡量把datetime類型字段的ON UPDATE CURRENT_TIMESTAMP自動設(shè)置更新時間這個特性去掉朝蜘,由業(yè)務(wù)層去設(shè)置時間恶迈。
6.存儲json字符串可以用json類型字段。