一、混合排序字符集:
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讓時區生效