2021-01-13

登陆mysql

[root@cong11 ~]# mysql -uroot -p123456
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
±-------------------+
4 rows in set (0.00 sec)
Mysql的错误日志文件(error_log)
在mysql数据库中,错误日志功能是默认开启的。默认情况下,错误日志存储在mysql数据库的数据目录中。
错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error参数来定义的,其中log-error是定义是否启用错误日志的功能和错误日志的存储位置,默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、在从服务器上启动服务器进程时产生的信息。
查看mysql错误日志的定义信息
mysql> show global variables like ‘%log_error%’;

其中
log_error定义为错误日志文件路径。
log_error_verbosity:
The MySQL error log has received some attention in MySQL 5.7, with a new setting called log_error_verbosity。There are three possible values, as documented in the manual:
Verbosity Value Message Types Logged
1 Errors only
2 Errors and warnings
3 Errors, warnings, and notes (default)
更改错误日志位置可以使用log-error来设置形式如下
#vi /etc/my.cnf
log-error = /data/mysql/log/mysqld.log
查看mysql错误日志:可以使用tail或grep、cat等命令查看。
为了方便维护需要,有时候会希望将错误日志中的内容做备份并重新开始记录,这时候
就可以利用MySQL 的FLUSH LOGS 命令来告诉MySQL 备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。
删除错误日志:
在mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法如下:mysqladmin –u root –p flush-logs也可以登录mysql数据库中使用FLUSH LOGS语句来开启新的错误日志。
在mysql5.5.7之后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的:方式如下:

Mysql语句
Mysql数据库的操作
查看数据库
查看数据库有3中方式
第一种直接进入数据库查看
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
±-------------------+
4 rows in set (0.00 sec)
1:information_schema这个数据库保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型,访问权限等。 [ˈskimə]
2:performance_schema 这是MySQL5.5新增的一个性能优化的引擎:命名PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。MySQL用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表,
3:mysql库是系统库,里面保存有账户信息,权限信息等。
4:mysql5.7增加了sys 系统数据库,sys数据库里面包含了一系列的存储过程、自定义函数以及视图来帮助我们快速的了解系统的元数据信息,元数据是关于数据信息的数据,如数据库名或表名,列的数据类型,或访问权限等。
以行的方式显示
mysql> show databases \G #以行的方式显示
*************************** 1. row ***************************
Database: information_schema
*************************** 2. row ***************************
Database: mysql
*************************** 3. row ***************************
Database: performance_schema
*************************** 4. row ***************************
Database: sys
4 rows in set (0.00 sec)
在shell中查看
mysql -e后面直接跟sql语句,这种方式一般是在shell脚本中用到
[root@cong11 ~]# mysql -e ‘show databases’ -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
±-------------------+
创建数据库
语法
create database 数据库名;
创建数据库注意事项
1、在文件系统中,MySQL的数据存储区以目录方式表示MySQL数据库。因此,上面命令中的数据库名字必须与操作系统的约束的目录名字一致。例如不允许文件和目录名中有,/,:,*,?,”,<,>,|这些特殊符号,在MySQL数据库名字中这些字母会被自动删除。
[root@cong11 ~]# ls /data/mysql/data/
auto.cnf ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 ibtmp1 mysql performance_schema sys
2、数据库的名字不能超过64个字符,包含特殊字符的名字或者是全部由数字或保留字组成的名字必须用反引号``括起来。
3、数据库不能重名
创建一个数据库
mysql> create database HA;
Query OK, 1 row affected (0.00 sec)
mysql> create database HA-test;
Query OK, 1 row affected (0.00 sec)
查看数据库
mysql> show databases;

查看数据库目录
我们可以去数据目录下查看新创建的数据库目录
[root@cong11 ~]# ls /data/mysql/data/

注:建议数据名不要包含特殊符号或是纯数字的。
选择要操作的数据库
我们需要使用哪个数据库,就用use进行选择,后面的操作默认都是在被选择的数据库中进行操作。
mysql> use HA-test;
Database changed
查看自己在所处的位置
mysql> select database();

