MySQL数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。


1.数值类型

MySQL支持所有标准SQL数值数据类型。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。

类型 大小(字节) 范围(有符号) 范围(无符号)
TINYINT 1 (-128,127) (0,255)
SMALLINT 2 (-32 768,32 767) (0,65 535)
MEDIUMINT 3 (-2^23,2^23-1) (0,2^24-1)
INT 4 (-2^31,2^31-1) (0,2^32-1)
BIGINT 8 (-2^63,2^63-1) (0,2^64-1)
FLOAT[(M,D)] 4 M是数字总位数,D是小数点后面的位数。
DOUBLE[(M,D)] 8

2.日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小(字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS

3.字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

类型 大小(字节) 用途
CHAR 0-255 定长字符串
VARCHAR 0-65535 变长字符串
TINYBLOB 0-255 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 短文本字符串
BLOB 0-65 535 二进制形式的长文本数据
TEXT 0-65 535 长文本数据
MEDIUMBLOB 0-16 777 215 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 中等长度文本数据
LONGBLOB 0-4 294 967 295 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 极大文本数据

1-1 MySQL概述

MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司。

MySQL是一个开源的关系型数据库管理系统。

MySQL分为社区版和企业版。

1-3 启动与停止MySQL服务

  • 启动MySQL服务
1
net start MySQL
  • 关闭MySQL服务
1
net stop MySQL

1-4 MySQL登陆与退出

  • MySQL登陆
1
mysql 参数
参数 描述
-D, –database=name 打开指定数据库
–delimiter=name 指定分隔符
-h, –host=name 服务器名称
-p, –password[=name] 密码
-P, –port=# 端口号
–prompt=name 设置提示符
-u, –user=name 用户名
-V, –version 输出版本信息并且退出
  • MySQL退出
1
2
3
exit;
quit;
\q;

1-5 修改MySQL提示符

  • 连接客户端时通过参数指定

    1
    mysql -uroot -proot --prompt 提示符
  • 连接上客户端后,通过prompt命令修改

    1
    prompt 提示符
参数 描述
\D 完整的日期
\d 当前数据库
\h 服务器名称
\u 当前用户

1-6 MySQL常用命令以及语法规范

  • 显示当前服务器版本
1
SELECT VERSION();
  • 显示当前日期时间
1
SELECT NOW();
  • 显示当前用户
1
SELECT USER();
  • MySQL语句的规范

关键字与函数名称全部大写
数据库名称,表名称,字段名称全部小写
SQL语句必须以分号结尾

1-7 操作数据库

  • 创建数据库
1
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name
  • 查看数据库列表
1
SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr]
  • 查看警告
1
SHOW WARNINGS;
  • 查看建数据库语句
1
SHOW CREATE DATABASE db_name;
  • 修改数据库
1
2
ALTER {DATABASE | SCHEMA} [db_name]
[DEFAULT] CHARACTER SET [=] charset_name;
  • 删除数据库
1
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;
  • 打开数据库
1
USE db_name;
  • 查看打开的数据库
1
SELECT DATABASE();

1.TCP报文首部

TCP报文首部格式如下图所示

image

  • 序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
  • 确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701;
  • 确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
  • 同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
  • 终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;

2.TCP三次握手

  1. TCP客户进程向服务器发出连接请求报文,报文首部中的同步位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态
  2. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了 SYN-RCVD(同步收到)状态
  3. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入 ESTABLISHED(已建立连接)状态。当服务器收到客户端的确认后也进入 ESTABLISHED状态,此后双方就可以开始通信了。

image

3.TCP四次挥手

  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文
  3. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  4. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。

image

参考链接:

https://blog.csdn.net/qzcsu/article/details/72861891

2.2 运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。

image

2.2.1 程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。

