谈谈如何选择合适的MySQL数据类型

谈谈如何选择合适的MySQL数据类型,第1张

1.选择数据类型的基本原则 前提: 使用适合存储引擎。 MyISAM数据表,最好使用固定长度的数据列代替可变长度的数据列。 2). MEMORY存储引擎和数据列 MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没有关系。两者都是作为CHAR类型处理的。 3). InnoDB 存储引擎和数据列 建议使用 VARCHAR类型,对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的 CHAR列不一定比使用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因 此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。 2. 固定长度数据列与可变长度的数据列1).char与varchar l CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:值CHAR(4)存储需求VARCHAR(4)存储需求''' '4个字节''1个字节'ab''ab '4个字节'ab '3个字节'abcd''abcd'4个字节'abcd'5个字节'abcdefgh''abcd'4个字节'abcd'5个字节 请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值不保存,并且会出现错误。从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空格。通过下面的例子说明该差别: mysql>CREATE TABLE vc (v VARCHAR(4), c CHAR(4))Query OK, 0 rows affected (0.02 sec) mysql>

先简单介绍一下事务吧!事务是DBMS得执行单位。它由有限得数据库 *** 作序列组成得。但不是任意得数据库 *** 作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)

原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响!

一致性(Consistency):事务得 *** 作应该使使数据库从一个一致状态转变倒另一个一致得状态!就拿网上购物来说吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务!

隔离性(Isolation):如果多个事务并发执行,应象各个事务独立执行一样!

持久性(Durability):一个成功执行得事务对数据库得作用是持久得,即使数据库应故障出错,也应该能够恢复!

MYSQL的事务处理主要有两种方法。

1、用begin,rollback,commit来实现

begin

开始一个事务

rollback 事务回滚

commit 事务确认

2、直接用set来改变mysql的自动提交模式

MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过

set autocommit=0

禁止自动提交

set autocommit=1 开启自动提交

来实现事务的处理。

但注意当你用 set

autocommit=0

的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

个人推荐使用第一种方法!

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)

下次有空说下MYSQL的数据表的锁定和解锁!

MYSQL5.0 WINXP下测试通过~ ^_^

mysql>use test

Database

changed

mysql>CREATE TABLE `dbtest`(

->id int(4)

->) TYPE=INNODB

Query OK, 0 rows affected, 1 warning (0.05

sec)

mysql>select * from dbtest

->

Empty set (0.01

sec)

mysql>begin

Query OK, 0 rows affected (0.00

sec)

mysql>insert into dbtest value(5)

Query OK, 1 row affected

(0.00 sec)

mysql>insert into dbtest value(6)

Query OK, 1 row

affected (0.00 sec)

mysql>commit

Query OK, 0 rows affected (0.00

sec)

mysql>select * from dbtest

+------+

| id

|

+------+

| 5 |

| 6 |

+------+

2 rows in set (0.00

sec)

mysql>begin

Query OK, 0 rows affected (0.00

sec)

mysql>insert into dbtest values(7)

Query OK, 1 row affected

(0.00 sec)

mysql>rollback

Query OK, 0 rows affected (0.00

sec)

mysql>select * from dbtest

+------+

| id

|

+------+

| 5 |

| 6 |

+------+

2 rows in set (0.00

sec)

mysql>

*******************************************************************************************************************

[PHP]

function

Tran( $sql ) {

$judge = 1

mysql_query('begin')

foreach ($sql as $v) {

if

( !mysql_query($v) ) {

$judge =

0

}

}

if ($judge == 0)

{

mysql_query('rollback')

return

false

}

elseif ($judge == 1) {

mysql_query('commit')

return true

}

}

[/PHP]

************************************************

<?php

$handler=mysql_connect("localhost","root","")

mysql_select_db("task")

mysql_query("SET

AUTOCOMMIT=0")//设置为不自动提交,因为MYSQL默认立即执行

mysql_query("BEGIN")//开始事务定义

if(!mysql_query("insert

into trans (id)

values('2')"))

{

mysql_query("ROOLBACK")//判断当执行失败时回滚

}

if(!mysql_query("insert

into trans (id)

values('4')"))

{

mysql_query("ROOLBACK")//判断执行失败回滚

}

mysql_query("COMMIT")//执行事务

mysql_close($handler)

?>

引自:http://www.cnblogs.com/in-loading/archive/2012/02/21/2361702.html


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/7428615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存