在命令行选择默认的数据库
我们也可以在命令行直接选择我们需要进入的数据库
[root@cong11 ~]# mysql -uroot -p123456 HA-test
mysql> select now(),user(),database();

删除数据库
命令
mysql> drop database HA-test;
Query OK, 0 rows affected (0.01 sec)
移动数据库目录
上面删除数据库的方法,不安全,删除完了,无法恢复,在工作中我们可以移动数据库目录到别的地方,防止删除数据库了想要恢复。
[root@cong11 ~]# mkdir /db_backup
[root@cong11 ~]# mv /data/mysql/data/HA /db_backup
[root@cong11 ~]# mysql -uroot -p123456
mysql> show databases; #发现HA数据库已经不见了

使用IF EXISTS 子句以避免删除不存在的数据库时出现的MySQL错误信息 exists [ɪɡˈzɪst]
mysql> drop database if exists HA-test; #如果存在则删除
Query OK, 0 rows affected, 1 warning (0.00 sec)
也可以在创建数据库时使用
mysql> create database if not exists HA; #if not exists 如果不存在则创建
Query OK, 1 row affected (0.00 sec)
关于表的操作
创建表create:
语法:create table 表名 (字段名 类型, 字段名 类型, 字段名 类型);
mysql> use HA;
Database changed
mysql> create table student(id int(20),name char(40),age int);
Query OK, 0 rows affected (0.02 sec)
查看表相关信息
mysql> use HA;
Database changed
mysql> show tables;

查看表结构
使用desc 命令来查看表的结构
mysql> desc student;

还可以用以下命令查看表结构,会一种就可以。
mysql> explain mysql.user;
mysql> show columns from mysql.user;
mysql> show fields from mysql.user;
mysql> show columns from mysql.user like ‘%user’;
查看创建表执行了哪些命令:
mysql> show create table student \G

指定默认存储引擎和字符集
新建一个表,指定默认的存储引擎为InnoDB,编码为utf8
mysql> create table student2(id int(20),name char(40),age int) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
mysql> show create table student2 \G

删除表
mysql> drop table student2;
Query OK, 0 rows affected (0.01 sec)
禁止预读表信息
没有禁止前转换数据库会有提示信息
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with –A
解决这个问题可以在登陆mysql的时候添加参数-A
[root@cong11 ~]# mysql -uroot -p123456 -A
mysql> use mysql;
Database changed #发现没有提示信息了
修改表名称 alter
语法:alter table 表名 rename 新表名;
修改HA库中student表名为students
mysql> alter table student rename students;
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;

修改表中的字段类型
语法:alter table 表名 modify 要修改的字段名 要修改的类型;
查看students表结构
mysql> desc students;

修改字段id 的int(20)字段类型为int(10)
mysql> alter table students modify id int(10);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看修改完的students表结构
mysql> desc students;

修改表中的字段类型和字段名称
语法:alter table 表名 change 原字段名 新字段名 新字段类型;
mysql> alter table students change name stname char(20);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students;

注:CHANGE 和MODIFY的区别:
CHANGE 对列进行重命名和更改列的类型,需给定旧的列名称和新的列名称、当前的类型。 MODIFY 可以改变列的类型,此时不需要重命名(不需给定新的列名称)
在表中添加字段:
语法:alter table 表名 add字段名 字段类型;
enum #枚举类型,比如性别,只能在男女选择,是男非女,是女非男
mysql> alter table students add sex enum(‘M’,‘W’);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students;

在表中指定位置添加字段
在第一列添加一个字段
mysql> alter table students add uid int(10) first;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students;

在age后面添加一个address字段
mysql> alter table students add address char(40) after age;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

删除表中字段
语法:alter table 表名 drop 字段名 ;
mysql> alter table students drop address;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc students;
发现表中address字段不见了

