MySQL(十三)事务处理和字符集
一、事务处理
事务处理(transaction processing):是一种机制,用来维护数据库的完整性,管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。
这样可以保证一组操作不会中途停止,或作为整体执行或完全不执行(除非明确指示);如果没有发生错误,整组数据写入数据库,如发生错误,则进行回退,以恢复数据库到某个一直且安全的状态。
关于事务处理的几个重要术语:
①事务(transaction):一组SQL语句
②回退(rollback):撤销指定SQL语句的过程
③提交(commit):将未存储的SQL语句结果写入数据库表
④保留点(savepoint):事务处理中设置的临时占位符(place-holder),可以对它发布回退(与回退整个事务处理不同)
△管理事务处理的关键:将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应回退。
MySQL使用start transaction标识事务的开始
1、使用rollback
rollback命令用来回退(撤销)MySQL语句,例句如下:
select * from ordertotals;
start transaction;
delete from ordertotals;
select * from ordertotals;
rollback;
select * from ordertotals;
解析:这个例子从显示ordertotals表开始;首先执行一条select语句以显示该表不为空,然后开始一个事务处理,用一条delete语句删除ordertotals中的所有行,另一条select语句
验证ordertotals表确实为空;然后用一条rollback语句回退start transaction之后的所有语句,最后一条select语句显示该表不为空。
PS:rollback只能在一个事务处理内使用(在执行一条start transaction命令之后)。
事务处理用来管理select、insert和update语句;不能回退select语句(这样没意义);不能回退create或drop操作(即使事务中使用这两条语句,执行回退,它们也不会被撤销)。
2、使用commit
一般MySQL语句都是直接针对数据库表执行和编写,也就是所谓的隐含提交(implicit commit),即提交(写或保存)操作是自动的;但事务处理块是明确的提交,利用commit语句;例句如下:
start transaction;
delete from orderitems where order_num = '20010';
delete from orders where order_num = '20010';
commit;
解析:这个例子中,从系统中完全删除订单20010;因为涉及更新两个数据库表orders和ordersitems,所以使用事务处理块来保证订单不被部分删除;最后的commit语句仅在不出错时写出更改。
如果第一条delete起作用,但第二条失败,则delete不会提交(被自动撤销)。
PS:当commit或rollback语句执行后,事务会自动关闭(将来的更改会隐含提交)。
3、使用保留点
相比rollback和commit来说,复杂的事务处理可能需要部分提交或回退;为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符,如果需要回退,可以回退到某个占位符,这些
占位符称为保留点,为了创建占位符,可以使用savepoint语句,比如:
savepoint deletel;
解析:每个保留点都取标识它的唯一名字,以便回退时MySQL知道要回退到何处,比如为了回退到本例给出的保留点,可以这样:rollback to deletel;
PS:保留点越多越好,这样更为灵活进行回退等操作;保留点在事务处理完成后自动释放,或也可以用release savepoint明确的释放保留点。
4、更改默认提交行为
默认的MySQL行为是自动提交所有更改,即该SQL语句都是针对表执行的,而且立即生效;为了指示MySQL不自动提交更改,可以使用这条语句:set autocommit = 0;
autocommit标志决定是否自动提交更改,不管有没有commit语句;即设置autocommit=0(假)指示MySQL不自动提交更改(直到autocommit被设置为真为止)。
PS:autocommit标志是针对每个联结,而不是服务器。
二、字符集和校对顺序
数据库表被用来存储和检索数据,不同的语言和字符集需要以不同的方式存储和检索。因此MySQL需要适应不同的字符集,适应不同排序和检索数据的方法。
常见的术语:
字符集:字母和符号的组合
编码:为某个字符集成员的内部表示
校对:为规定字符如何比较的指令
1、查看字符集
查看所支持的字符集完整列表,可以使用如下语句:
show character set;
这条语句显示所有可用的字符集以及每个字符集的描述和默认校对。
为查看所支持校对的完整列表,可使用如下语句:
show collation;
此语句显示所有可用的校对,以及它们适用的字符集。
PS:通常系统管理在安装时定义一个默认的字符集合校对,此外也可在创建数据库时,指定默认的字符集合校对;为了确定所用字符集合校对,可使用以下语句:
show variables like 'character%';
show cariables like 'collation%';
PS:事实上,字符集很少是服务器范围(甚至数据库范围);不同表甚至不同列,都可能需要不同字符集,而且两者都可以在创建表时指定。
2、指定字符集和校对
为了给表指定字符集合校对,可使用如下语句:
create table mytable
(
columnn1 int,
columnn2 varchar(10)
)default character set hebrew
collate hebrew_general_ci;
解析:此语句创建一个包含两列的表,并且指定一个字符集合一个校对顺序。
△MySQL默认使用的字符集和校对:
①如果指定character set和collate两者,则使用这些值;
②如果只指定character set,则使用此字符集及其默认的校对(如show character set的结果中所示);
③如果既不指定character set,也不指定collate,则使用数据库默认。
PS:MySQL还允许对每个列设置字符集和校对,例句如下:
create table mytable
(
columnn1 int,
columnn2 varchar(10),
columnn3 varchar(10) character set latin1 collate
→ latin1_general_ci
)default character set hebrew
collate hebrew_general_ci;
解析:这里对整个表以及一个特定的列指定了character set和collate;校对在对用order by子句检索出来的数据排序时起重要的作用,如果你需要用与创建表时不同的校对顺序排序特定的select
语句,可以在select语句自身中进行,比如:
select * from customers
order by lastname,firstname collate latinl_general_cs;
这个例子中,select使用collate指定一个备用的校对顺序(为区分大小写的校对),这样很显然将影响到结果排序的次序。
△如果绝对需要,串可以在字符集之间进行转换,使用cast()或 convert()函数。
MySQL(十三)事务处理和字符集的更多相关文章
- MySQL事务处理和锁机制
事务处理和并发性 1.1 基础知识和相关概念 1 )全部的表类型都可以使用锁,但是只有 InnoDB 和 BDB 才有内置的事务功能. 2 )使用 begin 开始事务,使用 commit 结束事务, ...
- 深入浅出MySQL事务处理和锁机制
1. 事务处理和并发性 1.1. 基础知识和相关概念 1 )全部的表类型都可以使用锁,但是只有 InnoDB 和 BDB 才有内置的事务功能. 2 )使用 begin 开始事务 ...
- mysql配置命令 CHARACTER_SET_%字符集设置
参照: http://blog.csdn.net/mzlqh/article/details/7621307点击打开链接 其实现在的ubuntu12. 直接sudo apt-get install M ...
- 修改MYSQL数据库表的字符集
MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...
- MySQL驱动和数据库字符集设置不搭配
刚才控制台又报这个错,这是代表MySQL驱动和数据库字符集设置不搭配: 错误: "...Initial client character set can be forced via the ...
- 微信emoji表情编码 、MySQL 存储 emoji 表情符号字符集
相关资料 微信emoji表情编码 微信用户名显示「emoji表情」 PHP处理微信中带Emoji表情的消息发送和接收(Unicode字符转码编码) MySQL 存储emoji表情 MySQL 存储 e ...
- MySQL查看和修改字符集的方法
一.查看字符集 1.查看MYSQL数据库服务器和数据库字符集 方法一:show variables like '%character%';方法二:show variables like 'collat ...
- 8、mysql乱码问题及字符集实战
8.1.mysql插入中文数据乱码案例: mysql建库的字符集为latin1,客户端的字符集为utf8; use lc; 1.查看库的编码: mysql> show create databa ...
- [mysql]支持emoji(字符集问题)
问题的根源 主要问题就是在字符集,一般解决这种问题都是靠试验.我实验了一通,得出的结论和大家分享一下(如有错误,还望指正): 数据库的字符集 数据库连接的字符集 配置方法 设置数据库的字符集为utf8 ...
随机推荐
- HTML--SVG基础
一 SVG概述 SVG是Scalable Vector Graphics的缩写,即缩放式矢量图形; 优点: 1.使用编辑器即可编辑图形; 2.基于XML,SVG图形可以被很容易的搜索,脚本化和压缩; ...
- 集合类--最详细的面试宝典--看这篇就够用了(java 1.8)
看了一个星期源码,搜索上百篇博文,终于总结出了集合类的所有基础知识点,学集合,看这篇就够用了!!! 篇幅有点长, 如果你能全部理解,java最重要的集合就不怕了,秒过面试!!!(本篇素材来自网络,如有 ...
- 【代码笔记】Web-ionic-按钮
一,效果图. 二,代码.index.html文件如下所示. <!DOCTYPE html> <html> <head> <meta charset=" ...
- 在vue中赋值的路径没有被编译
当我们跑起来的时候,f12会看到相对路径,但是此时会报错,说找不到图片,这时候有其中一个办法,直接 require进去. 这时候就可以成功显示图片,但是路径会不一样,因为编译出来. 至于如何props ...
- 在td中的输入英文为什么不自动换行???
在表格中如果输入纯汉字,表格中的内容会根据表格大小进行换行,若果一个老外不会写汉字,写了一堆英文,表格的宽度会拉的很长,超过规定宽度 解决方法是在table中加上style="table-l ...
- 逻辑回归&线性回归
# coding:utf-8 import numpy as np from sklearn import linear_model, datasets import matplotlib.pyplo ...
- Scrapy爬取遇到的一点点问题
学了大概一个月Scrapy,自己写了些东东,遇到很多问题,这几天心情也不大好,小媳妇人也不舒服,休假了,自己研究了很久,有些眉目了 利用scrapy 框架爬取慕课网的一些信息 步骤一:新建项目 scr ...
- 用Python做股市数据分析(一)
本文由 伯乐在线 - 小米云豆粥 翻译.未经许可,禁止转载!英文出处:Curtis Miller.欢迎加入翻译组. 这篇博文是用Python分析股市数据系列两部中的第一部,内容基于我犹他大学 数学39 ...
- U890采购入库单修改供应商
采购入库单表头 SELECT *FROM RdRecordWHERE (cCode = '0000051801') 采购入库单表体 SELECT *FROM RdRecordsWHERE (cPOID ...
- Beta冲刺(1/5)(麻瓜制造者)
今天小组进行了第一次冲刺,虽然新组员还没有确定. 今日完成任务 邓弘立:修改登录代码 李佳铭: 用户收藏UI代码编写 江郑: 进行了后台管理员界面ui的设计和环境的搭建 刘双玉:后台github仓库建 ...