細說MySQL數據庫操作


基本語法:

CREATE DATABASE [IF NOT EXISTS] db_name  [DEFAULT] CHARACTER SET charset_name  [DEFAULT] COLLATE  collation_name;

最簡便的設置(字符集和校驗規則都采用默認設置):

創建一個名為itbsl的數據庫,並設置字符集和校驗規則

說明:

  1. MySQL語句以分號結尾;
  2. MySQL語句關鍵字不區分大小寫。例如,不管寫成CREATE還是create,效果是一樣的,不過為了便於區分還是建議MySQL關鍵字大寫,字段名和表名小寫。
  3. CHARACTER SET
    字符集,表示數據庫的文字編碼方式,上圖中設置的是utf8,如果沒有設置則采用默認值,這個默認值可以通過my.ini配置文件來修改,(MySQL8默認字符集是utf8mb4)
  4. COLLATE
    校驗規則,校驗規則影響如下:
    1.查詢結果的影響:如果是utf8_general_ci表示不區分大小寫,如果是utf8_bin則表示區分大小寫
    2.對order by子查詢的結果有影響
  5. 如果在數據庫下創建表,那么在默認情況下,表將會使用對應的數據庫的字符集和校驗規則,如果在創建表的時候指定了新的字符集和校驗規則,則以當前表的設置為准。
  6. 在創建數據庫指定字符集時,可以用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,如果看到非法(異常)用戶,可以及時發現並對其進行處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM