• MySQL事务处理及字符集和校对顺序


    一、事务处理

    事务处理:是一种机制,管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。用来维护数据库的完整性。

    利用事务处理,可以保证一组操作不会中途停止,或作为整体执行或完全不执行(除非明确指示)。如果没有发生错误,整组语句写入数据库,如发生错误,则进行回退,以恢复数据库到某个已知且安全的状态。

    事务处理的几个重要术语:

    ·事务:一组SQL语句;

    ·回退:撤销指定SQL语句的过程;

    ·提交:将未存储的SQL语句结果写入数据库表;

    ·保留点:事务处理中设置的临时占位符,可以对它发布回退(与回退整个事务处理不同);

    管理事务处理的关键:将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应回退。

    start transaction:标识事务的开始

    1、使用rollback

    rollback命令用来回退(撤销)MySQL语句,如下:

    select * from ordertotals;
    start transaction;
    delete from ordertotals;
    select * from ordertotals;
    rollback;
    select * from ordertotals;

    解析:用rollback语句回退start transaction之后的所有语句,最后一条select语句显示该表不为空。

    PS

    rollback只能在一个事务处理内使用(在执行一条start transaction命令之后)。

    事务处理用来管理select、insert和update语句;不能回退select语句(没意义);不能回退create或drop操作(即使事务中使用这两条语句,如果执行回退,它们也不会被撤销)。

    2、使用commit

    一般MySQL语句都是直接针对数据库表执行和编写,也就是隐含提交,即提交(写或保存)操作是自动的;但在事务处理块中,提交不会隐含地进行。为进行明确的提交, 使用commit语句,如下:

    start transaction;
    delete from orderitems where order_num = '20010';
    delete from orders where order_num = '20010';
    commit;

    解析:从系统中完全删除订单20010,涉及更新两个数据库表,所以使用事务处理块来保证订单不被部分删除。commit语句仅在不出错时写出更改。如果第一条delete起作用,但第二条失败,则delete不会提交(被自动撤销)。

    PS当commit或rollback语句执行后,事务会自动关闭(将来的更改会隐含提交)。

    3、使用保留点

    复杂的事务处理可能需要部分提交或回退;

    为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符,如果需要回退,可以回退到某个占位符,这些占位符称为保留点,为了创建占位符,可以使用savepoint语句,比如:savepoint deletel;

    解析:每个保留点都取标识它的唯一名字,以便回退时MySQL知道要回退到何处。如为回退到本例给出的保留点,可以使用:rollback to deletel;

    PS保留点越多越好,这样可以更灵活的回退;保留点在事务处理完成后自动释放,或也可以用release savepoint明确的释放保留点。

    4、更改默认提交行为

    默认的MySQL行为是自动提交所有更改,即该SQL语句都是针对表执行的,而且立即生效;为指示MySQL不自动提交更改,可以使用:set autocommit = 0;

    autocommit标志决定是否自动提交更改,不管有没有commit语句;即设置autocommit=0(假)指示MySQL不自动提交更改(直到autocommit被设置为真为止)。

    PSautocommit标志是针对每个连接,而不是服务器。

    二、字符集和校对顺序

    数据库表被用来存储和检索数据,不同的语言和字符集需要以不同的方式存储和检索。因此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,则使用此字符集及其默认的校对;

    ·如果既不指定character set,也不指定collate,则使用数据库默认。

    PSMySQL允许对每个列设置字符集和校对,例句如下:

    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;

    校对在对用order by子句检索出来的数据排序时起重要的作用,如果你需要用与创建表时不同的校对顺序排序特定的select语句,可以在select语句自身中进行,比如:

    select * from customers
    order by lastname,firstname collate latinl_general_cs;

    select使用collate指定一个备用的校对顺序(为区分大小写校对),这样将影响到结果排序的次序。COLLATE还可以用于GROUP BY、HAVING、聚集 函数、别名等。

    PS如果绝对需要,串可以在字符集之间进行转换,使用cast()或 convert()函数。

  • 相关阅读:
    bzoj 3155: Preprefix sum
    bzoj 1854: [Scoi2010]游戏
    UVA1608 不无聊的序列 Non-boring sequences
    UVA1747 【Swap Space】
    Luogu P5550 Chino的数列
    bzoj 1799: [Ahoi2009]self 同类分布
    bzoj 1054: [HAOI2008]移动玩具
    MATLAB工具箱,应用程序,软件和资源的精选清单
    论文格式排版Issue及解决办法
    《将博客搬至CSDN》
  • 原文地址:https://www.cnblogs.com/mind18/p/14280182.html
Copyright © 2020-2023  润新知