MySQL的字段属性,以及存储引擎和字符集

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、字段属性

1.1  zerofill  填充0

1.2  primary key  主键

1.3  auto_increment

1.4  not null

1.5  foreign key  外键

1.6  comment  

1.7  default  默认值

1.8  unique

2、engine 存储引擎

 3、字符集


1、字段属性

1.1  zerofill  填充0

        影响数字的显示方式:如果一个数字的宽度小于所允许的最大宽度,这个值前面会用0填充。如果声明了zerofill,该列会自动设为unsigned。

1.2  primary key  主键

        具有主键约束的列不允许有null值,并且不允许有重复值。Primary key = not null + unique
        主键:用来唯一的标示表中的每一行,其类型一般为整型或者字符串。
        每个表最多只允许一个主键。主键名总是PRIMARY。

        建立主键的好处:
                方便查找,在查询数据的时候,先查询索引,然后根据索引去查询数据,速度会非常快
        索引的作用:就是在查询数据的时候可以提速,没有索引就是全表扫描。

root@hunan 14:32  mysql>create table width(id int(4) zerofill primary key,name varchar(10));
Query OK, 0 rows affected (0.01 sec)

root@hunan 14:38  mysql>desc width;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type                     | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id    | int(4) unsigned zerofill | NO   | PRI | NULL    |       |
| name  | varchar(10)              | YES  |     | NULL    |       |
+-------+--------------------------+------+-----+---------+-------+
2 rows in set (0.11 sec)

root@hunan 14:38  mysql>insert into width(id,name) values(1,'cali'),(2,'xiaoxiao');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@hunan 14:39  mysql>select * from width;
+------+----------+
| id   | name     |
+------+----------+
| 0001 | cali     |
| 0002 | xiaoxiao |
+------+----------+
2 rows in set (0.00 sec)

root@hunan 14:39  mysql>insert into width(id,name) values(1,'cali'),(2,'xiaoxiao');
ERROR 1062 (23000): Duplicate entry '0001' for key 'PRIMARY'
root@hunan 14:40  mysql>insert into width(id,name) values(3,'cali'),(4,'xiaoxiao');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@hunan 14:41  mysql>select * from width;
+------+----------+
| id   | name     |
+------+----------+
| 0001 | cali     |
| 0002 | xiaoxiao |
| 0003 | cali     |
| 0004 | xiaoxiao |
+------+----------+

         一个表内可以建立两个主键:

root@hunan 16:31  mysql>create table user(id int,name varchar(10),primary key(id,name));
Query OK, 0 rows affected (0.08 sec)

root@hunan 16:32  mysql>insert into user(id,name) value(1,'xixi'),(2,'xixi');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

1.3  auto_increment

        在上一个基础上自增,默认的起始值是1,步长(偏移量)是1,适合整数类型的不是适合字符串类型。

       只适应于整数类型。一个表中只有一个列可以是自动增长的。

root@hunan 14:50  mysql>insert into t1 values(5,'xiaoxiao'),(9,'jiaojiao');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@hunan 14:52  mysql>select * from t1;
+----+----------+
| id | name     |
+----+----------+
|  1 | xiaoxiao |
|  2 | jiaojiao |
|  5 | xiaoxiao |
|  9 | jiaojiao |
+----+----------+
4 rows in set (0.00 sec)

root@hunan 14:52  mysql>insert into t1(name) values('xixi');
Query OK, 1 row affected (0.00 sec)

root@hunan 14:53  mysql>select * from t1;
+----+----------+
| id | name     |
+----+----------+
|  1 | xiaoxiao |
|  2 | jiaojiao |
|  5 | xiaoxiao |
|  9 | jiaojiao |
| 10 | xixi     |
+----+----------+
5 rows in set (0.00 sec)

1.4  not null

        不能为空,定义了not null的字段在插入数据的时候不能为空。

1.5  foreign key  外键

         外键   (FK)   是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键,一张表中可以定义多个外键。外键列默认可以给null值。

        按照定义,外键必须引用一个主键或者唯一键。引用的主键一般在另外一张表中,也可以是本表的主键。后一种情况通常称为“自引用”。

        父子表的概念:外键所在的表叫做子表,外键所引用的主键所在的表叫做父表。注意,父子表是相对而言的,表a可以是表b的子表,但同时也可以是表c的父表。

        举个例子,A表的主键到B表里面做一个字段,这个字段就是外键,并且B表里面会引用A表里面的数据,并且B表受限与A表。A是主表,B为子表。

        外键的好处: 直接引用别的表里的字段,自己的表里就不需要再创建相同的数据了,可以避免数据的冗余。

        外键的缺点:产生临时表并进行关联,消耗大量的内存和CPU。  

root@san 11:58  sc-mysql>select id,name,dname from emp join dept using(deptid);
+----+--------+-----------+
| id | name   | dname     |
+----+--------+-----------+
|  1 | 张三   | 市场部    |
|  2 | 李四   | 市场部    |
+----+--------+-----------+
2 rows in set (0.00 sec)

