知乎专栏 |
目录
下面数据库设计实例中,大部分使用MySQL,PostgreSQL为例,少部分以Oracle为例。
没有特别需要,不要使用有符号整形,尤其是是 AUTO_INCREMENT。
INT[(M)] [UNSIGNED] [ZEROFILL] M 默认为11 普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; TRUNCATE `test`.`test`; ALTER TABLE `test` AUTO_INCREMENT = 2147483645;
下面演示插入失败的情况,重复执行下面SQL插入数据
INSERT INTO `test`.`test` (`name`) VALUES ('chen');
直到提示错误 Error Code: 1062. Duplicate entry '2147483647' for key 'PRIMARY' 表示 id 已经到了最大值,无法再插入数据。
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2147483647 DEFAULT CHARSET=utf8mb4
现在改为无符号整形,然后在执行插入SQL
ALTER TABLE `test`.`test` CHANGE COLUMN `id` `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ;
再次调整 AUTO_INCREMENT 值,然后运行插入数据的 SQL
ALTER TABLE `test` AUTO_INCREMENT = 4294967295;
Error Code: 1062. Duplicate entry '4294967295' for key 'PRIMARY',INT已经达到最大值,此时仍需要插入数据,就需要将字段的数据类型改为 BIGINT
ALTER TABLE `test`.`test` CHANGE COLUMN `id` `id` BIGINT UNSIGNED NOT NULL ;
BIGINT[(M)] [UNSIGNED] [ZEROFILL] M默认为 20 大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。
GB2312 占用两个字节,UTF-8 占用三个字节,utf8mb4 占用4个字节。如果是大系统不建议使用 utf8mb4,他会增加磁盘的开销。
建议这样使用,数据库默认是 utf8,表也是 utf8,在需要存储表情符号是使用 utf8mb4
CREATE SCHEMA `netkiller_schema` DEFAULT CHARACTER SET utf8 ; CREATE TABLE `netkiller_table` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, `nickname` varchar(45) CHARACTER SET utf8mb4 DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id_UNIQUE` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
上面表中 name 存储姓名没有只有文字所以使用 utf8, nickname 昵称字段允许使用各种符号,所以使用 utf8mb4。
CREATE TABLE `test`.`table_utf8` ( `name` VARCHAR(10) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NOT NULL); CREATE TABLE `test`.`table_utf8mb4` ( `name` VARCHAR(10) CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci' NOT NULL);