关于表中记录的操作
插入<记录>INSERT
INSERT INTO 语句用于向表中插入新的行。
语法:insert into 表名values (字段值1,字段值2, 字段值3);
插入记录时values所指定的值要和表中字段的个数、顺序以及类型要一一对应。
先删除students表,再创建
mysql> drop tables students;
Query OK, 0 rows affected (0.01 sec)
mysql> create table students(id int(20),name char(40),age int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into students values(1,‘zhangs’,21);
Query OK, 1 row affected (0.01 sec)
同时插入多条记录
mysql> insert into students values(2,‘lis’,24),(3,‘wange’,26);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
分开插入表记录
我们也可以指定所要插入数据的字段:
语法:
INSERT INTO table_name (字段1, 字段2,…) VALUES (字段值1, 字段值2,…)
例如:向students表中的id,name字段插入数据
mysql> insert into students (id,name)values(4,‘hangl’);
Query OK, 1 row affected (0.00 sec)
查询表中记录select
SELECT 语句用于从数据库表中读取数据。
语法:
select * from 表名; # *号表示表中所有的字段
查询student表中所有记录
mysql> select * from students;
当表中记录比较多时可以使用\G查看
mysql> select * from student\G

只查询表中某个字段或某些字段的内容
mysql> select name from students;

mysql> select id,name from students;

查看别的数据库的表或者不在本数据库上进行查看
语法:SELECT 字段 FROM 数据库名.表名;
效果等同于先使用use数据库,然后再看看表内容
mysql> select * from HA.students;

删除表中的记录
DELETE语句用于删除表中的记录。
语法:
DELETE FROM table_name WHERE some_column=some_value;
请注意 SQL DELETE 语句中的 WHERE 子句!
WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!
删除students表中id为3的行
mysql> delete from students where id=3;
Query OK, 1 row affected (0.00 sec)
mysql> select * from students; #发现表中id为3的记录不见了
±-----±-------±-----+
| id | name | age |
±-----±-------±-----+
| 1 | zhangs | 21 |
| 2 | lis | 24 |
| 4 | hangl | NULL |
±-----±-------±-----+
3 rows in set (0.00 sec)
删除age为空的行
mysql> delete from students where age is null;
Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
±-----±-------±-----+
| id | name | age |
±-----±-------±-----+
| 1 | zhangs | 21 |
| 2 | lis | 24 |
±-----±-------±-----+
2 rows in set (0.00 sec)
更新记录
update 语句用于修改表中的数据。
语法:
UPDATE table_name
SET column1=value1,column2=value2,…
WHERE some_column=some_value;
请注意 SQL UPDATE 语句中的 WHERE 子句!
WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句,所有的记录都将被更新!
把表中id为2的记录age更新为25
mysql> update students set age=25 where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from students;
±-----±-------±-----+
| id | name | age |
±-----±-------±-----+
| 1 | zhangs | 21 |
| 2 | lis | 25 |
±-----±-------±-----+
2 rows in set (0.01 sec)
把表中所有的id都更新为2
mysql> update students set id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 2 Changed: 1 Warnings: 0
mysql> select * from students;

同时更新多个字段的值,请使用逗号隔开
mysql> update students set id=1,name=‘zhangsan’ where age=21;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from students;

SQL条件查询语句
首先往表中插入一些数据
mysql> insert into students values(2,‘lisi’,23),(3,‘wange’,26),(4,‘libin’,28),(5,‘tom’,30),(6,‘sorry’,24);
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
查询STUDENTS表中的NAME,AGE
mysql> select name,age from students;

可以看到表中有重复的数据lisi
去重复查询distinct
mysql> select distinct name,age from students; #可以看见重复的行不在了

使用AND和OR进行多条件查询
查询表中id>3和age>25的记录
mysql> select id,name,age from students where id>3 and age>25;

查询表中id>3 或者 age>25的记录
mysql> select id,name,age from students where id>3 or age>25;

MYSQL区分大小写查询binary
Mysql默认查询是不区分大小写的
BINARY是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写。
插入大写记录
mysql> insert into students values(7,‘KILL’,32),(8,‘kill’,32);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select name from students where name=‘kill’;

区分大小写查询
mysql> select * from students where binary name=‘kill’;

mysql> select * from students where binary name=‘KILL’;

MYSQL查询排序
语法:select字段1,字段2 from 表名order by 字段名;
默认为升序asc
mysql> select id from students order by id asc;

降序desc
mysql> select id from students order by id desc;

关于MYSQL命令帮助
help会告诉我们很多使用方法和信息
mysql> help show;

mysql> help select;

Mysql的数据类型
MySQL数据类型
数据类型是数据的一种属性,其可以决定数据的存储格式,有效范围和相应的限制。mysql的数据类型包括整数类型,浮点数类型,日期和时间类型,字符串类型和二进制类型。
为什么定义数据类型?为什么要数据分类?
1、使系统能够根据数据类型来操作数据。
2、预防数据运算时出错。
例:通过强大的数据分类把每个类型与特定的行为联系在一起,执行这些行为时,数据分类可以预防错误。最长见的错误是字符与数字相加。
3、更有效的利用空间。数据分类,可以使用最少的存储来存放数据,同时提高性能。
数据类型解释
MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型

日期和时间类型

字符串类型

在MySQL中支持的5个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。这些类型在很大程度是相同的,只有他们存储的值的大小是不同的。
使用举例:
如果用来保存用户的年龄 (举例来说,数据库中保存年龄是不可取的),用 TINYINT 就够了;
如果要用作一个肯定不会超过 16000000 行的表的 AUTO_INCREMENT 的 IDENTIFY 字段,当然用 MEDIUMINT 不用 INT,试想,每行节约一个字节,16000000 行可以节约 10 兆多。
注意:再MySQL5.7中,插入不符合数据类型的数据字段,服务被报错,不允许插入。
数据类型的测试
mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)
mysql> use test_db;
Database changed
测试取值范围
mysql> create table kdata ( fti tinyint,fsi smallint,fmi mediumint ,fi int, fbi bigint);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into kdata values (123456789,123456789,123456789,123456789,123456789);
ERROR 1264 (22003): Out of range value for column ‘fti’ at row 1
错误1264(22003):第1行“fti”列的值超出范围,对于不符合的数据报错
mysql> insert into kdata values (123,12345,1234567,123456789,123456789);
Query OK, 1 row affected (0.00 sec)
mysql> select * from kdata;

