数据库篇
一、数据库基本知识
实体:客观存在的真实事物,人、物品都是。
属性:实体的某个特征,比如一个人的年龄是18
关系:实体与实体之间的联系,分为一对一、一对多、多对多
记录:表格中的一行
字段:表格中的一列
主键:能唯一标识表中的一行的列
外键:表中存放了其他表的主键
举例:
分析表中主键和外键。
1. 班级表
主键:
班级号
(每个班级号是唯一的,可以作为主键)外键:无外键,班级表独立。
2. 学生表
主键:
学号
(每个学号是唯一的,适合用作主键)外键:
班级号
(外键,引用班级表中的班级号
)
3. 成绩表
主键:可以是组合主键,包括
成绩号
(唯一标识成绩记录)或者由学号
和考试号
组成的组合主键。外键:
学号
(外键,引用学生表中的学号
)考试号
(外键,引用考试表中的考试号
)科目号
(外键,引用科目表中的科目号
)
4. 科目表
主键:
科目号
(每个科目号是唯一的,适合用作主键)外键:无外键,科目表独立。
5. 考试表
主键:
考试号
(每个考试号是唯一的,适合用作主键)外键:无外键,考试表独立。
总结:
班级表:有主键
班级号
,无外键。学生表:有主键
学号
,外键班级号
。成绩表:主键
成绩号
(或组合主键),外键学号
、考试号
、科目号
。科目表:有主键
科目号
,无外键。考试表:有主键
考试号
,无外键。
事务:保证两个数据操作同时成功。
访问锁:
数据库原理:
数据类型:
存储引擎中myisam不支持事务,innoDB支持事务。开启事务会消耗大量资源,和钱相关的项目会开启,其他不用开启。
二、数据库操作
基本命令如下:
按照上图创建数据库jxcdm,并设计表,表中插入数据。并且使用联合查询方式使结果按下图方式显示。
安装数据库:
|
|
构建sql语句:
vim jx_class.sql
|
|
将sql导入数据库,如果出现以下报错说明jx_class已存在。所以在创建表之前先判断表是否存在,如果存在则丢弃,再创建表(DROP TABLE IF EXISTS `jx_class`;)。
|
|
然后导入表,所有数据都准备好了。
|
|
进入到数据库中使用联合查询语句来将结果和图上匹配。
|
|
三、奇怪问题
我们还使用jx1206项目内的war包作为应用。现在将代码上传到远程仓库(gitee上),然后在开发服务器上拉取仓库中最新代码,更改源码中a.sh文件,添加数据库查询相关命令。
|
|
运维服务器数据库需要创建一个用户具有管理员功能,否则在开发服务器上访问时会报错:
|
|
进入到开发服务器上将源代码打包成war包上传到tomat的webapps中,重启java。先在开发服务器上测试:
|
|
发现中文字符是问号。
去运维服务器上测试也是问号。
|
|
单独执行sql语句显示正常。
|
|
在shell脚本里显示问号,在终端里显示正常。查看终端字符编码环境:
|
|
脚本中并没用使用编码环境,修改a.sh,添加编码环境。
|
|
现在在开发机上测试,显示正常。
|
|
应用需要从外部浏览器访问,我们之前做过映射,从笔记本访问127.0.0.1的7180端口流量会转到开发机的80端口。
我们从浏览器访问,又出现新问题,之前的问号变成了乱码。
|
|
我们想一下整个业务访问过程。从浏览器访问127.0.0.1:7180/cgi-bin/a.sh首先需要经过虚拟机网关服务器nat网卡映射,然后到网关服务器的nat规则,然后走内核转发,最后到开发机的80业务口上。
最开始shell中没有添加export LANG=en_US.UTF-8 时,在开发服务器上抓到的包如下:
分段排查,这里在开发服务器上抓业务口的3306。分析MySQL包的响应包。
|
|
抓到之后我们分析一下:
乱码那里对应的16进制编码转换成utf8后正确显示了中文。证明了运维服务器上mysql服务器发送给开发机mysql客户端的数据是正确的。
然后我们在排查下一段:开发服务器上返回给浏览器的包是否正确?
在开发服务器上抓80端口,由于是tcp协议,可以追踪TCP流,使用16进制显示,找到中文那里对应16进制编码,将该编码转换成utf8,结果确定是我们想要的中文。
|
|
现在看来开发服务器上返回给浏览器的包也是正确的。那么问题到底出现在哪里了呢?我们在仔细查看shell脚本中的代码发现:我们只告诉了浏览器我们传送的是文本或者html,并没有说是中文。导致浏览器访问时都按照文本或者html方式处理所以中文显示乱码。
下面我们修改shell脚本,添加中文编码格式,使用浏览器再次访问测试,终于显示正常了。
|
|
|
|
最终完整脚本如下:
|
|
mysql数据库可以使用一条命令将16进制编码转换成汉字,先登录mysql,然后输入以下命令:
|
|
这里将`e5bca0e4b889`更改成你想要查询的16进制编码。