在虚拟机的概念模型里(仅是概念模型,各种虚拟机的可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

2.2.2 Java虚拟机栈

虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

局部变量表存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double)、对象引用(reference类型,它不等同于对象本身,可能是一条指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

2.2.3 本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,他们之间的区别不过是虚拟机栈是为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

2.2.4 Java堆

所有的对象实例以及数组都要在堆上分配,但是随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。

Java堆还可以细分为:新生代和老年代;再细致一点的有:Eden空间、From Survivor空间、To Survivor空间等。

2.2.5 方法区

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2.2.6 运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

9.1 正则表达式介绍

正则表达式是用来匹配文本的特殊的串(字符集合)

9.2 使用MySQL正则表达式

正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据。

9.2.1 基本字符匹配

  • 检索列prod_name包含文本1000的所有行
1
2
3
4
SELECT prod_id, prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;

9.2.2 进行OR匹配

为搜索两个串之一(或者为这个串,或者为另一个串),使用|;

|为正则表达式的OR操作符;

使用|从功能上类似于在SELECT语句中使用OR语句,多个OR条件可并入单个正则表达式。

  • 检索列prod_name包含1000或2000的所有行
1
2
3
4
SELECT prod_id, prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;

9.2.3 匹配几个字符之一

可通过指定一组用[和]括起来的字符来完成匹配特定的字符

  • []是另一种形式的OR语句。正则表达式[123] Ton为[1|2|3] Ton的缩写,也可以使用后者
1
2
3
4
SELECT prod_id, prod_name
FROM products
WHERE prod_name REGEXP '[123] ton'
ORDER BY prod_name;
prod_id prod_name
ANV02 1 ton anvil
ANV03 2 ton anvil
  • 除非把字符|括在一个集合中,否则它将应用于整个串
1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1|2|3 ton'
ORDER BY prod_name;
prod_name
1 ton anvil
2 ton anvil
JetPack 1000
JetPack 2000
TNT (1 stick)
  • 字符集合也可以被否定,即,它们将匹配除指定字符外的任何东西。为否定一个字符集,在集合的开始处放置一个^即可。[^123]却匹配除这些字符外的任何东西。

9.2.4 匹配范围

集合可用来定义要匹配的一个或多个字符。

下面的集合将匹配数字0到9:[0123456789],等同于[0-9];[a-z]匹配任意字母字符。

  • 例子
1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] ton'
ORDER BY prod_name;

9.2.5 匹配特殊字符

正则表达式语言由具有特定含义的特殊字符构成。匹配这些字符.,[],|和-应该怎么办

为了匹配特殊字符,必须用\为前导。\-表示查找-,\.表示查找.

正则表达式内具有特殊意义的所有字符都必须以这种方式转义。这包括.、|、[]以及迄今为止使用过的其他特殊字符。

  • 找出包含.字符的值
1
2
3
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '.';
vend_name
Anvils R Us
LT Supplies
ACME
Furball Inc.
Jet Set
Jouets Et Ours
1
2
3
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.';
vend_name
Furball Inc.
#### 9.2.6 匹配字符类

预定义的字符集,称为字符类(character class)。(见MySQL必知必会p58)

9.2.7 匹配多个实例

  • 表9-3 重复元字符
元字符 说明
* 0个或多个匹配
+ 1个或多个匹配(等于{1,})
? 0个或1个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
  • [0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),\)匹配)。
1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([1-5] sticks?\\)'
ORDER BY prod_name;
prod_name
TNT (1 stick)
TNT (5 sticks)
  • [:digit:]匹配任意数字,{4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字。
1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;

9.2.8 定位符

  • 表9-4 定位元字符
元字符 说明
^ 文本的开始
$ 文本的结束
[[:<:]] 词的开始
[[:>:]] 词的结束
  • 找出以一个数(包括以小数点开始的数)开始的所有产品
1
2
3
4
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
prod_name
.5 ton anvil
1 ton anvil
2 ton anvil

8.1 LIKE操作符

8.1.1 百分号(%)通配符

最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数。

%代表搜索模式中给定位置的0个、1个或多个字符。

  • 找出所有以词jet起头的产品
1
2
3
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'jet%';
  • 找出所有以词包含文本anvil的产品
1
2
3
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '%anvil%';
  • 找出以s起头以e结尾的所有产品
1
2
3
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 's%e';

1.注意尾空格 在保存词anvil 时, 如果它后面有一个或多个空格, 则子句WHERE prod_name LIKE ‘%anvil’将不会匹配它们;

2.注意NULL 虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。

8.1.2 下划线(_)通配符

另一个有用的通配符是下划线(_)。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。

  • 以下划线(_)通配符检索数据
1
2
3
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil';
prod_id prod_name
ANV02 1 ton anvil
ANV03 2 ton anvil
  • 以百分号(%)通配符检索数据
1
2
3
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '% ton anvil';
prod_id prod_name
ANV01 .5 ton anvil
ANV02 1 ton anvil
ANV03 2 ton anvil

使用通配符的技巧

MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。

  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  • 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

一、原理介绍

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率也很高。

二、Tomcat配置

编辑tomcat目录下的conf/server.xml

1
2
3
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

改为:

1
2
3
4
5
6
7
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
compression="on"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/javascript,text/css" />

参数说明:

1
2
3
4
5
compression="on" 打开压缩功能。
compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB。
noCompressionUserAgents="gozilla, traviata" 对于这些浏览器,不启用压缩。
compressableMimeType="text/html,text/xml" 压缩类型。
URIEncoding="UTF-8" 设置编码为UTF-8。

三、测试

对同一个接口,开启gzip压缩和不开启gzip压缩进行测试,不开启gzip,接收数据1.5MB,而开启gzip压缩后接收数据86.4KB,压缩率94%

image

image

参考链接:

https://blog.csdn.net/qing_gee/article/details/51538598

https://my.oschina.net/refresh/blog/90986