mysql常見問題彙總

一、混合排序字符集:

1、問題描述:本人在一次創建數據庫時,數據庫排序規則選成了utf8mb4_unicode_ci,在連接查詢,比如union查詢,select from a表,b表,如果這幾個表排序規則不一樣,會報錯 Illegal mix of collations  for operation '='。

2、原因:通過show variables where Variable_name like 'collation%';查詢數據庫排序規則,需要這三個完全一致:

如果不一致就會出現上面的問題;

3、解決方法: 使用alert語句修改了數據庫排序規則編碼後,再執行show variables where Variable_name like 'collation%';,發現已經一致了,但是查詢還會報錯,原因是數據庫的字符集改過來了,已有的表和字段還是utf8mb4_unicode_ci,這時候需要把所有的表及字段改過來。批量修改方法:

SELECT
CONCAT(
'ALTER TABLE ',
TABLE_NAME,
' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;'
)
FROM
information_schema.`TABLES`
WHERE
TABLE_SCHEMA = '庫名';

生成所有需要執行的SQL,再批量執行這些SQL即可。

如:

二、時區問題:

插入時間參數,常用mysql系統函數NOW(),或在代碼中指定Date類型的值。當在代碼中使用Date設置時間時,中間涉及mysql數據庫和系統的時間轉換,這就涉及到時區的問題,如果數據庫與系統時區不一致,哪怕new Date()和NOW()的值相等,執行SQL時這個時間參數可能就和系統不一樣了。

這種情況,可以在連接數據庫的url中指定時區serverTimezone( utc爲國際時間,和北京時間差8小時, GMT表示北京時間東八區);也可以修改mysql的系統配置:

1、命令修改

# 查看數據庫當前時間
SELECT NOW();
#查看時區
show variables like '%zone%';
select @@time_zone;
#修改mysql全局時區爲北京時間
set global time_zone = '+8:00';
#修改當前會話時區
set time_zone = '+8:00';
#立即生效
flush privileges;
2、配置文件修改

編輯配置文件vim /etc/my.cnf,找到[mysqld],然後加入default-time-zone = '+8:00'。重啓mysql讓時區生效
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章