插入错误的值
mysql> create table kdata2 (age int) ;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into kdata2 values (‘hello’ );
ERROR 1366 (HY000): Incorrect integer value: ‘hello’ for column ‘age’ at row 1
int类型修饰符
unsigned 无符号整数,修饰符: 规定字段只能保存正的数据。它可以增大这个字段的正数支持的范围。
zerofill 修饰符: 规定0(不是空格 ) 填补输出的值。 使用这个值可以防止 mysql存储负值。
unsgined和zerofill使用方法
mysql> create table kdata3 (fi int,fiu int unsigned, fiz int zerofill,fiuz int unsigned zerofill);
Query OK, 0 rows affected (0.01 sec)
查看表结构:
mysql> desc kdata3;

注意:发现fiz和fiuz字段值是一样的。
查看原因:
mysql> show create table kdata3;

测试:
mysql> insert into kdata3 values (10,10,10,10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into kdata3 values (-10,-10,-10,-10);
ERROR 1264 (22003): Out of range value for column ‘fiu’ at row 1
mysql> insert into kdata3 values (-10,10,-10,-10);
ERROR 1264 (22003): Out of range value for column ‘fiz’ at row 1
mysql> insert into kdata3 values (-10,10,100,-10);
ERROR 1264 (22003): Out of range value for column ‘fiuz’ at row 1
mysql> insert into kdata3 values (-10,10,100,1000);
Query OK, 1 row affected (0.00 sec)
可以看见在fiu,fiz和fiuz中存储负数,直接报错,因为unsgined和zerofill不允许使用负值,zerofill会自动添加unsgined,并且在数值前面补0

注意:
int(M) 在 integer 数据类型中,M 表示最大显示宽度。
在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。其实,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
如int的值为10
int(10)显示结果为0000000010
int(3)显示结果为010
就是显示的长度不一样而已 都是占用四个字节的空间,可以使用的空间也一样。当我们生成固定长度的序列号时,可以使用zerofill。
如:卡号,默认使用空格填充,不方便显示出来。现在以0来填充,查看一下显示的内容
mysql> create table azerofill (fi int(3), fiz int(3) zerofill,fiuz int(4) unsigned zerofill);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into azerofill values(11,11,11);
Query OK, 1 row affected (0.00 sec)
mysql> select * from azerofill;
±-----±-----±-----+
| fi | fiz | fiuz |
±-----±-----±-----+
| 11 | 011 | 0011 |
±-----±-----±-----+
1 row in set (0.00 sec)
测试,插入超过显示范围的值。
mysql> insert into azerofill values(123456,123456,123456);
Query OK, 1 row affected (0.01 sec)

mysql> select * from azerofill;

发现位数不够用0补齐,超过设定值,正常显示。
浮点型数据类型
float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;
MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)表示总长度是7位,小数点后面的长度是4,可显示为999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。
float:单精度浮点型,占字节数为4,用32位二进制描述,有符号是7个有效位,无符号是8个有效位
double:双精度浮点型,占字节数为8,用64位二进制描述,有符号是15个有效位,无符号是16个有效位
decimal:数字型,用128位二进制描述,不存在精度损失,常用于银行帐目计算。(28个有效位)
解释:单精度和双精度
精度是指计算机表达小数近似值的一种方式,单精度32位二进制,4个字节;双精度64位二进制,8个字节。
float数值类型
例如:float(3,1) :表示此字段有效位数为3位,小数点后面1位数字。
小数点后超过1位,mysql自动给四舍五入。
例如:
mysql> use db1;
mysql> create table kdata6(test float(3,1)) engine=innodb default charset=utf8;
mysql> insert into kdata6 values (123.455);
ERROR 1264 (22003): Out of range value for column ‘test’ at row 1
mysql> insert into kdata6 values (23.5);
Query OK, 1 row affected (0.00 sec)
mysql> insert into kdata6 values (3.455);
Query OK, 1 row affected (0.00 sec)
mysql> insert into kdata6 values (23.455);
Query OK, 1 row affected (0.00 sec)
mysql> select * from kdata6;

