修改MySQL varchar類型字段的排序規則

記錄一個在工做中遇到的問題,也不算是問題,爲的是找一種簡便的方法批量修改數據表字段的排序規則,在MySQL中叫collation,經常和編碼CHARACTER一塊兒出現的。collation有三種級別,分辨是數據庫級別,數據表級別和字段級別。數據庫

1.The database level
2.The table level
3.The column level

https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database 這篇文章說得比較詳細。編碼

那天遇到的問題是這樣子的,
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=',主要是由於遷移數據庫時候沒有把collation規則及時修改過來。code

網上搜到的解決辦法,都提到了修改數據表級別collation排序規則。可是我遇到的場景是數據表級別已是utf8_unicode_ci,而字段級別是utf8_general_ci,(這裏咱們關心的字段類型是varchar)。orm

因爲須要修改的字段太多了,手工修改確定是費時費力的。天然也想到了用腳本的方式批量修改,可是發現這種經過查找MySQL信息表、過濾、拼接生成批量修改的語句太好用了,並且還能作到針對varchar類型。排序

SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY `', column_name, '` ', DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH, ') CHARACTER SET UTF8 COLLATE utf8_unicode_ci', (CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END), ';')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'database'
AND DATA_TYPE = 'varchar'
AND
(
    CHARACTER_SET_NAME != 'utf8'
    OR
    COLLATION_NAME != 'utf8_unicode_ci'
);

database須要改爲實際數據庫名字。須要注意的是,若是要修改的字段存在外鍵關係,那就要當心處理,刪除外鍵,修改collation後再把外鍵關係加回來。ci

相關文章
相關標籤/搜索