Mysql

刪除每列和表排序規則和字元集

  • January 13, 2020

CHARSET=utf8 COLLATE=latin1我最近完成了一個數據庫從CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci. 在此過程中,通過更改它們各自的字元集和排序規則屬性,一次遷移一個表。

既然轉換已經完成,並且所有伺服器和數據庫本身現在都已設置為使用 utf8mb4 和 utf8mb4_unicode_ci,我將如何從列和表中刪除這些屬性,以便它們繼承伺服器上設置的預設值?

例如,目前如果我SHOW FULL COLUMNS FROM table;對大多數列執行排序規則,則將其設置為 utf8mb4_unicode_ci 而不是 NULL。

轉換列:

ALTER TABLE table_name MODIFY col_name VARCHAR(100) CHARACTER SET utf8;

轉換錶:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8;

作為程序員,很容易假設數據庫中存在“繼承”。如果值為 null,請查看父級。

沒有繼承

文本類型列不能有空字元集或排序規則。每個欄位在創建時都會有一個固定的字元集和排序規則。想像一下,在表或數據庫級別更改為完全不同的字元集,現有列中的現有數據會自動繼承新字元集。它可能看起來很腐敗。

這是一些文件: https ://dev.mysql.com/doc/refman/8.0/en/charset-table.html

MySQL 以下列方式選擇表字元集和排序規則:

如果同時指定了 CHARACTER SET charset_name 和 COLLATE collat​​ion_name,則使用字元集 charset_name 和 collat​​ion collat​​ion_name。

如果 CHARACTER SET charset_name 未指定 COLLATE,則使用字元集 charset_name 及其預設排序規則。要查看每個字元集的預設排序規則,請使用 SHOW CHARACTER SET 語句或查詢 INFORMATION_SCHEMA CHARACTER_SETS 表。

如果在沒有 CHARACTER SET 的情況下指定了 COLLATE collat​​ion_name,則使用與 collat​​ion_name 和 collat​​ion collat​​ion_name 關聯的字元集。

否則(既未指定 CHARACTER SET 也未指定 COLLATE),則使用數據庫字元集和排序規則。

為了清楚起見,創建列時選擇了字元集和排序規則。如果您更改它們,您還應該同時轉換數據。

引用自:https://dba.stackexchange.com/questions/102227