第二十六章 管理事务处理
    并非所有引擎都支持事务处理,MyISAM不支持.InnoDB支持
    事务处理可以用来维护数据库的完整性,它保证成批的MySQL语句操作要骂完全执行,要么完全不执行
    一些操作(如:添加订单,银行转账等)如果执行到一半的时候因某种数据库故障(如超出磁盘空间、安全限制、表锁等)阻止了这个过程的完成是非常危险的。这怎么样才能解决呢?

    这就要用到事务处理了。事务处理是一种机制,用来管理必须成批执行的MySQLCZ ,以保证不包含不完整的支持结果。利用事务处理,可以保证一组操作要么整体执行,要么完全不执行。发生错误后以前执行的SQL语句进行回退(撤销)已恢复数据到某个已知且安全的状态。
    下面是关于事务处理需要知道的几个术语:
    事务(transaction) 指一组SQL语句
    回退(rollback) 指撤销指定SQL语句的过程
    提交(commit) 指将末存储的SQL语句结果写入数据库表;
    保留点(savepoint) 指事务处理中设置的临时占位符(place-holder)你可以对它发布回退(与回退整个事务处理不同)
    控制事务处理
    既然知道了什么是事务处理,下面来讨论事务处理的管理中涉及的问题
    管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退
    使用ROLLBACK
    MySQL的ROLLBACK命令用来回退(撤销)MySQL语句。
    SELECT FROM ordertotals; //24章填充的表不为空
    START TRANSACTION;
    DELETE FROM ordertotals; //删除所有行
    SELECT
    FROM ordertotals; //为空
    ROLLBACK; //回退
    SELECT FROM ordertotals; //不为空
    显然ROLLBACK只能在一个事务处理内使用(在执行一条START TRANSACTION命令之后)
    哪些语句可以回退 INSERT 、UPDATE、 DELETE语句可以回退,SELECT不可以,也没意义。不能回退CREATE或DROP操作
    使用COMMIT
    一般的MySQL语句都是直接对数据库表执行和编写的。这就是所谓的隐含提交 即提交或保存操作是自动执行的。
    但是在事务处理块中,提交不会隐含提交。必须进行明确提交。未了进行明确提交。使用COMMIT语句。
    START TRANSACTION;
    DELETE FROM orderitems WHERE order_num = 2000;
    DELETE FROM orders WHERE order_num = 2000;
    COMMIT;
    这个例子中,完全删除一个订单需要更新两个表。所以使用事务处理块来保证订单不被部分删除。最后的COMMIT语句仅在不出错是写出更改。如果任何一条语句出错。这DELETE不会提交(实际上,他是被自动撤销的)
    使用保留点
    简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理。但是,简单的可以这么做,复杂的事务处理可能需要部分提交或回退
    为了支持回退部分事务处理,必须在事务处理块中合适的位置放置占位符。这样,如果需要回退,可以回退到某个占位符
    这些占位符称为保留点。为了创建占位符。可如下使用SAVEPOINT语句:
    SAVEPOINT delete1;
    每个保留点都取标识它的唯一名字,以便在回退时,MySQL知道要回退到何处。为了回退懂啊某个保留点,可如下进行:
    ROLLBACK TO delete1;
    保留点越多越好 可以在MySQL中设置多个保留点,越多越好,越多控制回退就越灵活
    释放保留点 保留点在事务处理完成(执行一条ROLLBACK或COMMIT)后自动释放。 MySQL5以来,也可以用RELEASE SAVEPOINT 明确地释放保留点
    更改默认提交行为
    默认MySQL行为是自动提交所有更改。换句话说,任何时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。为了指示MySQL不自动提交更改。需要使用以下语句:
    SET autocommit = 0;

    第二十七章 全球化和本地化
    字符集和校对顺序
    数据库表被用来存储和检索数据。不同语言和字符集需要以不同的方式存储和检索。因此,MySQL需要使用不同的字符集,适用不同的排序和检索数据的方法
    字符集 为字母和符号的集合
    编码 为某个字符集成员的内部表示
    校对 为规定字符如何比较的指令
    校对为什么重要 排序英文正文很容易吗?或许不,考虑词APE、apex和Apple。怎么排序。还有区分和不区分大小写怎么排序,其他字符集更为复杂情况怎么排序。
    在MySQL的正常数据库活动(SELECT INSERT等)中,不需要操心太多的东西。使用何种字符集和校对的决定在服务器、数据库和表级进行。
    使用字符集和校对顺序
    MySQL正常众多字符集。为了查看所支持的字符集的描述和默认校对可以使用下来语句
    SHOW CHARACTER SET;
    为了查看所支持校对以及适用的字符集的完整列表,使用下列语句:
    SHOW COLLATION;
    通常系统管理在安装时定义一个默认的字符集和校对。此外也可以在创建数据库时,指定默认的字符集和校对。使用以下语句
    SHOW VARIABLES LIKE ‘character%’
    SHOW VARIABLES LIKE ‘collation%’
    实际上,字符集很少是服务器范围(甚至是数据库范围)的设置。不同的表,甚至不同的列都可能需要不同的字符集。而且两者都可以在创建时指定
    为了给表指定字符集和校对,可以使用带子句的CREATE TABLE
    CREATE TABLE mytable
    (
    Columnn1 INT,
    Columnn2 VARCHAR(10)
    ) DEFAULT CHARACTER SET hebrew
    COLLATE hebrew_general_ci
    创建了一个包括两列的表,并且指定了一个政府结合校对顺序
    这个例子中指定了CHARACTER SET 和COLLATE两者,一般MySQL如下确定使用什么样的字符集和校对
    1 如果指定CHARACTER SET 和COLLATE两者,这使用这些值
    2 如果只指定CHARACTER SET 则使用此字符集及其默认的校对顺序
    3 如果都没有指定则使用数据库默认
    除了指定字符集和校对表外,MySQL还允许对每个列设置他们的字符集和校对,如下:
    CREATE TABLE mytable
    (
    Column1 INT,
    Column2 VARCHAR(10),
    Column3 VARCHAR(10) CHARACTER SET latin1 COLLATElatin1_general_ci;
    ) DEFAULT CHARACTER SET hebrew
    COLLATE hebrew_general_ci;
    这里对整个表以及特定的列指定了CHARACTER SET 和 COLLATE
    校对在对用ORDER BY 子句检索出来的数据排序时起重要的作用。如果你想需要用于创建表示不同的校对排序特定的SELECT语句,也可以在SELECT 语句自身中进行:
    SELECT
    FROM customers
    ORDER BY lastname , firstnameCOLLATE latin1_general_cs;
    此SELECT使用CALLATE指定了一个备用的校对顺序
    临时区分大小写 上面的语句演示了再通常不区分大小写的表上进行区分大小写的搜索的一种技术
    SELECT的其他子句 除了这里的ORDER BY 子句中使用COLLATE还可以在GROUP BY、HAVING、聚集函数、别名等。