mysql命令行使用

  • 命令的结束符,用“;”或者“\g”结束

  • 通过help;或者\h命令来显示帮助内容,通过\c命令来清除命令行buffer

实践了下\c的用途类似于取消命令的执行.但不能是在;号后面.例如

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.10    |
+-----------+
1 row in set (0.02 sec)

mysql> select version()\c
mysql> select version();\c
+-----------+
| version() |
+-----------+
| 5.7.10    |
+-----------+
1 row in set (0.01 sec)

mysql>

内建的数据库及用途

  • information_schema:主要存储了系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等
  • mysql: 主要是与MySQL用户及权限相关的信息.
  • performance_schema: 与性能相关的统计信息
  • sys: (MySQL 5.7.7 and higher includes the sys schema). 可以看成是对 performance_schema的各种友好的视图. 帮助DBA和开发人员更好的诊断性能等问题.
  • test: 测试数据库(5.7里已经没有了.)

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    

定义表时的注意

auto_increment

只能用于整数类型, 并且一张表中最多只能有一个 auto_increment 列. 而且auto_increment的列还应该是主键或者是唯一索引列. 如果是在唯一索引上定义的auto_increment那它自动就是NOT NULL的了.

mysql> create table t_i (id int auto_increment unique, name varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t_i;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                  |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_i   | CREATE TABLE `t_i` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

如果插入的是null或者0, auto_increment 实际会插入是增长后的值 .

特别注意 : 该强制的默认值是保留在内存中的,如果该值在使用之前数据库重新启动,那么这个强制的默认值就会丢失,就需要在数据库启动以后重新设置。

可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。如果一次插入了多条记录,那么返回的是第一条记录使用的自动增长值. 例子:

mysql> create table t (id int primary key auto_increment, id2 int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t (id2) values (1), (2), (3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.01 sec)

auto_increment 在MyISAM与InnoDB的区别:

对于InnoDB, 自增长列必须是索引. 如果是组合索引, 也必须是组合索引的第一列. 对于MyISAM, 自增长列可以是组合索引的其他列.

mysql> create table t_my  (id int,  id2 int auto_increment, unique(id, id2)) engine=myisam;
Query OK, 0 rows affected (0.02 sec)

mysql> create table t_inno  (id int,  id2 int auto_increment, unique(id, id2)) engine=innodb;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

定点数

它在MySQL内部是使用字符串保存的. 所以比浮点更精确, 适合用来保存货币等精度高的数据.

注意: 浮点数和定点数都可以用类型名称后加“(M,D)”的方式来进行表示,“(M,D)”表示该值一共显示M位数字(整数位+小数位),其中D位位于小数点后面,M和D又称为精度和标度。

timestamp

MySQL旧版本规定TIMESTAMP类型字段只能有一列的默认值为current_timestamp.但我在MySQL 5.7.10版本里发现, 它可以定义多个current_timestamp.如:

mysql> create table hello11 (t timestamp not null default current_timestamp, t1 timestamp not null default current_timestamp);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into hello11 values (null,null);
Query OK, 1 row affected (0.01 sec)

mysql> select * from hello11;
+---------------------+---------------------+
| t                   | t1                  |
+---------------------+---------------------+
| 2016-03-05 22:34:24 | 2016-03-05 22:34:24 |
+---------------------+---------------------+
1 row in set (0.00 sec)

timestamp 还有个重要的特点, 就是与时间相关. 当插入日期时,会先转换为本地时区后存放;而从数据库里面取出时,也同样需要将日期转换为本地时区后显示。这样,两个不同时区的用户看到的同一个日期可能是不一样的

mysql> select * from hello11;
+---------------------+---------------------+
| t                   | t1                  |
+---------------------+---------------------+
| 2016-03-05 22:34:24 | 2016-03-05 22:34:24 |
+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone='+9:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select * from hello11;
+---------------------+---------------------+
| t                   | t1                  |
+---------------------+---------------------+
| 2016-03-05 23:34:24 | 2016-03-05 23:34:24 |
+---------------------+---------------------+
1 row in set (0.00 sec)

而且timestamp的范围是: '1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC,可以通过以下得知:

mysql> ? timestamp;
Name: 'TIMESTAMP'
Description:
TIMESTAMP[(fsp)]

A timestamp. The range is '1970-01-01 00:00:01.000000' UTC to
'2038-01-19 03:14:07.999999' UTC.

char, varchar

char会删除最后的空格, 而varchar不会.

mysql> create table t_char (n char(4), nn varchar(4));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t_char values ('he ', 'he ');
Query OK, 1 row affected (0.01 sec)

mysql> select length(n), length(nn) from t_char;
+-----------+------------+
| length(n) | length(nn) |
+-----------+------------+
|         2 |          3 |
+-----------+------------+
1 row in set (0.00 sec)

MyISAM存储引擎:建议使用固定长度的数据列代替可变长度的数据列。 MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用 CHAR 或VARCHAR列都没有关系。两者都是作为CHAR类型处理。 InnoDB存储引擎:建议使用VARCHAR类型。对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列性能要好。因而,主要的性能因素是数据行使用的存储总量

enum

mysql> create table t (gender enum('M', 'F'));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t values ('M'), ('1'), ('f') , (null);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from t;
+--------+
| gender |
+--------+
| M      |
| M      |
| F      |
| NULL   |
+--------+
4 rows in set (0.00 sec)

从上面的例子中,可以看出ENUM类型是忽略大小写的,在存储“M”、“f”时将它们都转成了大写,还可以看出对于插入不在 ENUM 指定范围内的值时,并没有返回警告,而是插入了enum(’M’,‘F’)的第一个值“M”,这点用户在使用时要特别注意