基本語法:
CREATE DATABASE [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name;
最簡便的設置(字符集和校驗規則都采用默認設置):
創建一個名為itbsl的數據庫,並設置字符集和校驗規則
說明:
- MySQL語句以分號結尾;
- MySQL語句關鍵字不區分大小寫。例如,不管寫成CREATE還是create,效果是一樣的,不過為了便於區分還是建議MySQL關鍵字大寫,字段名和表名小寫。
- CHARACTER SET
字符集,表示數據庫的文字編碼方式,上圖中設置的是utf8,如果沒有設置則采用默認值,這個默認值可以通過my.ini配置文件來修改,(MySQL8默認字符集是utf8mb4) - COLLATE
校驗規則,校驗規則影響如下:
1.查詢結果的影響:如果是utf8_general_ci表示不區分大小寫,如果是utf8_bin則表示區分大小寫
2.對order by子查詢的結果有影響 - 如果在數據庫下創建表,那么在默認情況下,表將會使用對應的數據庫的字符集和校驗規則,如果在創建表的時候指定了新的字符集和校驗規則,則以當前表的設置為准。
- 在創建數據庫指定字符集時,可以用character set utf8,也可以用charset=utf8,兩種均可。
字符集和校驗規則
字符集是一套符號和編碼。校驗規則是在字符集內用於比較字符的一套規則。
字符集
- MySQL5.5.3之后增加了utf8mb4字符編碼,最多使用四個字節存儲字符
- utf8mb4是utf8的超集並完全兼容utf8,能夠用四個字節存儲更多的字符。
有了utf8,為什么要用utf8mb4?
標准的UTF-8字符集編碼是可以使用1-4個字節去編碼21位字符,這幾乎包含了世界上所有能看見的語言。
而mysql支持的 utf8 編碼最大字符長度為 3 字節,如果遇到 4 字節的寬字符就會插入異常了。三個字節的 UTF-8 最大能編碼的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文種平面(BMP)。也就是說,任何不在基本多文本平面的 Unicode字符,都無法使用 Mysql 的 utf8 字符集存儲。包括 Emoji 表情(Emoji 是一種特殊的 Unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 Unicode 字符等等。
MySQL在5.5.3版本之后增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。好在utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉換。
當然了,如果我們能夠確定數據庫中不會存儲四字節字符,完全可以使用utf8編碼,因為這樣更加節省空間。
我們可以通過select version()查看數據庫的版本,以確定是否支持utf8mb4。
select version();
校驗規則
是在字符集內用於比較字符的一套規則,比如定義'A'<'B'這樣的關系的規則。不同collation可以實現不同的比較規則,如'A'='a'在有的規則中成立,而有的不成立;進而說,就是有的規則區分大小寫,而有的無視。
utf8mb4對應的校驗規則有utf8mb4_unicode_ci、utf8mb4_general_ci
utf8mb4_unicode_ci和utf8mb4_general_ci的對比:
- 准確性
- utf8mb4_unicode_ci是基於標准的Unicode來排序和比較,能夠在各種語言之間精確排序
- utf8mb4_general_ci沒有實現Unicode排序規則,在遇到某些特殊語言或者字符集,排序結果可能不一致。
- 但是,在絕大多數情況下,這些特殊字符的順序並不需要那么精確。
- 性能
- utf8mb4_general_ci在比較和排序的時候更快
- utf8mb4_unicode_ci在特殊情況下,Unicode排序規則為了能夠處理特殊字符的情況,實現了略微復雜的排序算法。
- 但是在絕大多數情況下發,不會發生此類復雜比較。相比選擇哪一種collation,使用者更應該關心字符集與排序規則在db里需要統一。
校驗規則的影響
實際操作來看看校驗規則的影響
(1) 校驗規則對查詢的影響:
在數據庫itbsl下創建一個校驗規則為utf8_general_ci的test表;
use itbsl;
create table `test`(
`id` int auto_increment primary key comment "主鍵",
`name` char(20) not null default '' comment '姓名'
)charset=utf8 collate utf8_general_ci;
insert into `test` value(default, 'a');
insert into `test` value(default, 'A');
insert into `test` value(default, 'b');
insert into `test` value(default, 'B');
在校驗規則為utf8_general_ci的情況下,查詢name等於a的結果有兩條,因為不區分大小寫,如圖所示:
在數據庫itbsl下創建一個校驗規則為utf8_bin的test2表;
use itbsl;
create table `test2`(
`id` int auto_increment primary key comment "主鍵",
`name` char(20) not null default '' comment '姓名'
)charset=utf8 collate utf8_bin;
insert into `test2` value(default, 'a');
insert into `test2` value(default, 'A');
insert into `test2` value(default, 'b');
insert into `test2` value(default, 'B');
在校驗規則為utf8_bin的情況下,查詢name等於a的結果只有一條,因為區分大小寫了,如圖所示:
(2) 校驗規則對排序的影響
utf8_general_ci:
utf8_bin: 排序時按照字母對應的ascii碼值排序
數據庫操作相關指令
查詢數據庫版本
SELECT VERSION();
顯示數據庫語句
SHOW DATABASES;
顯示數據庫創建語句
SHOW CREATE DATABASE db_name;
itbsl被反引號``包裹,如果使用``包裹數據庫名或表名,這樣數據庫名或者表名使用了關鍵字,也不會報錯,會正常執行,所以建議在創建數據庫或者表時都加上反引號,但是同時建議數據庫名和表明不要和關鍵字一樣。
/*!40100 DEFAULT CHARACTER SET utf8 */
上面這句話不是注釋,而是表示:當MySQL數據庫版本大於4.01時,就執行DEFAULT CHARACTER SET utf8mb4,反之就不執行這句話。
數據庫刪除語句
DROP DATABASE [IF EXISTS] db_name;
查看當前數據庫有多少個用戶在操作
SHOW PROCESSLIST;
通過這個命令可以查看當前有哪些用戶在連接MySQL,如果看到非法(異常)用戶,可以及時發現並對其進行處理。