MYSQL資料庫各種小Tips
之前寫了Linux的小Tips,覺得應該把資料庫這塊單獨拎出來寫。其實網上很多關於Mysql資料庫的帖子。這邊我只記錄我花了很長時間才解決的,需要通過很多不同的帖子才解決的一些問題。
1. MYSQL升級後表名大小寫識別問題
之前使用的是MySQL 5資料庫,今天在重新搭建測試環境,使用了MySQL 8 並把資料備份匯入新庫。隨後發現之前可以成功執行的MySQL查詢語句現在不能正常工作了。於是搜尋發現需要對MySQL資料庫設定lower_case_table_names配置。當在/etc/my.cnf檔案中配置為1時,大小寫不敏感:
[mysqld] lower_case_table_names = 1 ... ... ...
然而,網上很多帖子只寫了其一,沒有提其二。由於,我是先匯入了資料以後發現問題,隨後再修改配置。然而,當修改了以上配置,發現mysqld服務就起不來了。後來在MYSQL官網上發現以下內容:
lower_case_table_names
can only be configured when initializing the server. Changing thelower_case_table_names
setting after the server is initialized is prohibited.
也就是說,必須在MySQL資料庫初始化前配置好該引數。因此,要修改該引數,必須先備份好資料庫,然後配置好引數後呼叫以下命令初始化資料庫:
rm -rf /data/mysql/
./bin/mysqld --defaults-file=/etc/my.cnf --initialize
隨後重新把備份好的資料庫匯入即可。
2. 關於ONLY_FULL_GROUP_BY的錯誤
從MYSQL 5.7開始,預設使用ONLY_FULL_GROUP_BY模式。因此使用Select和Group By搜尋資料時,如果使用以前的方法就很容易報錯。在百度搜索問題原因和解決方案,會發現很多重複的,而且並非很好的解決方法。所以,這裡記錄一下。首先在使用GROUP BY的SELECT語句中,如果碰到以下錯誤資訊:
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mydb.t.address' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
那麼恭喜你,你可以繼續往下看了。按照MYSQL的官方文件, 大白話意思就是SELECT中的內容要麼是能夠聚合的,要麼是在GROUP BY中出現的。這個聚合是什麼意思呢?就是說需要使用count()函式或者sum()函式做處理的資料。例如一下搜尋語句:
SELECT name, address, MAX(age) FROM t GROUP BY name;
這裡面因為address,所以會報錯。在這種情況下,如果需要在搜尋結果中包含address資料欄位,需要使用ANY_VALUE()函式,例如:
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
以上問題解釋和解決方案均來自於MYSQL的官方文件。到目前為止,百度搜索的結果竟然清一色的是修改MYSQL的sql_mode,把ONLY_FULL_GROUP_BY給去掉,並且重啟資料庫。這裡吐個槽,這種解決方案真是害人,另外百度搜索做過去重檢測麼?大量的複製貼上都在搜尋列表裡,真是浪費時間。