发现整数+小数一共只能有3位,整数2位,小数1位,小数点后超过1位自动四舍五入。
存储精确的小数: double和decimal数值类型
decimal、double要比float存储小数更精确。
mysql> create table ckdata4(tf float(5,2),td double(5,2),tdc decimal(5,2));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into ckdata4 values(56.346,56.346,56.346);
Query OK, 1 row affected, 1 warning (0.01 sec)
注意:数据也插入成功,但是有一个警告提示:
mysql> select * from ckdata4;

mysql> create table ckdata6(tf float(10,2),td double(10,2),tdc decimal(10,2));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into ckdata6 values(1234567.89,1234567.89,1234567.89);
Query OK, 1 row affected (0.00 sec)
mysql> select * from ckdata6;

这里丢失数据的原因是因为单精度类型float和双精度类型double在计算机中存储的时候,由于计算机只能存储二进制,所以浮点型数据在存储的时候,必须转化成二进制。我们知道对于float类型的数据,只分配了32位的存储空间,对于double类型值分配了64位,但是并不是所有的小数都能转成32位或者64位的二进制形式,如果超过了,就会出现截断,这就是误差的来源。
针对float情况,至少我们可以得出结论:

  1. 如果一个float型数据转成二进制后的第32位之后都是0,那么数据是准的
  2. 如果一个float型数据转成二进制后的第32位之后不全为0,则数据就会存在误差
    float和double类型的区别和误差来源。但是decimal类型是MySQL官方唯一指定能精确存储的类型,也是DBA强烈推荐和金钱相关的类型都要存储为decimal类型。
    选择float或者double或者decimal有时候也要看场景,比如我们可以用double存储一个小商铺的季度营业额(几千万),单独用double存储的时候没有问题,当多个季度,多个年份,算总营业额时,就可能出现问题,再也算不出一个准确的答案。所以,如果考虑情况没那么有把握的情况下,推荐使用decimal。
    字符串类型
    char 和 varchar
    char
    char :后面括号中必须有数值,来确认字符串的范围。 大小范围 :0-255.
    char(10) ; 指定了一个长度为10的字符值。
    旧版本小于长度,空格自动补齐,大于长度 ,自动截短。
    新版本超过长度自动报错。
    mysql> create table kdata8 (aaa char(10));
    Query OK, 0 rows affected (0.01 sec)
    mysql> insert into kdata8 values (‘1234567890111’);
    ERROR 1406 (22001): Data too long for column ‘aaa’ at row 1
    mysql> insert into kdata8 values (‘abcdefghijklmn’);
    ERROR 1406 (22001): Data too long for column ‘aaa’ at row 1
    mysql> insert into kdata8 values (‘1234567890’);
    Query OK, 1 row affected (0.00 sec)
    mysql> insert into kdata8 values (‘abc’);
    Query OK, 1 row affected (0.01 sec)
    mysql> select * from kdata8;

