Table Creation
1. 金額欄位
mysql 中有多個欄位可以表示浮點數:float、double、decimal 等。
而 float
和 double
可能會丟失精度,因此推薦大家使用 decimal
型別儲存金額。
一般我們是這樣定義浮點數的:decimal(m,n)。
其中 n
是指 小數
的長度,而 m
是指 整數加小數
的總長度。
假如我們定義的金額型別是:decimal(10,2),則表示整數長度是 8 位,並且保留 2 位小數。
2. 字符集
mysql 中支援的 字符集
有很多,常用的有:latin1、utf-8、utf8mb4、GBK 等。
這 4 種字符集情況如下:
latin1
容易出現亂碼問題,在實際專案中使用比較少。
而 GBK
支援中文,但不支援國際通用字元,在實際專案中使用也不多。
從目前來看,mysql 的字符集使用最多的還是: utf-8
和 utf8mb4
。
其中 utf-8
佔用 3 個位元組,比 utf8mb4
的 4 個位元組,佔用更小的儲存空間。
但 utf-8 有個問題:即無法儲存 emoji 表情,因為 emoji 表情一般需要 4 個位元組。
由此,使用 utf-8 字符集,儲存 emoji 表情時,資料庫會直接報錯。
所以,建議在建表時字符集設定成: utf8mb4
,會省去很多不必要的麻煩。
3. 排序規則
在 mysql 中建立表時,有個 COLLATE
引數可以設定。
例如:
CREATE TABLE `order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`code` varchar(20) COLLATE utf8mb4_bin NOT NULL,
`name` varchar(30) COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `un_code` (`code`),
KEY `un_code_name` (`code`,`name`) USING BTREE,
KEY `idx_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
它是用來設定 排序規則
的。
字元排序規則跟字符集有關,比如:字符集如果是 utf8mb4
,則字元排序規則也是以: utf8mb4_
開頭的,常用的有: utf8mb4_general_ci
、 utf8mb4_bin
等。
其中 utf8mb4_general_ci 排序規則,對字母的大小寫不敏感。說得更直白一點,就是不區分大小寫。
而 utf8mb4_bin 排序規則,對字元大小寫敏感,也就是區分大小寫。
假如 order 表中現在有一條記錄,name 的值是大寫的 YOYO,但我們用小寫的 yoyo 去查,例如:
select * from order where name='yoyo';
如果字元排序規則是 utf8mb4_general_ci,則可以查出大寫的 YOYO 的那條資料。
如果字元排序規則是 utf8mb4_bin,則查不出來。
因此,字元排序規則一定要根據實際的業務場景選擇,否則容易出現問題。