网易MySQL数据库工程师微专业学习笔记(三)

一、字符集与字符序

字符集是指具体的字符的编码格式,例如有utf8编码、gbk编码等。在mysql中可以用show character set命令查看当前mysql支持的所有字符集。

字符序是某种字符集中字符的排序规则,例如utf8_unicode_ci、utf8_unicode_cs等,在mysql中可以用show collation来查看mysql中支持的所有字符序。另外字符序的命名是有规则的,以ci结尾的字符序都是对大小写不敏感的字符序,而以cs结尾的都是对大小写敏感的,以bin结尾的则是直接对字符的编码值进行比较排序。在utf8中一般用utf8_general_ci,这个字符序能够对中英文进行准确的排序,而如果需要对德语、法语、俄语进行排序需要用utf8_unicode_ci。

二、mysql字符集等级

mysql中的字符集等级分为四个等级,分别是服务器级、数据库级、表级和列级。数据库级、表级和列级在创建数据库、表和列时可以进行设置,而服务器级别的字符集是通过设置character_set_server变量来设置的,可以通过set character_set_server=utf8;来设置。此外还有一个character_set_system表示数据系统元数据的字符集,就是只表名、列名的字符集,如果设为utf8则可以支持中文命名。这两个属性可以用show variables like "%char%";命令来查看。

三、mysql连接时字符集的解码步骤

mysql客户端在连接发送数据和获取数据时的主要涉及到三个mysql属性值。分别是character_set_client、character_set_connection和character_set_result。character_set_client表示客户端来源数据使用的字符集,就是指客户端程序发来的数据时什么字符集。character_set_connection表示连接层字符集,主要是用于在客户端来源数据和数据库中的进行一个中间的转换。character_set_result表示数据库返回数据的字符集。mysql连接时字符集的解码步骤是,首先客户端将数据以character_set_client字符集的格式发送过来,然后通过character_set_connection声明的字符集格式与数据库中的实际字符集进行转换,最后数据库中返回的结果以character_set_result字符集格式返回给客户端,如下图所示。


这三个属性值同样可以用show variables like "%char%";命令来查看,也可以用set命令来设置,但是一般都是通过set names utf8这样的命令来将这三个属性统一设置的,因为如果这三个属性的值不一样就容易出现乱码。

四、常见乱码原因

第一种是程序连接使用的字符集和通知mysql的character_set_client的编码格式不一致。例如使用navicat连接mysql的连接属性中高级标签中有一个编码的属性设置,如下图所示。


这里现在设置的编码是utf8,而如果character_set_client的设置不是uft8就会出现乱码了。另外说明一下,character_set_client、character_set_connection和character_set_result这三个属性的值和具体的表中的编码格式或者列的编码格式是可以不一样的,因为在存储的时候mysql会通过character_set_connection来进行转换,但是有一个前提条件,就是发送过来的字符在两个字符集中是可以转换的,如果不能转换mysql会报错并且存储失败。例如,character_set_client、character_set_connection和character_set_result中声明的时utf8格式,而表中声明的是latin1字符集格式的,那么如果发送的字符都是英文的时候时不会有问题的,但是如果客户端发送的数据中有中文,那么mysql就会报错,因为中文在latin1字符集中是没有的。

第二种乱码主要是通过load data命令导入数据时出现乱码,这个主要是因为导入的源数据文件中的字符集和chatacter_set_database属性中定义的字符集不同导致的。

五、Statement和PreparedStatement的区别

PreparedStatement再数据库端会进行预编译,提高执行效率同时可以防止sql注入。当对数据库只执行一次性存取的时候可以使用Statement对象进行处理,在正式的线上业务中推荐使用PreparedStatement。

六、Connection、Statement和ResultSet的关闭

mysql数据库端会为connection、resultset维护内存状态,一直不关闭会占用服务器端的资源。同时mysql中的最大连接数是受max_connection限制的,不能无限制的创建连接,所以用完要及时关闭。原生的JDBC中的connection在关闭后resultset和statement会自动的关闭。但是如果使用了连接池resultset和statement将不会自动关闭,因此推荐主动关闭。

七、JDBC连接参数的使用

useUnicode=true,这样设置打开字符设置。characterEncoding=utf8,设置使用的字符集。connectTimeout=1000,建立连接的超时上限,单位是毫秒。socketTimeout=30000,建立连接后发送sql命令后等待的超时上限,单位也是毫秒。

八、ResultSet游标的使用

默认的resultset对象不可更新,仅有一个向前移动的指针。因此,只能迭代一次,并且只能按从第一行到最后一行的顺序进行。可以通过设置将resultset改为可以滚动和可更新的,但是一般不这样设置。另外可以通过设置setFetchSize来设置resultset每次向数据库读取的行数,防止数据返回量过大将内存爆掉。

九、DAO框架优缺点

第一,可以将底层数据访问逻辑与业务逻辑分离;第二,简化代码,提高开发效率;第三,缺点是相较于原生的sql可能会带来额外的性能损耗,主要时因为在利用反射机制封装对象和进行sql转换时会产生额外的运算。

十、DAO框架实现需要的组件

1. 一个DAO工厂类。

2. 一个DAO接口,声明了select、insert、update、delete等方法。

3. 一个实现了DAO接口的类。

4. 数据传输对象,即映射到数据库的model

十一、MyBatis

MyBatis是目前的一个主流的开源DAO框架。MyBatis支持普通的sql查询、存储过程和高级映射,同时还支持查询缓存。相较于hibernate的主要优势在于简单,更轻量级和支持原生sql语句。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值