binary 修饰符: 区分字符大小写
mysql> alter table kdata8 modify aaa char(10) binary;
Query OK, 4 rows affected (0.02 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> insert into kdata8 values (‘ABC’);
Query OK, 1 row affected (0.01 sec)

mysql> select * from kdata8 where aaa=‘abc’;

mysql> select * from kdata8 where aaa=‘ABC’;

varchar : 字符串可变长
在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字节。
mysql> create table kdata88 (aaa varchar(4));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into kdata88 values ("");
Query OK, 1 row affected (0.00 sec)
mysql> insert into kdata88 values (“ab”);
Query OK, 1 row affected (0.00 sec)
mysql> insert into kdata88 values (“abcd”);
Query OK, 1 row affected (0.01 sec)
mysql> insert into kdata88 values (“abcdefg”);
ERROR 1406 (22001): Data too long for column ‘aaa’ at row 1
超过长度自动报错,最大支持长度65535.
char和varchar区别
CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。
VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间。
VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。
varchar存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。
从空间上考虑,用varchar合适;从效率上考虑,用char合适。
字符串使用总结
1、VARCHAR型字段比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大时,这种内存和磁盘空间的节省会变得非常重要.
2、虽然VARCHAR使用起来较为灵活,但是从整个系统的性能角度来说,CHAR数据类型的处理速度更快,有时甚至可以超出VARCHAR处理速度的50%。
所以在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡。
日期和时间类型
date 日期
mysql> create table kdata10 (birthday date);
mysql> insert into kdata10 values (‘2018-01-23’) ,(20190304);
mysql> select * from kdata10;

time时间
mysql> create table kdata11(showtime time);
mysql> insert into kdata11 values (‘11:10:23’),(‘11:23’),(112456);
mysql> select * from kdata11;

Year
year : 00-69自动转为: 2000-2069 , 70-99自动转为1970-1999
mysql> create table kdata13 (test year);
mysql> insert into kdata13 values (2018),(04),(9),(69),(70);
mysql> select * from kdata13;

datatime 或 timestamp
datetime类型能保存的最大范围的值为1001年到9999年,精度为秒,它把日期和时间封装到格式为YYYY-MM-DD HH:MM:SS的整数中,与时区无关,使用8个字节的存储空间。
timestamp类型保存了从1970年1月1日(格林尼治时间)以来的秒数,它和linux的时间戳相同,只是用了4个字节的存储空间,因此它的范围比datetime的范围小了很多,只能表示从1970年到2038年,我们可以使用它提高空间利用率。
mysql> create table kdata14 ( f_datatime datetime,f_timestamp timestamp);
mysql> insert into kdata14 values (‘1999-11-12 23:23:45’,19991112232345);
mysql> select * from kdata14;

如果为空,直接报错:
mysql> mysql> insert into kdata14 values (now(),null);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘mysql> insert into kdata14 values (now(),null)’ at line 1
复合类型
它们字段的值,必须从预先定义好的字符串集合中选取。
ENUM(枚举):只能取一个,用于互斥。男人,女人。
set : 能取多个。
枚举
mysql> create table kdata16(sex enum(‘M’,‘F’));
mysql> insert into kdata16 values ( ‘M’),(‘m’),(‘F’),(‘yy’),(‘null’);
ERROR 1265 (01000): Data truncated for column ‘sex’ at row 4
填写不是M,F的数据会报错
mysql> insert into kdata16 values ( ‘M’),(‘m’),(‘F’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from kdata16;

Set
mysql> create table kdata17 ( type set(‘a’,‘b’,‘c’,‘d’,‘f’));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into kdata17 values (‘a’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into kdata17 values (‘a,b’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into kdata17 values (‘a,a,a,b’); #不能写重复选项,不然无效
Query OK, 1 row affected (0.00 sec)
mysql> select * from kdata17;

mysql> insert into kdata17 values (‘e’); #如果写不存在选项,直接报错
ERROR 1265 (01000): Data truncated for column ‘type’ at row 1
注意:set 类型: 最大包含64类项。在set中,相同的元素不能同时存在。
Msyql语句进阶
Mysql基础命令语句
修改数据表
添加字段:
alter table 表名 add 字段名 列类型 [not null|null][primary key][unique][auto_increment][default value]
alter table 表名 add 字段定义 after ar_id;
解释:
not null | null:非空约束(NOT NULL)可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。Null表示该列可以为空,用户在插入数据时如果没有指定值,该列用NULL填充。
default默认值:mysql默认值约束用来指定某列的默认值。如果某列设置了default默认值约束,用户在插入数据时如果没有指定值,则用默认值填充。
unique:唯一性约束,如果某列设置了unique唯一性约束,则该列的值是不能重复的。
auto_increment:设置数值型的列自动增长。AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。所谓自动增长字段,是指它们的值是系统指定,不需要插入。值从1开始,每增加一条记录,这个值就加1。
primary key:主键(PRIMARY KEY)”的完整称呼是“主键约束”。MySQL 主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行。通过它可以强制表的实体完整性(即表中没有重复的行)。
主键应该遵守下面的规则:
1.每个表只能定义一个主键。
2.主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行 案例,创建表t1
mysql> create table db01.t1(id int auto_increment primary key,name varchar(30) not null,sex enum(“M”,“F”) default “M”,phone_call char(11) default “11111111111”,id_card char(18) unique);
查看表结构

向表中插入数据
mysql> insert into db01.t1(name,sex,phone_call,id_card) values(‘lisi’,‘M’,‘13523415687’,‘520321200310101352’);
Query OK, 1 row affected (0.01 sec)
查询数据

继续插入数据
mysql> insert into db01.t1(name,sex,phone_call,id_card) values(‘lisi’,‘F’,‘13523415487’,‘520321200310101342’);
Query OK, 1 row affected (0.01 sec)
查询数据

继续插入数据
mysql> insert into db01.t1(name,sex,phone_call,id_card) values(‘zhangsan’,‘F’,‘13623415487’,‘520321200310101342’);
ERROR 1062 (23000): Duplicate entry ‘520321200310101342’ for key ‘id_card’
继续插入数据
mysql> insert into db01.t1(name,sex,phone_call,id_card) values(‘zhangsan’,‘F’,‘13623415487’,‘52032120031010134x’);
Query OK, 1 row affected (0.00 sec)
查询数据

删除字段:
alter table 表名 drop 字段名
修改字段:
alter table 表名 modify 字段名 字段新类型
完整修改字段:
alter table 表名 change 旧字段名称 新字段定义
修改表名称
alter table 表名 rename 新名字
删除表
drop table [if (not) exists] 表名;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值