跳轉到

Table Creation

1. 金額欄位

mysql 中有多個欄位可以表示浮點數:float、double、decimal 等。

floatdouble 可能會丟失精度,因此推薦大家使用 decimal 型別儲存金額。

一般我們是這樣定義浮點數的:decimal(m,n)。

其中 n 是指 小數 的長度,而 m 是指 整數加小數 的總長度。

假如我們定義的金額型別是:decimal(10,2),則表示整數長度是 8 位,並且保留 2 位小數。

2. 字符集

mysql 中支援的 字符集 有很多,常用的有:latin1、utf-8、utf8mb4、GBK 等。

這 4 種字符集情況如下:

latin1 容易出現亂碼問題,在實際專案中使用比較少。

GBK 支援中文,但不支援國際通用字元,在實際專案中使用也不多。

從目前來看,mysql 的字符集使用最多的還是: utf-8utf8mb4

其中 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_ciutf8mb4_bin 等。

其中 utf8mb4_general_ci 排序規則,對字母的大小寫不敏感。說得更直白一點,就是不區分大小寫。

而 utf8mb4_bin 排序規則,對字元大小寫敏感,也就是區分大小寫。

假如 order 表中現在有一條記錄,name 的值是大寫的 YOYO,但我們用小寫的 yoyo 去查,例如:

select * from order where name='yoyo';

如果字元排序規則是 utf8mb4_general_ci,則可以查出大寫的 YOYO 的那條資料。

如果字元排序規則是 utf8mb4_bin,則查不出來。

因此,字元排序規則一定要根據實際的業務場景選擇,否則容易出現問題。