MySQL數據庫字符集和排序規則有四個級別的默認設置:服務器,數據庫,表和列。
最初,服務器字符集和排序規則取決於啟動mysqld時使用的選項。可以使用 --character-set-server
該字符集。同樣可以添加 --collation-server
用於排序規則。這些可以在服務器啟動時在命令行或選項文件中進行設置,並可以在運行時進行更改。
一般開發我們要求MySQL數據庫存放中文數據,所以在MySQL配置文件里面一般會指定字符集和排序規則。
我們可以執行SHOW CHARACTER SET,查看MySQL服務器支持的字符集和排序規則。
如果未指定服務器的字符集和排序規則,則默認采用latin1和latin1_swedish_ci。
同時也可以可以清晰的看出,latin1和utf-8的默認排序規則分別是latin1_swedish_ci和utf8_general_ci,同時長度分別占1個和1-3個字節。
數據庫
創建數據庫的時候,
如果不指定數據庫的字符集和排序規則,則數據庫默認采用服務器配置的字符集和排序規則。
如果指定數據庫的字符集而未指定排序規則,則數據庫采用字符集對應默認的字符集。
如果指定數據庫的排序規則而未指定字符集,則數據庫采用排序規則歸類的字符集(即排序規則對應的字符集)。
所有數據庫字符集選項都存儲在一個名為 db.opt(db代表數據庫Schema名稱,一般在數據庫文件目錄下)
可以在數據庫文件目錄中找到。
可以這樣查看
同樣可以這樣查看
表
創建表的時候,
如果不指定表的字符集和排序規則,則表默認采用數據庫配置的字符集和排序規則。
如果指定表的字符集而未指定排序規則,則表采用字符集對應默認的字符集。
如果指定表的排序規則而未指定字符集,則表采用排序規則歸類的字符集。
列
創建列的時候,
如果不指定列的字符集和排序規則,則數據庫默認采用表所在的字符集和排序規則。
如果指定列的字符集而未指定排序規則,則列采用字符集對應默認的字符集。
如果指定列排序規則而未指定字符集,則列采用排序規則歸類的字符集。
以上文字可能看起來比較繁瑣,總結就是,我們在為各個對象創建字符集和排序規則的時候,如果我們指定了優先級高的,優先級高的會覆蓋級別低的。優先級即服務器 < 數據庫 < 表 < 列。