root@san 12:00  sc-mysql>select id,name,emp.deptid,dname from emp, dept where  emp.deptid=dept.deptid;
+----+--------+--------+-----------+
| id | name   | deptid | dname     |
+----+--------+--------+-----------+
|  1 | 张三   |     10 | 市场部    |
|  2 | 李四   |     10 | 市场部    |
+----+--------+--------+-----------+
2 rows in set (0.00 sec)

1.6  comment  

        用来给列添加注释。最多255个字符。注释会保存到数据字典中。

root@hunan 15:55  mysql>create table xixi(id int primary key comment '编号',name varchar(20) comment '姓名');
Query OK, 0 rows affected (0.04 sec)

root@hunan 15:57  mysql>show create table xixi \G'
*************************** 1. row ***************************
       Table: xixi
Create Table: CREATE TABLE `xixi` (
  `id` int(11) NOT NULL COMMENT '编号',
  `name` varchar(20) DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1.7  default  默认值

        设定了值就用设定了的值,没有设定,就用默认的值。

root@hunan 15:53  mysql>create table grade(id int primary key,grade int default 60);
Query OK, 0 rows affected (0.04 sec)

root@hunan 15:53  mysql>desc grade;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
| grade | int(11) | YES  |     | 60      |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

root@hunan 15:53  mysql>insert into grade(id,grade) values(1,90);
Query OK, 1 row affected (0.00 sec)

root@hunan 15:54  mysql>insert into grade(id) values(2);
Query OK, 1 row affected (0.00 sec)

root@hunan 15:54  mysql>select * from grade;
+----+-------+
| id | grade |
+----+-------+
|  1 |    90 |
|  2 |    60 |
+----+-------+
2 rows in set (0.00 sec)

1.8  unique

        唯一性,允许为null,null可以出现很多次,空值只能出现一次,字符串为空'',单引号或者双引号里没有任何内容。

        null值空值的区别:
        真空和空气的区别,null值是真的是什么都没有。

root@hunan 16:05  mysql>create table yuan(id int primary key,name varchar(10) unique);
Query OK, 0 rows affected (1.04 sec)

root@hunan 16:24  mysql>desc yuan;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

root@hunan 16:24  mysql>insert into yuan(id, name) values(1,'yuan');
Query OK, 1 row affected (0.01 sec)

root@hunan 16:24  mysql>insert into yuan(id, name) values(2,'yuan');
ERROR 1062 (23000): Duplicate entry 'yuan' for key 'name'
root@hunan 16:24  mysql>insert into yuan(id, name) values(2,'yuan2');
Query OK, 1 row affected (0.00 sec)

root@hunan 16:25  mysql>select * from yuan;
+----+-------+
| id | name  |
+----+-------+
|  1 | yuan  |
|  2 | yuan2 |
+----+-------+
2 rows in set (0.00 sec)

root@hunan 16:25  mysql>insert into yuan(id, name) values(3,null);
Query OK, 1 row affected (0.04 sec)

root@hunan 16:25  mysql>insert into yuan(id, name) values(4,null);
Query OK, 1 row affected (0.00 sec)

root@hunan 16:25  mysql>insert into yuan(id, name) values(5,null);
Query OK, 1 row affected (0.00 sec)

root@hunan 16:25  mysql>select * from yuan;
+----+-------+
| id | name  |
+----+-------+
|  3 | NULL  |
|  4 | NULL  |
|  5 | NULL  |
|  1 | yuan  |
|  2 | yuan2 |
+----+-------+
5 rows in set (0.00 sec)

root@hunan 16:26  mysql>insert into yuan(id, name) values(6,'');
Query OK, 1 row affected (0.29 sec)

root@hunan 16:26  mysql>insert into yuan(id, name) values(7,'');
ERROR 1062 (23000): Duplicate entry '' for key 'name'

2、engine 存储引擎

        指定表使用的存储引擎。存储引擎决定了数据如何存储以及如何访问,还有事务如何处理。MySQL允许对每个表使用不同的存储引擎。如果在create table语句中没有指定存储引擎,则使用默认的存储引擎。

        几种存储引擎:
    1、innodb
        默认的存储引擎
    2、myisam
    3、csv   

        csv文件:是一个文本我文件,里面的字段以逗号‘,’进行分割,可以用来做数据存储的文件,数据分析,日志文件--》数据清洗--》csv文件--》数据库
    4、memory  
        放在内存中的,适合临时存储的。

        在MySQL内可以使用来查看engines。

show engines;

        innodb有什么特性:
            innodb存储引擎支持事物、行锁、外键。

 3、字符集

        字符集  character set,各种各样的字符集合。

        可以使用 show character set; 来查询你的mysql支持哪些字符集。

        SHOW variables like '%CHARACTER%';  来查看你正在使用哪些字符集

root@(none) 09:17  mysql>show character set;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+

        继承问题:

        比如说mysql-server使用的是utf-8,那么在mysql-server里面建立的数据库和表,都会使用utf-8。

        为什么英文占一个字节,中文占3字节:
        英文字母+数字+标点符号 < 256,2^8 = 256,占8位刚好一字节,8位一字节。中文同理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值