﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-mysql</title><link>http://www.blogjava.net/stevenjohn/category/51104.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Thu, 18 Aug 2016 11:37:32 GMT</lastBuildDate><pubDate>Thu, 18 Aug 2016 11:37:32 GMT</pubDate><ttl>60</ttl><item><title>MySQL触发器Trigger实例篇 </title><link>http://www.blogjava.net/stevenjohn/archive/2016/08/18/431625.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 18 Aug 2016 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2016/08/18/431625.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/431625.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2016/08/18/431625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/431625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/431625.html</trackback:ping><description><![CDATA[<div><div style="margin:0px; padding:0px; border:0px; background-color:transparent; font-family:微软雅黑,Verdana,Tahoma,'Lucida Grande',Arial,sans-serif; line-height:21px"> <div style="margin:0px; padding:0px; border:0px; font-size:14px; background-color:transparent; font-weight:bold"> MySQL触发器Trigger实例篇</div> <div style="margin:0px; padding:0px; border:0px; background-color:transparent; color:#737373"> <span style="margin:0px; padding:0px; border:0px; background-color:transparent">发表于668 天前</span>&nbsp;<span style="margin:0px; padding:0px; border:0px; background-color:transparent">&#8260;&nbsp;<a target="_blank" href="http://www.sky54.net/?category_name=it" title="查看 IT技术 的全部文章" rel="category" style="text-decoration:none; color:#737373">IT技术</a></span>&nbsp;<span style="margin:0px; padding:0px; border:0px; background-color:transparent">&#8260;&nbsp;<a target="_blank" href="http://www.sky54.net/?p=3043#respond" title="MySQL触发器Trigger实例篇 上的评论" style="text-decoration:none; color:#737373">暂无评论</a></span></div> </div>  <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 以前关注的数据存储过程不太懂其中奥妙，最近遇到跨<a href="http://lib.csdn.net/base/14" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">数据库</a>，同时对多个表进行CURD（Create增、Update改、Read读、Delete删），怎么才能让繁琐的数据CURD同步变得更容易呢？相信很多人会首先想到了<a href="http://lib.csdn.net/base/14" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">MySQL</a>存储过程、触发器，这种想法确实不错。于是饶有兴趣地亲自写了CUD（增、改、删）触发器的实例，用触发器实现多表数据同步更新。</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> <a target="_blank" href="http://www.sky54.net/uploads/2012/03/internet_MYSQL_TRIGGER_.png" style="text-decoration:none; color:#0196e3; outline:none"><img src="http://www.sky54.net/uploads/2012/03/internet_MYSQL_TRIGGER_.png" alt="MySQL触发器Trigger实例篇" title="internet_MYSQL_TRIGGER_" size-full=""  wp-image-3056"="" style="margin:0px auto 10px; padding:0px; border:none; background-color:transparent; display:block" height="415" width="600" /></a></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> <strong>定义： 何为MySQL触发器？</strong></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 在MySQL Server里面也就是对某一个表的一定的操作，触发某种条件（Insert,Update,Delete 等），从而自动执行的一段程序。从这种意义上讲触发器是一个特殊的存储过程。下面通过MySQL触发器实例，来了解一下触发器的工作过程吧！</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> <strong>一、创建MySQL实例数据表：</strong></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 在mysql的默认的测试test数据库下，创建两个表t_a与t_b：</p></div><div><br /><br />&nbsp;&nbsp;&nbsp; /*Table structure for table `t_a` */<br />&nbsp;&nbsp;&nbsp; DROP TABLE IF EXISTS `t_a`;<br />&nbsp;&nbsp;&nbsp; CREATE TABLE `t_a` (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `id` smallint(1) unsigned NOT NULL AUTO_INCREMENT,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `username` varchar(20) DEFAULT NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `groupid` mediumint(8) unsigned NOT NULL DEFAULT '0',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIMARY KEY (`id`)<br />&nbsp;&nbsp;&nbsp; ) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1;<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; /*Data for the table `t_a` */<br />&nbsp;&nbsp;&nbsp; LOCK TABLES `t_a` WRITE;<br />&nbsp;&nbsp;&nbsp; UNLOCK TABLES;<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; /*Table structure for table `t_b` */<br />&nbsp;&nbsp;&nbsp; DROP TABLE IF EXISTS `t_b`;<br />&nbsp;&nbsp;&nbsp; CREATE TABLE `t_b` (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `id` smallint(1) unsigned NOT NULL AUTO_INCREMENT,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `username` varchar(20) DEFAULT NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `groupid` mediumint(8) unsigned NOT NULL DEFAULT '0',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIMARY KEY (`id`)<br />&nbsp;&nbsp;&nbsp; ) ENGINE=MyISAM AUTO_INCREMENT=57 DEFAULT CHARSET=latin1;<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; /*Data for the table `t_b` */<br />&nbsp;&nbsp;&nbsp; LOCK TABLES `t_b` WRITE;<br />&nbsp;&nbsp;&nbsp; UNLOCK TABLES;<br /></div><div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 在t_a表上分创建一个CUD（增、改、删）3个触发器，将t_a的表数据与t_b同步实现CUD，注意创建触发器每个表同类事件有且仅有一个对应触发器，为什么只能对一个触发器，不解释啦，看MYSQL的说明帮助文档吧。</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> <strong>二、创建MySQL实例触发器：</strong></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 在实例数据表t_a上依次按照下面步骤创建tr_a_insert、tr_a_update、tr_a_delete三个触发器</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> <strong>1、创建INSERT触发器trigger_a_insert：</strong></p></div><div><br /><br />&nbsp;&nbsp;&nbsp; DELIMITER $$<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; USE `test`$$<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; --判断数据库中是否存在tr_a_insert触发器<br />&nbsp;&nbsp;&nbsp; DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_insert`$$<br />&nbsp;&nbsp;&nbsp; --不存在tr_a_insert触发器，开始创建触发器<br />&nbsp;&nbsp;&nbsp; --Trigger触发条件为insert成功后进行触发<br />&nbsp;&nbsp;&nbsp; CREATE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*!50017 DEFINER = 'root'@'localhost' */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIGGER `tr_a_insert` AFTER INSERT ON `t_a` <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOR EACH ROW BEGIN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --Trigger触发后，同时对t_b新增同步一条数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO `t_b` SET username = NEW.username, groupid=NEW.groupid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;<br />&nbsp;&nbsp;&nbsp; $$<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; DELIMITER;<br /></div><div><strong>2、创建UPDATE触发器trigger_a_update：</strong></div><div><br /><br />&nbsp;&nbsp;&nbsp; DELIMITER $$<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; USE `test`$$<br />&nbsp;&nbsp;&nbsp; --判断数据库中是否存在tr_a_update触发器<br />&nbsp;&nbsp;&nbsp; DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_update`$$<br />&nbsp;&nbsp;&nbsp; --不存在tr_a_update触发器，开始创建触发器<br />&nbsp;&nbsp;&nbsp; --Trigger触发条件为update成功后进行触发<br />&nbsp;&nbsp;&nbsp; CREATE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*!50017 DEFINER = 'root'@'localhost' */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIGGER `tr_a_update` AFTER UPDATE ON `t_a` <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOR EACH ROW BEGIN <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --Trigger触发后，当t_a表groupid,username数据有更改时，对t_b表同步一条更新后的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF new.groupid != old.groupid OR old.username != new.username THEN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE `t_b` SET groupid=NEW.groupid,username=NEW.username WHEREusername=OLD.username AND groupid=OLD.groupid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END IF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;<br />&nbsp;&nbsp;&nbsp; $$<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; DELIMITER ;<br /></div><div><strong>3、创建DELETE触发器trigger_a_delete：</strong></div><div><br /><br />&nbsp;&nbsp;&nbsp; DELIMITER $$<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; USE `test`$$<br />&nbsp;&nbsp;&nbsp; --判断数据库中是否存在tr_a_delete触发器<br />&nbsp;&nbsp;&nbsp; DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_delete`$$<br />&nbsp;&nbsp;&nbsp; --不存在tr_a_delete触发器，开始创建触发器<br />&nbsp;&nbsp;&nbsp; --Trigger触发条件为delete成功后进行触发<br />&nbsp;&nbsp;&nbsp; CREATE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*!50017 DEFINER = 'root'@'localhost' */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIGGER `tr_a_delete` AFTER DELETE ON `t_a` <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOR EACH ROW BEGIN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --t_a表数据删除后，t_b表关联条件相同的数据也同步删除<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DELETE FROM `t_b` WHERE username=Old.username AND groupid=OLD.groupid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;<br />&nbsp;&nbsp;&nbsp; $$<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; DELIMITER ;<br /></div><div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> <strong>三、测试MySQL实例触发器：</strong></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 分别测试实现t_a与t_b实现数据同步CUD(增、改、删)3个Triggers</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> <strong>1、测试MySQL的实例tr_a_insert触发器：</strong></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 在t_a表中新增一条数据，然后分别查询t_a/t_b表的数据是否数据同步，测试触发器成功标志，t_a表无论在何种情况下，新增了一条或多条记录集时，没有t_b表做任何数据insert操作，它同时新增了一样的多条记录集。</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 下面来进行MySQL触发器实例测试：</p></div><div><br /><br />&nbsp;&nbsp;&nbsp; --t_a表新增一条记录集<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO `t_a` (username,groupid) VALUES ('sky54.net',123)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --查询t_a表<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT id,username,groupid FROM `t_a`<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --查询t_b表<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT id,username,groupid FROM `t_b`<br /></div><div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> <strong>2、测试MySQL的实例tr_a_update、tr_a_delete触发器：</strong></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 这两个MySQL触发器测试原理、步骤与tr_a_insert触发器一样的，先修改/删除一条数据，然后分别查看t_a、t_b表的数据变化情况，数据变化同步说明Trigger实例成功，否则需要逐步排查错误原因。</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 世界上任何一种事物都其其优点和缺点，优点与缺点是自身一个相对立的面。当然这里不是强调&#8220;世界非黑即白&#8221;式的&#8220;二元论&#8221;，&#8220;存在即合理&#8221;嘛。当然 MySQL触发器的优点不说了，说一下不足之处，MySQL  Trigger没有很好的调试、管理环境，难于在各种系统环境下测试，测试比MySQL存储过程要难，所以建议在生成环境下，尽量用存储过程来代替 MySQL触发器。</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; border:0px; background-color:transparent; text-indent:2em"> 本篇结束前再强调一下，支持触发器的MySQL版本需要5.0以上，5.0以前版本的MySQL升级到5.0以后版本方可使用触发器哦！</p></div><br /><br /><br /><br /><br /><br /><br /><div>http://blog.csdn.net/hireboy/article/details/18079183</div><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/431625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2016-08-18 17:25 <a href="http://www.blogjava.net/stevenjohn/archive/2016/08/18/431625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql mysqldump</title><link>http://www.blogjava.net/stevenjohn/archive/2015/09/05/427124.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 04 Sep 2015 17:12:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/09/05/427124.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/427124.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/09/05/427124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/427124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/427124.html</trackback:ping><description><![CDATA[mysql mysqldump 只导出表结构 不导出数据<br /><div></div><div>mysqldump --opt -d 数据库名 -u root -p &gt; xxx.sql&nbsp;</div><br /><strong>备份数据库 <br /></strong><br />#mysqldump　数据库名　&gt;数据库备份名 <br />#mysqldump　-A　-u用户名　-p密码　数据库名&gt;数据库备份名  <br />#mysqldump　-d　-A　--add-drop-table　-uroot　-p　&gt;xxx.sql <br /><strong>1.导出结构不导出数据 <br /></strong>mysqldump　--opt　-d　数据库名　-u　root　-p　&gt;　xxx.sql　　 <br /><strong>2.导出数据不导出结构</strong> <br />mysqldump　-t　数据库名　-uroot　-p　&gt;　xxx.sql　 <br /><strong>3.导出数据和表结构</strong> <br /><div>mysqldump　数据库名　-uroot　-p　&gt;　xxx.sql　&nbsp;</div><strong>4.导出特定表的结构 <br /></strong>mysqldump　-uroot　-p　-B　数据库名　--table　表名　&gt;　xxx.sql　　 <br /><strong>导入数据： <br /></strong>　　由于mysqldump导出的是完整的SQL语句，所以用mysql客户程序很容易就能把数据导入了：  <br />#mysql　数据库名　&lt;　文件名 <br />#source　/tmp/xxx.sql　　&nbsp;<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/427124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-09-05 01:12 <a href="http://www.blogjava.net/stevenjohn/archive/2015/09/05/427124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下Mysql5.6.10 Master Slave配置</title><link>http://www.blogjava.net/stevenjohn/archive/2015/08/10/426701.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 09 Aug 2015 19:26:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/08/10/426701.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/426701.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/08/10/426701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/426701.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/426701.html</trackback:ping><description><![CDATA[<p><strong>环境</strong></p> <p>配置Mysql的MasterSlave至少需要两台机器。我这里使用三台虚拟机进行测试。三台机器配置完全一样，MySQL安装的路径也是一样：</p> <p>第一台：10.1.5.181； Windows 2008 DataCenter + MySQL Community Server 5.6.10.1</p> <p>第二台：10.1.5.182； Windows 2008 DataCenter + MySQL Community Server 5.6.10.1</p> <p>第三台：10.1.5.183； Windows 2008 DataCenter + MySQL Community Server 5.6.10.1</p> <p>&nbsp;</p> <p>第一台10.1.5.181用作master，其他两台用做slave。</p> <p><strong>配置Master</strong></p> <p>在10.1.5.181这台服务器上找到MySQL的配置文件my.ini。我的具体路径是在C:\ProgramData\MySQL\MySQL Server  5.6下。</p> <p>打开配置文件，在最下面添加如下配置：</p> <p>************************************************************************************</p> <p>#Master start <br />#日志输出地址 主要同步使用 <br />log-bin=master-bin.log <br />#同步数据库  <br />binlog-do-db=test <br />#主机id 不能和从机id重复 <br />server-id=1 <br />#Master end</p> <p>************************************************************************************</p> <p>master的配置比较少，server-id是为这一组master/slave服务器定的唯一id，master/slave服务器中不能重复。在binlog-do-db中填写对象要同步的数据库，如果有多个，用逗号分隔，或再写一行如binlog-do-db=test2。</p> <p>&nbsp;</p> <p><strong>配置Slave</strong></p> <p>同样在第二台机器上10.1.5.181找到配置文件my.ini。打开配置文件，在最下面添加如下配置：</p> <p>*****************************************************************************</p> <p>report-host = 10.1.5.181 <br />report-user = root <br />report-password = root123  <br />log-bin = slave-bin.log <br />replicate-do-db = test</p> <p>server-id = 2</p> <p>*****************************************************************************</p> <p>这里需要添加master的IP，连接master的用户名和密码，生产环境中需要新建一个用户专门来处理replication，这里没有新建用户，用root做测试。端口没有配置，就是使用默认的3306，如果端口有变化，则通过report-port=？来配置。log-bin是记录日志的位置。</p> <p>然后通过命令start slave来启动mysql的复制功能。如果在start slave过程中出现异常：</p> <p>The server is not configured as slave; fix in config file or with CHANGE  MASTER TO</p> <p>可以通过下面语句解决：</p> <p>change master to  master_host='10.1.5.181',master_user='root',master_password='root123',master_log_file='master-bin.000001'  ,master_log_pos=120;</p> <p>使用show slave status 命令来查来看运行状态。特别关注两个属性，是否为&#8220;Yes&#8221;，如果都为&#8220;Yes&#8221;，则说明运行正常。</p> <p>Slave_IO_Running：连接到主库，并读取主库的日志到本地，生成本地日志文件</p> <p>Slave_SQL_Running:读取本地日志文件，并执行日志里的SQL命令。</p> <p>&nbsp;</p> <p>同样的配置再在第三台机器上配置一下，server-id修改成3。重启slave和master的mysqld服务。然后测试，在三台服务器上都确保有数据库test，然后在master服务器的test数据库上建表和数据，之后再两台slave上面都会看见数据的同步。</p> <p>&nbsp;</p> <p>Mysql的MasterSlave同步时通过二进制文件进行同步的。在Master端，你可以在C:\ProgramData\MySQL\MySQL  Server  5.6\data的master-bin.log日志文件里看见所有同步的sql脚本，master-bin.log是配置master时候输入的。在slave端，你可以在MySQL02-relay-bin类似的文件中找到日志。<br /><br /></p><div>http://www.cnblogs.com/haoxinyue/archive/2013/04/02/2995280.html</div><img src ="http://www.blogjava.net/stevenjohn/aggbug/426701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-08-10 03:26 <a href="http://www.blogjava.net/stevenjohn/archive/2015/08/10/426701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 分组排序</title><link>http://www.blogjava.net/stevenjohn/archive/2015/04/17/424484.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 16 Apr 2015 17:29:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/04/17/424484.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/424484.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/04/17/424484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/424484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/424484.html</trackback:ping><description><![CDATA[先建立表：<br /><div>CREATE TABLE `student` ( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', &nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`name` varchar(100) DEFAULT NULL COMMENT 'name', &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`ban` varchar(100) DEFAULT NULL COMMENT 'ban', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`score` int(11) DEFAULT NULL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PRIMARY KEY (`id`), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;KEY `inx_ban` (`ban`) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 &nbsp;</div><br />name：学生名<br />ban：班级<br />score：分数<br />1、按班级分组排序，取出分数前两名的同学。<br /><div><span style="font-size: 12px;">select t.ban,t.score,t.name from student t where 2&lt;(select count(*) from student k where k.ban=t.ban and t.score&gt;k.score order by k.ban desc) order by t.ban,t.score desc;</span></div><div style="font-size: 12px;"></div><div>示例如下：<br /><div>one<span style="white-space:pre">	</span>100<span style="white-space:pre">	</span>abin1</div><div>one<span style="white-space:pre">	</span>99<span style="white-space:pre">	</span>abin2</div><div>three<span style="white-space:pre">	</span>100<span style="white-space:pre">	</span>varyall1</div><div>three<span style="white-space:pre">	</span>99<span style="white-space:pre">	</span>varyall2</div><div>two<span style="white-space:pre">	</span>100<span style="white-space:pre">	</span>lee1</div><div>two<span style="white-space:pre">	</span>99<span style="white-space:pre">	</span>lee2</div>2、按组统计出来每组的所有分组，用逗号隔开<br /><div>select t.ban,group_concat(t.score) from student t group by t.ban</div><div>示例如下：</div><div><span style="font-size: 12px;">one<span style="white-space: pre;">	</span>100,99,97,95,91</span></div><div><span style="font-size: 12px;">three<span style="white-space:pre">	</span>100,99,97,95,91</span></div><div><span style="font-size: 12px;">two<span style="white-space: pre;">	</span>100,99,97,95,91</span></div><br /><br /><br /></div><div style="font-family: Tahoma; font-size: 11px;"></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/424484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-04-17 01:29 <a href="http://www.blogjava.net/stevenjohn/archive/2015/04/17/424484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql sql优化</title><link>http://www.blogjava.net/stevenjohn/archive/2015/04/08/424231.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 08 Apr 2015 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/04/08/424231.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/424231.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/04/08/424231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/424231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/424231.html</trackback:ping><description><![CDATA[初级优化：<br />1、select这些关键字大写，否则，系统会自动的转化为大写才去执行sql的解释执行计划。<br />2、如果需要字段少的话选择select a,b,c from table ,尽量少用select * from table.<br />3、尽量少使用!=和&lt;&gt;因为不会使用到索引。<br />4、尽量少使用or，不会使用到索引.<br />5、避免使用is not null 和not in,like，不会使用到索引。<br />6、避免全表扫描，在where和order by 上面建立索引。<br />7、应尽量避免在 where 子句中对字段进行表达式操作，这将导致引擎放弃使用索引而进行全表扫描。如： <div>select id from t where num/2=100</div> <div>应改为:</div> <div>select id from t where num=100*2</div>8、应尽量避免在where子句中对字段进行函数操作，这将导致引擎放弃使用索引而进行全表扫描。<br />9、不要在 where 子句中的&#8220;=&#8221;左边进行函数、算术运算或其他表达式运算，否则系统将可能无法正确使用索引。<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/424231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-04-08 21:33 <a href="http://www.blogjava.net/stevenjohn/archive/2015/04/08/424231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树-&gt;B-tree-&gt;b+tree-&gt;b+tree改良</title><link>http://www.blogjava.net/stevenjohn/archive/2015/04/07/424205.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 07 Apr 2015 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/04/07/424205.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/424205.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/04/07/424205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/424205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/424205.html</trackback:ping><description><![CDATA[<div>二叉树-&gt;b-树，解决的是读索引的IO次数问题<br /><br /><span style="font-family: 新宋体, 'MS Sans Serif', sans-serif; font-size: 12px; line-height: normal; background-color: #ffedc4;">在真实的数据库中</span><br /><div>往往索引本身的数据量也是非常庞大的</div><span style="font-family: 新宋体, 'MS Sans Serif', sans-serif; font-size: 12px; line-height: normal;">树的查找，其实是每一层需要做一次判断</span><br /><div>因为索引很大，只能存在文件里，不能一次加载，所以没判断一层，都需要有一次磁盘IO，所以查找IO次数最坏的情况</div><div>就是树的高度-1，加入你要的节点在最后一层的话</div><span style="font-family: 新宋体, 'MS Sans Serif', sans-serif; font-size: 12px; line-height: normal;">二叉树，是只有两个子节点的</span><br /><div>一单数据量一大的话</div><span style="font-family: 新宋体, 'MS Sans Serif', sans-serif; font-size: 12px; line-height: normal; background-color: #ffedc4;">树高会很恐怖</span><br /><div>B-Tree，的度是没有限制的</div><span style="font-family: 新宋体, 'MS Sans Serif', sans-serif; font-size: 12px; line-height: normal;">可以打打减少这个数的高度，从而减少磁盘读的次数</span><br /><br /><br /><div>b-tree -&gt; b+tree :这个是针对IO的再次优化</div><div>b+tree，的父节点是不存数据的</div><div>&nbsp;数据库索引，其实一个节点刚好占的是硬盘的一页空间</div><div>&nbsp;由于索引节点不存数据</div><div>&nbsp;一个硬盘页，也就是一个节点的度就可以更大</div><div>&nbsp;可以最大程度减少树的高度</div><div>&nbsp;之所以一个节点刚好占一页，也是IO的问题，一次硬盘IO只能读一页</div><div>&nbsp;这是结构上的改进</div><div>&nbsp;效果就是一个节点一次IO的度更大了</div><div>&nbsp;他这个意思就是说，如果有索引，一次索引查找，基本不会超过2次硬盘IO</div><div>&nbsp;这还只是b-tree</div><div>&nbsp;b-tree这玩意儿就读B树</div><div>&nbsp;很多人读B减数是误读</div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/424205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-04-07 22:39 <a href="http://www.blogjava.net/stevenjohn/archive/2015/04/07/424205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL垂直和水平切分</title><link>http://www.blogjava.net/stevenjohn/archive/2015/03/24/423793.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 24 Mar 2015 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/03/24/423793.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/423793.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/03/24/423793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/423793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/423793.html</trackback:ping><description><![CDATA[replication的限制:一旦数据库过于庞大，尤其是当写入过于频繁，很难由一台主机支撑的时候，我们还是会面临到扩展瓶颈。数据切分(sharding):通过某种特定的条件，将我们存放在同一个数据库中的数据分散存放到多个数据库（主机）上面，以达到分散单台设备负载的效果。。数据的切分同时还可以提高系统的总体可用性，因为单台设备Crash之后，只有总体数据的某部分不可用，而不是所有的数据。<br /><br /><u><em><strong>数据的切分（Sharding）模式<br /></strong></em></u><br />一种是按照不同的表（或者Schema）来切分到不同的数据库（主机）之上，这种切可以称之为数据的垂直（纵向）切分；另外一种则是根据表中的数据的逻辑关系，将同一个表中的数据按照某种条件拆分到多台数据库（主机）上面，这种切分称之为数据的水平（横向）切分。<br /><br /><u><em><strong>垂直切分:</strong></em></u><br /><br />一个架构设计较好的应用系统，其总体功能肯定是由很多个功能模块所组成的，而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中，各个功能模块相互之间的交互点越统一越少，系统的耦合度就越低，系统各个模块的维护性以及扩展性也就越好。这样的系统，实现数据的垂直切分也就越容易。<br /><br />一般来说，如果是一个负载相对不是很大的系统，而且表关联又非常的频繁，那可能数据库让步，将几个相关模块合并在一起减少应用程序的工作的方案可以减少较多的工作量，这是一个可行的方案。一个垂直拆分的例子:<br /><br />1.用户模块表：user,user_profile,user_group,user_photo_album<br />2.群组讨论表：groups,group_message,group_message_content,top_message<br />3.相册相关表：photo,photo_album,photo_album_relation,photo_comment<br />4.事件信息表：event<br /><br /><br /> <ul> <li><em>群组讨论模块和用户模块之间主要存在通过用户或者是群组关系来进行关联。一般关联的时候都会是通过用户的id或者nick_name以及group的id来进行关联，通过模块之间的接口实现不会带来太多麻烦；</em>   </li><li><em>相册模块仅仅与用户模块存在通过用户的关联。这两个模块之间的关联基本就有通过用户id关联的内容，简单清晰，接口明确；</em>  </li><li><em>事件模块与各个模块可能都有关联，但是都只关注其各个模块中对象的ID信息，同样可以做到很容易分拆。</em>  </li></ul><br /><u><em><strong>垂直切分的优点</strong></em></u><br /><br /> <ul> <li><em>数据库的拆分简单明了，拆分规则明确；</em>  </li><li><em>应用程序模块清晰明确，整合容易；</em>  </li><li><em>数据维护方便易行，容易定位；</em> </li></ul><u><em><strong><br />垂直切分的缺点</strong></em></u><br /><br /> <ul> <li><em>部分表关联无法在数据库级别完成，需要在程序中完成<em>；</em> </em> </li><li><em>对于访问极其频繁且数据量超大的表仍然存在性能瓶颈，不一定能满足要求；</em>  </li><li><em>事务处理相对更为复杂<em>；</em> </em> </li><li><em>切分达到一定程度之后，扩展性会遇到限制；</em>  </li><li><em>过读切分可能会带来系统过渡复杂而难以维护。</em>  </li></ul><br /><u><em><strong>水平切分</strong></em></u><br /><br />将某个访问极其频繁的表再按照某个字段的某种规则来分散到多个表之中，每个表中包含一部分数据。<br /><br />对于上面的例子:所有数据都是和用户关联的，那么我们就可以根据用户来进行水平拆分，将不同用户的数据切分到不同的数据库中。<br /><br />现在互联网非常火爆的Web2.0类型的网站，基本上大部分数据都能够通过会员用户信息关联上，可能很多核心表都非常适合通过会员ID来进行数据的水平切分。而像论坛社区讨论系统，就更容易切分了，非常容易按照论坛编号来进行数据的水平切分。切分之后基本上不会出现各个库之间的交互。<br /><u><em><strong><br />水平切分的优点</strong></em></u><br /><br /> <ul> <li><em>表关联基本能够在数据库端全部完成；</em>  </li><li><em>不会存在某些超大型数据量和高负载的表遇到瓶颈的问题；</em>  </li><li><em>应用程序端整体架构改动相对较少；</em>  </li><li><em>事务处理相对简单；</em>  </li><li><em>只要切分规则能够定义好，基本上较难遇到扩展性限制；</em>  </li></ul><br /><u><em><strong>水平切分的缺点</strong></em></u><br /><br /> <ul> <li><em>切分规则相对更为复杂，很难抽象出一个能够满足整个数据库的切分规则；</em>  </li><li><em>后期数据的维护难度有所增加，人为手工定位数据更困难；</em>  </li><li><em>应用系统各模块耦合度较高，可能会对后面数据的迁移拆分造成一定的困难。</em>  </li></ul><br /><u><em><strong>两种切分结合用:</strong></em></u><br /><br />一般来说，我们数据库中的所有表很难通过某一个（或少数几个）字段全部关联起来，所以很难简单的仅仅通过数据的水平切分来解决所有问题。而垂直切分也只能解决部分问题，对于那些负载非常高的系统，即使仅仅只是单个表都无法通过单台数据库主机来承担其负载。我们必须结合&#8220;垂直&#8221;和&#8220;水平&#8221;两种切分方式同时使用<br /><br />每一个应用系统的负载都是一步一步增长上来的，在开始遇到性能瓶颈的时候，大多数架构师和DBA都会选择先进行数据的垂直拆分，因为这样的成本最先，最符合这个时期所追求的最大投入产出比。然而，随着业务的不断扩张，系统负载的持续增长，在系统稳定一段时期之后，经过了垂直拆分之后的数据库集群可能又再一次不堪重负，遇到了性能瓶颈。<br /><br />如果我们再一次像最开始那样继续细分模块，进行数据的垂直切分，那我们可能在不久的将来，又会遇到现在所面对的同样的问题。而且随着模块的不断的细化，应用系统的架构也会越来越复杂，整个系统很可能会出现失控的局面。<br /><br />这时候我们就必须要通过数据的水平切分的优势，来解决这里所遇到的问题。而且，我们完全不必要在使用数据水平切分的时候，推倒之前进行数据垂直切分的成果，而是在其基础上利用水平切分的优势来避开垂直切分的弊端，解决系统复杂性不断扩大的问题。而水平拆分的弊端（规则难以统一）也已经被之前的垂直切分解决掉了，让水平拆分可以进行的得心应手。<br /><br />示例数据库:<br /><br />假设在最开始，我们进行了数据的垂直切分，然而随着业务的不断增长，数据库系统遇到了瓶颈，我们选择重构数据库集群的架构。如何重构？考虑到之前已经做好了数据的垂直切分，而且模块结构清晰明确。而业务增长的势头越来越猛，即使现在进一步再次拆分模块，也坚持不了太久。<br /><br />==&gt;选择了在垂直切分的基础上再进行水平拆分。<br /><br />==&gt;在经历过垂直拆分后的各个数据库集群中的每一个都只有一个功能模块，而每个功能模块中的所有表基本上都会与某个字段进行关联。如用户模块全部都可以通过用户ID进行切分，群组讨论模块则都通过群组ID来切分，相册模块则根据相册ID来进切分，最后的事件通知信息表考虑到数据的时限性（仅仅只会访问最近某个事件段的信息），则考虑按时间来切分。<br /><br /><u><em><strong>数据切分以及整合方案.</strong></em></u><br /><br />数据库中的数据在经过垂直和（或）水平切分被存放在不同的数据库主机之后，应用系统面临的最大问题就是如何来让这些数据源得到较好的整合，其中存在两种解决思路：<br /><br /> <ul> <li><em>在每个应用程序模块中配置管理自己需要的一个（或者多个）数据源，直接访问各个数据库，在模块内完成数据的整合；</em>  </li><li><em>通过中间代理层来统一管理所有的数据源，后端数据库集群对前端应用程序透明；</em>  </li></ul><br />第二种方案,虽然短期内需要付出的成本可能会相对更大一些，但是对整个系统的扩展性来说，是非常有帮助的。针对第二种方案，可以选择的方法和思路有：<br /><br /><u><em><strong>1.利用MySQLProxy  实现数据切分及整合.</strong></em></u><br /><br />可用来监视、分析或者传输他们之间的通讯信息。他的灵活性允许你最大限度的使用它，目前具备的功能主要有连接路由，Query分析，Query过滤和修改，负载均衡，以及基本的HA机制等。MySQLProxy  本身并不具有上述所有的这些功能，而是提供了实现上述功能的基础。要实现这些功能，还需要通过我们自行编写LUA脚本来实现。<br /><br />原理:MySQLProxy  实际上是在客户端请求与MySQLServer 之间建立了一个连接池。所有客户端请求都是发向MySQLProxy，然后经由MySQLProxy  进行相应的分析，判断出是读操作还是写操作，分发至对应的MySQLServer  上。对于多节点Slave集群，也可以起做到负载均衡的效果。<br /><br /><u><em><strong>2.利用Amoeba实现数据切分及整合</strong></em></u><br /><br />Amoeba是一个基于Java开发的，专注于解决分布式数据库数据源整合Proxy程序的开源框架，Amoeba已经具有Query路由，Query过滤，读写分离，负载均衡以及HA机制等相关内容。Amoeba主要解决的以下几个问题：<br /><br /> <ul> <li><em>数据切分后复杂数据源整合；</em>  </li><li><em>提供数据切分规则并降低数据切分规则给数据库带来的影响；</em>  </li><li><em>降低数据库与客户端的连接数；</em>  </li><li><em>读写分离路由；</em> </li></ul><br />AmoebaFor MySQL  主要是专门针对MySQL数据库的解决方案，前端应用程序请求的协议以及后端连接的数据源数据库都必须是MySQL。对于客户端的任何应用程序来说，AmoebaForMySQL  和一个MySQL数据库没有什么区别，任何使用MySQL协议的客户端请求，都可以被AmoebaFor MySQL  解析并进行相应的处理。<br /><br />Proxy程序常用的功能如读写分离，负载均衡等配置都在amoeba.xml中进行。Amoeba已经支持了实现数据的垂直切分和水平切分的自动路由，路由规则可以在rule.xml进行设置。<br /><u><em><strong><br />3.利用HiveDB实现数据切分及整合</strong></em></u><br /><br />HiveDB同样是一个基于Java针对MySQL数据库的提供数据切分及整合的开源框架，只是目前的HiveDB仅仅支持数据的水平切分。主要解决大数据量下数据库的扩展性及数据的高性能访问问题，同时支持数据的冗余及基本的HA机制。<br /><br />HiveDB的实现机制与MySQLProxy  和Amoeba有一定的差异，他并不是借助MySQL的Replication功能来实现数据的冗余，而是自行实现了数据冗余机制，而其底层主要是基于HibernateShards  来实现的数据切分工作。数据切分与整合中可能存在的问题<br /><br /><u><em><strong>引入分布式事务的问题?</strong></em></u><br /><br />一旦数据进行切分被分别存放在多个MySQLServer中之后，不管我们的切分规则设计的多么的完美（实际上并不存在完美的切分规则），都可能造成之前的某些事务所涉及到的数据已经不在同一个MySQLServer  中了。<br /><br />==&gt;将一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的小事务，并通过应用程序来总控各个小事务。<br /><u><em><strong><br />跨节点Join的问题?</strong></em></u><br /><br />==&gt;先从一个节点取出数据,然后根据这些数据,再到另一个表中取数据.<br />==&gt;使用Federated存储引擎,问题是:乎如果远端的表结构发生了变更，本地的表定义信息是不会跟着发生相应变化的。<br /><br /><u><em><strong>跨节点合并排序分页问题?</strong></em></u><br /><br />==&gt;Join本身涉及到的多个表之间的数据读取一般都会存在一个顺序关系。但是排序分页就不太一样了，排序分页的数据源基本上可以说是一个表（或者一个结果集），本身并不存在一个顺序关系，所以在从多个数据源取数据的过程是完全可以并行的。这样，排序分页数据的取数效率我们可以做的比跨库Join更高，所以带来的性能损失相对的要更小。 &nbsp;<img src ="http://www.blogjava.net/stevenjohn/aggbug/423793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-03-24 16:13 <a href="http://www.blogjava.net/stevenjohn/archive/2015/03/24/423793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL SQL优化总结 </title><link>http://www.blogjava.net/stevenjohn/archive/2015/03/24/423792.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 24 Mar 2015 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/03/24/423792.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/423792.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/03/24/423792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/423792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/423792.html</trackback:ping><description><![CDATA[<h2><strong><span style="font-size: 14pt;">前言</span></strong></h2><p>有人反馈之前几篇文章过于理论缺少实际操作细节，这篇文章就多一些可操作性的内容吧。</p><p>注：这篇文章是以 MySQL 为背景，很多内容同时适用于其他关系型数据库，需要有一些索引知识为基础。</p><p>&nbsp;</p><h2><span style="font-size: 14pt;">优化目标</span></h2><p>　　1.减少 IO 次数</p><p>　　IO永远是数据库最容易瓶颈的地方，这是由数据库的职责所决定的，大部分数据库操作中超过90%的时间都是 IO 操作所占用的，减少 IO 次数是 SQL 优化中需要第一优先考虑，当然，也是收效最明显的优化手段。</p><p>　　2.降低 CPU 计算</p><p>　　除了 IO 瓶颈之外，SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct &#8230; 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后，降低 CPU 计算也就成为了我们 SQL 优化的重要目标</p><p>&nbsp;</p><h2><span style="font-size: 14pt;">优化方法</span></h2><p>　　改变 SQL 执行计划</p><p>　　明确了优化目标之后，我们需要确定达到我们目标的方法。对于 SQL 语句来说，达到上述2个目标的方法其实只有一个，那就是改变 SQL 的执行计划，让他尽量&#8220;少走弯路&#8221;，尽量通过各种&#8220;捷径&#8221;来找到我们需要的数据，以达到 &#8220;减少 IO 次数&#8221; 和 &#8220;降低 CPU 计算&#8221; 的目标</p><p><strong>&nbsp;</strong></p><h2><span style="font-size: 14pt;">常见误区</span></h2><p>&nbsp;</p><p>1.count(1)和count(primary_key) 优于 count(*)</p><p>　　很多人为了统计记录条数，就使用 count(1) 和 count(primary_key) 而不是 count(*) ，他们认为这样性能更好，其实这是一个误区。对于有些场景，这样做可能性能会更差，应为数据库对 count(*) 计数操作做了一些特别的优化。</p><p>&nbsp;</p><p>2.count(column) 和 count(*) 是一样的</p><p>　　这个误区甚至在很多的资深工程师或者是 DBA 中都普遍存在，很多人都会认为这是理所当然的。实际上，count(column) 和 count(*) 是一个完全不一样的操作，所代表的意义也完全不一样。</p><p>　　count(column) 是表示结果集中有多少个column字段不为空的记录</p><p>　　count(*) 是表示整个结果集有多少条记录</p><p>&nbsp;</p><p>3.select a,b from &#8230; 比 select a,b,c from &#8230; 可以让数据库访问更少的数据量</p><p>　　这个误区主要存在于大量的开发人员中，主要原因是对数据库的存储原理不是太了解。</p><p>　　实际上，大多数关系型数据库都是按照行(row)的方式存储，而数据存取操作都是以一个固定大小的IO单元(被称作 block 或者 page)为单位，一般为4KB，8KB&#8230; 大多数时候，每个IO单元中存储了多行，每行都是存储了该行的所有字段(lob等特殊类型字段除外)。</p><p>　　所以，我们是取一个字段还是多个字段，实际上数据库在表中需要访问的数据量其实是一样的。</p><p>　　当然，也有例外情况，那就是我们的这个查询在索引中就可以完成，也就是说当只取 a,b两个字段的时候，不需要回表，而c这个字段不在使用的索引中，需要回表取得其数据。在这样的情况下，二者的IO量会有较大差异。</p><p>&nbsp;</p><p>4.order by 一定需要排序操作</p><p>　　我们知道索引数据实际上是有序的，如果我们的需要的数据和某个索引的顺序一致，而且我们的查询又通过这个索引来执行，那么数据库一般会省略排序操作，而直接将数据返回，因为数据库知道数据已经满足我们的排序需求了。</p><p>　　实际上，利用索引来优化有排序需求的 SQL，是一个非常重要的优化手段</p><p>　　延伸阅读：MySQL ORDER BY 的实现分析，MySQL 中 GROUP BY 基本实现原理以及 MySQL DISTINCT 的基本实现原理这3篇文章中有更为深入的分析，尤其是第一篇</p><p>&nbsp;</p><p>5.执行计划中有 filesort 就会进行磁盘文件排序</p><p>　　有这个误区其实并不能怪我们，而是因为 MySQL 开发者在用词方面的问题。filesort 是我们在使用 explain 命令查看一条 SQL 的执行计划的时候可能会看到在 &#8220;Extra&#8221; 一列显示的信息。</p><p>　　实际上，只要一条 SQL 语句需要进行排序操作，都会显示&#8220;Using filesort&#8221;，这并不表示就会有文件排序操作。</p><p><strong>&nbsp;</strong></p><h2><span style="font-size: 14pt;">基本原则</span></h2><p>1.尽量少 join</p><p>　　MySQL 的优势在于简单，但这在某些方面其实也是其劣势。MySQL 优化器效率高，但是由于其统计信息的量有限，优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join，一方面由于其优化器受限，再者在 Join 这方面所下的功夫还不够，所以性能表现离 Oracle 等关系型数据库前辈还是有一定距离。但如果是简单的单表查询，这一差距就会极小甚至在有些场景下要优于这些数据库前辈。</p><p>&nbsp;</p><p>2.尽量少排序</p><p>　　排序操作会消耗较多的 CPU 资源，所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL 的响应时间。</p><p>　　对于MySQL来说，减少排序有多种办法，比如：</p><p>　　上面误区中提到的通过利用索引来排序的方式进行优化</p><p>　　减少参与排序的记录条数</p><p>　　非必要不对数据进行排序</p><p>　　&#8230;</p><p>&nbsp;</p><p>3.尽量避免 select *</p><p>　　很多人看到这一点后觉得比较难理解，上面不是在误区中刚刚说 select 子句中字段的多少并不会影响到读取的数据吗?</p><p>　　是的，大多数时候并不会影响到 IO 量，但是当我们还存在 order by 操作的时候，select 子句中的字段多少会在很大程度上影响到我们的排序效率，这一点可以通过我之前一篇介绍 MySQL ORDER BY 的实现分析的文章中有较为详细的介绍。</p><p>　　此外，上面误区中不是也说了，只是大多数时候是不会影响到 IO 量，当我们的查询结果仅仅只需要在索引中就能找到的时候，还是会极大减少 IO 量的。</p><p>&nbsp;</p><p>4.尽量用 join 代替子查询</p><p>　　虽然 Join 性能并不佳，但是和 MySQL 的子查询比起来还是有非常大的性能优势。MySQL 的子查询执行计划一直存在较大的问题，虽然这个问题已经存在多年，但是到目前已经发布的所有稳定版本中都普遍存在，一直没有太大改善。虽然官方也在很早就承认这一问题，并且承诺尽快解决，但是至少到目前为止我们还没有看到哪一个版本较好的解决了这一问题。</p><p>&nbsp;</p><p>5.尽量少 or</p><p>　　当 where 子句中存在多个条件以&#8220;或&#8221;并存的时候，MySQL 的优化器并没有很好的解决其执行计划优化问题，再加上 MySQL 特有的 SQL 与 Storage 分层架构方式，造成了其性能比较低下，很多时候使用 union all 或者是union(必要的时候)的方式来代替&#8220;or&#8221;会得到更好的效果。</p><p>&nbsp;</p><p>6.尽量用 union all 代替 union</p><p>　　union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作，这就会涉及到排序，增加大量的 CPU 运算，加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候，尽量使用 union all 而不是 union。</p><p>&nbsp;</p><p>7.尽量早过滤</p><p>　　这一优化策略其实最常见于索引的优化设计中(将过滤性更好的字段放得更靠前)。</p><p>　　在 SQL 编写中同样可以使用这一原则来优化一些 Join 的 SQL。比如我们在多个表进行分页数据查询的时候，我们最好是能够在一个表上先过滤好数据分好页，然后再用分好页的结果集与另外的表 Join，这样可以尽可能多的减少不必要的 IO 操作，大大节省 IO 操作所消耗的时间。</p><p>&nbsp;</p><p>8.避免类型转换</p><p>　　这里所说的&#8220;类型转换&#8221;是指 where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换：</p><p>　　人为在column_name 上通过转换函数进行转换</p><p>　　直接导致 MySQL(实际上其他数据库也会有同样的问题)无法使用索引，如果非要转换，应该在传入的参数上进行转换</p><p>　　由数据库自己进行转换</p><p>　　如果我们传入的数据类型和字段类型不一致，同时我们又没有做任何类型转换处理，MySQL 可能会自己对我们的数据进行类型转换操作，也可能不进行处理而交由存储引擎去处理，这样一来，就会出现索引无法使用的情况而造成执行计划问题。</p><p>&nbsp;</p><p>9.优先优化高并发的 SQL，而不是执行频率低某些&#8220;大&#8221;SQL</p><p>　　对于破坏性来说，高并发的 SQL 总是会比低频率的来得大，因为高并发的 SQL 一旦出现问题，甚至不会给我们任何喘息的机会就会将系统压跨。而对于一些虽然需要消耗大量 IO 而且响应很慢的 SQL，由于频率低，即使遇到，最多就是让整个系统响应慢一点，但至少可能撑一会儿，让我们有缓冲的机会。</p><p>&nbsp;</p><p>10.从全局出发优化，而不是片面调整</p><p>　　SQL 优化不能是单独针对某一个进行，而应充分考虑系统中所有的 SQL，尤其是在通过调整索引优化 SQL 的执行计划的时候，千万不能顾此失彼，因小失大。</p><p>&nbsp;</p><p>11.尽可能对每一条运行在数据库中的SQL进行 explain</p><p>　　优化 SQL，需要做到心中有数，知道 SQL 的执行计划才能判断是否有优化余地，才能判断是否存在执行计划问题。在对数据库中运行的 SQL 进行了一段时间的优化之后，很明显的问题 SQL 可能已经很少了，大多都需要去发掘，这时候就需要进行大量的 explain 操作收集执行计划，并判断是否需要进行优化。</p><p><strong>&nbsp;</strong></p><p>原文地址：http://isky000.com/database/mysql-performance-tuning-sql</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/423792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-03-24 15:51 <a href="http://www.blogjava.net/stevenjohn/archive/2015/03/24/423792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql查询结果导出到文件</title><link>http://www.blogjava.net/stevenjohn/archive/2015/02/04/422735.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 04 Feb 2015 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/02/04/422735.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/422735.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/02/04/422735.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/422735.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/422735.html</trackback:ping><description><![CDATA[<div>方法一：</div><div>直接执行命令：</div><div>mysql&gt; select count(1) from table &nbsp; into outfile '/tmp/test.xls';</div><div>Query OK, 31 rows affected (0.00 sec)</div><div>在目录/tmp/下会产生文件test.xls</div><div>遇到的问题：</div><div>mysql&gt; select count(1) from table &nbsp; into outfile '/data/test.xls';</div><div>报错：</div><div>ERROR 1 (HY000): Can't create/write to file '/data/test.xls' (Errcode: 13)</div><div>可能原因：mysql没有向/data/下写的权限，没有深究</div><div></div><div>方法二：</div><div>查询都自动写入文件：</div><div>mysql&gt; pager cat &gt; /tmp/test.txt ;</div><div>PAGER set to 'cat &gt; /tmp/test.txt'</div><div>之后的所有查询结果都自动写入/tmp/test.txt'，并前后覆盖</div><div>mysql&gt; select * from table ;</div><div>30 rows in set (0.59 sec)</div><div>在框口不再显示查询结果</div><div>以上参考：http://blog.163.com/cpu_driver/blog/static/117663448201111295420990/</div><div></div><div>方法三：</div><div>跳出mysql命令行</div><div>[root@SHNHDX63-146 ~]# mysql -h127.0.0.1 -uroot -pXXXX -P3306 -e"select * from table" &gt; /tmp/test/txt</div><img src ="http://www.blogjava.net/stevenjohn/aggbug/422735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-02-04 14:50 <a href="http://www.blogjava.net/stevenjohn/archive/2015/02/04/422735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql解决select ... into outfile '..' mysql写文件权限问题 </title><link>http://www.blogjava.net/stevenjohn/archive/2015/02/04/422733.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 04 Feb 2015 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/02/04/422733.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/422733.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/02/04/422733.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/422733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/422733.html</trackback:ping><description><![CDATA[<div style="color: #323e32; font-family: simsun; background-color: #55734f;">select FQQ,FScoreCount from Tbl_User into outfile "/tmp/terminatedtest.txt" fields terminated by ",";</div><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #323e32; font-family: simsun; background-color: #55734f;"><br /><br />select * from test into outfile '/home/user/test.txt'<br /><br />在linux（centos）下 ，启动了mysql 并给用户文件读写的权利<br />grant file on *.* to root@localhost;<br /><br />在linux系统上，目录的权限全部是 rwxrwxrwx<br />chmod 777 ...<br />/home/user/test<br />drwxrwxrwx&nbsp;<wbr>&nbsp;<wbr>4 root root&nbsp;<wbr>&nbsp;<wbr>4096 Sep&nbsp;<wbr>&nbsp;<wbr>3 18:42 home<br />drwxrwxrwx 10 mapuser mapuser 4096 Sep&nbsp;<wbr>&nbsp;<wbr>4 03:41 user<br />drwxrwxrwx 5 mapuser mapuser 4096 Sep&nbsp;<wbr>&nbsp;<wbr>3 17:57 test<br /><br /><br />在mysql下输入<br />select * from test into outfile '/home/user/test.txt'<br />出现错误信息：<br />ERROR 1 (HY000): Can't create/write to file '/home/user/test.txt' (Errcode: 13)<br />当时如果是tmp目录的话就不会有这个错误<br />select * from test into outfile '/tmp/test.txt'<br />Query OK, 0 rows test(0.00 sec)<br /><br />难道只能是tmp目录吗？<br />有什么地方可以修改的吗？<br />后来吧home的所有者改成了mysql<br />drwxrwxrwx&nbsp;<wbr>&nbsp;<wbr>5 mysql mysql&nbsp;<wbr>&nbsp;<wbr>4096 Sep&nbsp;<wbr>&nbsp;<wbr>4 10:08 home<br />select * from test into outfile '/home/test.txt'<br /><br />ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)<br />也是同样出错。<br /><br />这个有什么办法可以写入home目录下面吗？或者其他什么目录，只要不是tmp目录，有人说先写入tmp目录，再cp到想要的<br />目录，这样做是可以，不过比较麻烦，文件比较大，2-3G呢，<br /><br />修改mysql的配置能实现吗？还是修改文件的权限，这个是什么问题呢？<br /><br /><br />select * from test into outfile '/tmp/test.txt'<br />Query OK, 0 rows test(0.00 sec)<br /><br />看一下产生的这个文件的owner 是谁。<br /></p><div style="color: #323e32; font-family: simsun; background-color: #55734f;"><br />[root@localhost /]# ls -l<br />drwxrwxrwx&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>4 root&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;root&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;4096&nbsp;<wbr>&nbsp;<wbr>9月&nbsp;<wbr>&nbsp;<wbr>4 21:03 home<br />drwxrwxrwt&nbsp;<wbr>&nbsp;<wbr>&nbsp;10 root&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;root&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;4096&nbsp;<wbr>&nbsp;<wbr>9月&nbsp;<wbr>&nbsp;<wbr>4&nbsp;21:03 tmp<br /><br />[root@localhost /]# mysql<br />Welcome to the MySQL monitor.&nbsp;<wbr>&nbsp;<wbr>Commands end with ; or \g.<br />Your MySQL connection id is 27<br />Server version: 5.1.14-beta MySQL Community Server (GPL)<br /><br />Type 'help;' or '\h' for help. Type '\c' to clear&nbsp;the buffer.<br /><br />mysql&gt; use mysql;<br />Reading table information for completion of table and column names<br />You can turn off this feature to get a quicker startup with -A<br /><br />Database changed<br /><br />mysql&gt; select user from user;<br />+--------+<br />| user&nbsp;<wbr>&nbsp;<wbr>&nbsp;|<br />+--------+<br />| system |<br />| root&nbsp;<wbr>&nbsp;<wbr>&nbsp;|<br />+--------+<br />2 rows in set (0.03 sec)<br /><br />mysql&gt; select user from user into outfile '/home/test.txt';<br />Query OK, 2 rows affected (0.02 sec)<br /><br />[root@localhost home]# ls -l<br />-rw-rw-rw-&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>1 mysql&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>mysql&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>12&nbsp;<wbr>&nbsp;<wbr>9月&nbsp;<wbr>&nbsp;<wbr>4 21:12 test.txt<br /><br />[root@localhost home]# cat /home/test.txt<br />system<br />root</div><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding: 0px; border: 0px; list-style: none; word-wrap: normal; word-break: normal; color: #323e32; font-family: simsun; background-color: #55734f;"><br />select * from test into outfile '/home/test.txt'<br /><br />ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)<br />------------------------<br />从Errcode: 13来看是没权限<br />你执行上面语句时，是用什么用户执行的呢？检查下这个用户是否有权限吧<br /><br />估计和权限没关系，因为已经是777了。<br /><br />看看是不是selinux打开了，如果没什么特别需要的话，关了为好。<br /><br />非root用户，在mysql下执行的select * from test into outfile '/home/user/test.txt'<br /><br /><br />select * from test into outfile '/home/user/test.txt'该语句产生的文件是<br />-rw-rw-rw-&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>1 mysql&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>mysql&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>12&nbsp;<wbr>&nbsp;<wbr>9月&nbsp;<wbr>&nbsp;<wbr>4 21:12 test.txt<br />mysql组的mysql用户的。<br /><br />貌似和权限没什么关系，我用root用户登陆系统，执行mysql的语句，其结果还是一样，写入/home目录时<br />select * from test into outfile '/home/test.txt'<br />ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)<br />还是有这个问题。<br />selinux会阻止其他程序写入操作？？<br />具体怎么改变一下selinx的配置呢<br /><br />我理清是什么问题了。<br />在red hat系列的linux中selinux对哪些daemon可以进行怎么样的操作是有限制的，mysql的select into outfile的命令是mysql的daemon来负责写文件操作的。写文件之前当然要具有写文件的权限。而selinux对这个权限做了限制。如果 selinux是关闭的吧，这个命令执行是没有问题的<br />mysql&gt; select user from user into outfile '/home/test.txt';<br />Query OK, 2 rows affected (0.02 sec)<br />当时selinux开启时<br />selinux对mysql的守护进程mysqld进行了限制。<br />mysql&gt; select user from user into outfile '/home/test.txt';<br />ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)<br />出现了没有权限写的error。<br />解决方法，可以关闭selinux。<br />可以在/etc/selinux中找到config<br />root用户，<br />shell&gt;vi /etc/selinux/config<br /><br /># This file controls the state of SELinux on the system.<br /># SELINUX= can take one of these three values:<br />#&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>enforcing - SELinux security policy is enforced.<br />#&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>permissive - SELinux prints warnings instead of enforcing.<br />#&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>disabled - SELinux is fully disabled.<br />SELINUX=enforcing<br /><br />修改SELINUX=disabled关闭selinux就可以了，这个问题就可以解决了。<br />不过全部关闭SELINUX有带来一些安全问题。<br />当然也可以，单独给mysql的守护进程权限，<br />shell&gt;getsebool -a可以查看当前的对系统一系列守护进程的权限情况。<br /><br />lpd_disable_trans --&gt; off<br />mail_read_content --&gt; off<br />mailman_mail_disable_trans --&gt; off<br />mdadm_disable_trans --&gt; off<br />mozilla_read_content --&gt; off<br />mysqld_disable_trans --&gt; off<br />nagios_disable_trans --&gt; off<br />named_disable_trans --&gt; off<br />named_write_master_zones --&gt; off<br />nfs_export_all_ro --&gt; on<br />nfs_export_all_rw --&gt; on<br />nfsd_disable_trans --&gt; off<br />nmbd_disable_trans --&gt; off<br />nrpe_disable_trans --&gt; off<br /><br />shell&gt;setsebool -P mysqld_disable_trans=1<br />开启对mysql守护进程的权限，这样<br />mysql&gt; select user from user into outfile '/home/test.txt';<br />写入到自定义的目录就没有问题了。<br />-P表示 是永久性设置，否则重启之后又恢复预设值。<br />getsebool setsebool命令在root用户下有权限。<br /><br />除了对selinux的权限，当然首先要保证该目录拥有读写权限。<br /><br /><br />在ubuntu下 ，可以对AppArmor(/etc/apparmor.d/usr.sbin.mysqld) 修改，类似selinux。<br />添加/etc/squid/lists/eighties.txt w,类似。</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/422733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-02-04 14:31 <a href="http://www.blogjava.net/stevenjohn/archive/2015/02/04/422733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>启动和关闭MySQL服务</title><link>http://www.blogjava.net/stevenjohn/archive/2015/01/07/422106.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 07 Jan 2015 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/01/07/422106.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/422106.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/01/07/422106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/422106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/422106.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong>在windows下</strong>&nbsp;：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 启动：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.cd c:/mysql/bin</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.mysqld --console</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 关闭：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.cd c:/mysql/bin</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.mysqladmin -uroot shutdown</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp; 还可以：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.cd c:/mysql/bin</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.net start mysql5</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 关闭：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.cd c:/mysql/bin</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.net stop mysql5</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><strong>在linux下：</strong></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 采用netstat -nlp查看mysql服务的状态</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; 命令行方式：</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开启&nbsp; ./mysqld_safe &amp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭&nbsp; mysqladmin -uroot shutdown</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp; rpm方式安装的</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开启&nbsp; service mysql start</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭&nbsp; service mysql stop</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp; 在命令行启动mysql时，如不加"--console"，启动、关闭信息不在界面中显示，而是记录在安装目录下的data目录里，文件名一般是hostname.err,通过此文件查看mysql的控制台信息。</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/422106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-01-07 13:13 <a href="http://www.blogjava.net/stevenjohn/archive/2015/01/07/422106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql -- InnoDb索引</title><link>http://www.blogjava.net/stevenjohn/archive/2015/01/06/422095.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 06 Jan 2015 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/01/06/422095.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/422095.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/01/06/422095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/422095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/422095.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt"><span xml:lang="EN-US">innodb</span><span style="font-family: 宋体;">作为事务型数据库的首选引擎，支持</span><span xml:lang="EN-US">ACID</span><span style="font-family: 宋体;">事务，支持行级锁定，支持外键。并且</span><span xml:lang="EN-US">InnoDB</span><span style="font-family: 宋体;">默认地被包含在</span><span xml:lang="EN-US">MySQL</span><span style="font-family: 宋体;">二进制分发中，已经成为绝大多数</span><span xml:lang="EN-US">OLTP</span><span style="font-family: 宋体">系统的直选存储引擎。</span></p> <p style="text-indent: 21pt"></p> <p style="text-indent: 21pt"><span style="font-family: 宋体;">索引作为数据库开发的一个重要方面，对于访问性能以及能否支持高并发，高</span><span xml:lang="EN-US">tps</span><span style="font-family: 宋体;">的应用，起着决定性作用。</span><span xml:lang="EN-US">Innodb</span><span style="font-family: 宋体;">存储引擎支持</span><span xml:lang="EN-US">B+</span><span style="font-family: 宋体;">树索引以及自适应哈希索引，其中后者是由</span><span xml:lang="EN-US">innodb</span><span style="font-family: 宋体">引擎根据表的使用情况自动生成，无法进行人为创建。</span></p> <p style="text-indent: 21pt"></p> <p style="text-indent: 21pt"><span xml:lang="EN-US">B+</span><span style="font-family: 宋体">树索引是目前关系型数据库中最常见最有效的索引，是基于二分查找而形成的一棵平衡术结构。我们来逐步了解。<br /></span><span style="font-family: 'Microsoft YaHei', 宋体, 'Myriad Pro', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; text-indent: 0px; background-color: #ffffff;">MySQL就普遍使用B+Tree实现其索引结构<br /><br /></span><font face="宋体">索引的主要作用：<br />1、快速定位记录<br />2、避免排序和使用临时表<br />3、可以将随机IO变为顺序IO<br /><br /><br /><br /><br /></font></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/422095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-01-06 22:58 <a href="http://www.blogjava.net/stevenjohn/archive/2015/01/06/422095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>innodb innodb_adaptive_hash_index</title><link>http://www.blogjava.net/stevenjohn/archive/2014/12/24/421796.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 24 Dec 2014 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2014/12/24/421796.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/421796.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2014/12/24/421796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/421796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/421796.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">&nbsp; &nbsp; 哈希（hash）是一种非常快的查找方法，一般情况下查找的时间复杂度为O（1）。常用于连接（join）操作，如SQL Server和Oracle中的哈希连接（hash join）。但是SQL Server和Oracle等常见的数据库并不支持哈希索引（hash index）。MySQL的Heap存储引擎默认的索引类型为哈希，而InnoDB存储引擎提出了另一种实现方法，自适应哈希索引（adaptive hash index）。</p><p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">InnoDB存储引擎会监控对表上索引的查找，如果观察到建立哈希索引可以带来速度的提升，则建立哈希索引，所以称之为自适应（adaptive）的。自适应哈希索引通过缓冲池的B+树构造而来，因此建立的速度很快。而且不需要将整个表都建哈希索引，InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。</p><p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">根据InnoDB的官方文档显示，启用自适应哈希索引后，读取和写入速度可以提高2倍；对于辅助索引的连接操作，性能可以提高5倍。在我看来，自适应哈希索引是非常好的优化模式，其设计思想是数据库自优化（self-tuning），即无需DBA对数据库进行调整。</p><p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">通过命令SHOW ENGINE INNODB STATUS可以看到当前自适应哈希索引的使用状况，如下所示：</p><ol style="color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;"><li>mysql<span style="color: #993300; font-weight: bold;">&gt;</span>&nbsp;show&nbsp;engine&nbsp;innodb&nbsp;status\G; &nbsp;</li><li>***************************&nbsp;1.&nbsp;row&nbsp;*************************** &nbsp;</li><li><span style="color: red;">Status:</span>&nbsp; &nbsp;</li><li>===================================== &nbsp;</li><li>090922&nbsp;11:52:51&nbsp;INNODB&nbsp;MONITOR&nbsp;<span style="color: red;">OUTPUT</span>&nbsp;</li><li>===================================== &nbsp;</li><li>Per&nbsp;second&nbsp;averages&nbsp;calculated&nbsp;from&nbsp;the&nbsp;last&nbsp;15&nbsp;seconds &nbsp;</li><li>...... &nbsp;</li><li>------------------------------------- &nbsp;</li><li>INSERT&nbsp;BUFFER&nbsp;AND&nbsp;ADAPTIVE&nbsp;HASH&nbsp;INDEX &nbsp;</li><li>------------------------------------- &nbsp;</li><li>Ibuf:&nbsp;size&nbsp;2249,&nbsp;free&nbsp;list&nbsp;len&nbsp;3346,&nbsp;seg&nbsp;size&nbsp;5596, &nbsp;</li><li>374650&nbsp;inserts,&nbsp;51897&nbsp;merged&nbsp;recs,&nbsp;14300&nbsp;merges &nbsp;</li><li>Hash&nbsp;table&nbsp;size&nbsp;4980499,&nbsp;node&nbsp;heap&nbsp;has&nbsp;1246&nbsp;buffer(s) &nbsp;</li><li>1640.60&nbsp;hash&nbsp;searches/s,&nbsp;3709.46&nbsp;non-hash&nbsp;searches/s &nbsp;</li><li>......&nbsp;</li></ol><p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">现在可以看到自适应哈希索引的使用信息了，包括自适应哈希索引的大小、使用情况、每秒使用自适应哈希索引搜索的情况。值得注意的是，哈希索引只能用来搜索等值的查询，如select * from table where index_col = 'xxx'，而对于其他查找类型，如范围查找，是不能使用的。因此，这里出现了non-hash searches/s的情况。用hash searches : non-hash searches命令可以大概了解使用哈希索引后的效率。</p><p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">由于自适应哈希索引是由InnoDB存储引擎控制的，所以这里的信息只供我们参考。不过我们可以通过参数innodb_adaptive_hash_index来禁用或启动此特性，默认为开启。</p><p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px; background-color: #ffffff;">转自<a href="http://www.cnblogs.com/ylqmf/archive/2011/09/16/2179166.html" style="text-decoration: none; color: #0c89cf;">http://www.cnblogs.com/ylqmf/archive/2011/09/16/2179166.html</a></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/421796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2014-12-24 18:25 <a href="http://www.blogjava.net/stevenjohn/archive/2014/12/24/421796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql sql优化</title><link>http://www.blogjava.net/stevenjohn/archive/2014/03/10/410811.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 10 Mar 2014 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2014/03/10/410811.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/410811.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2014/03/10/410811.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/410811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/410811.html</trackback:ping><description><![CDATA[第一方面：30种mysql优化sql语句查询的方法<div></div><div><div>1.对查询进行优化，应尽量避免全表扫描，首先应考虑在 where 及 order by 涉及的列上建立索引。</div><div>　　2.应尽量避免在 where 子句中使用!=或&lt;&gt;操作符，否则将引擎放弃使用索引而进行全表扫描。</div><div>　　3.应尽量避免在 where 子句中对字段进行 null 值判断，否则将导致引擎放弃使用索引而进行全表扫描，如：</div><div>　　select id from t where num is null</div><div>　　可以在num上设置默认值0，确保表中num列没有null值，然后这样查询：</div><div>　　select id from t where num=0</div><div>　　4.应尽量避免在 where 子句中使用 or 来连接条件，否则将导致引擎放弃使用索引而进行全表扫描，如：</div><div>　　select id from t where num=10 or num=20</div><div>　　可以这样查询：</div><div>　　select id from t where num=10</div><div>　　union all</div><div>　　select id from t where num=20</div><div>　　5.下面的查询也将导致全表扫描：</div><div>　　select id from t where name like '%abc%'</div><div>　　若要提高效率，可以考虑全文检索。</div><div>　　6.in 和 not in 也要慎用，否则会导致全表扫描，如：</div><div>　　select id from t where num in(1,2,3)</div><div>　　对于连续的数值，能用 between 就不要用 in 了：</div><div>　　select id from t where num between 1 and 3</div><div>　　7.如果在 where 子句中使用参数，也会导致全表扫描。因为SQL只有在运行时才会解析局部变量，但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而，如果在编译时建立访问计划，变量的值还是未知的，因而无法作为索引选择的输入项。如下面语句将进行全表扫描：</div><div>　　select id from t where num=@num</div><div>　　可以改为强制查询使用索引：</div><div>　　select id from t with(index(索引名)) where num=@num</div><div>　　8.应尽量避免在 where 子句中对字段进行表达式操作，这将导致引擎放弃使用索引而进行全表扫描。如：</div><div>　　select id from t where num/2=100</div><div>　　应改为:</div><div>　　select id from t where num=100*2</div><div>　　9.应尽量避免在where子句中对字段进行函数操作，这将导致引擎放弃使用索引而进行全表扫描。如：</div><div>　　select id from t where substring(name,1,3)='abc'--name以abc开头的id</div><div>　　select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id</div><div>　　应改为:</div><div>　　select id from t where name like 'abc%'</div><div>　　select id from t where createdate&gt;='2005-11-30' and createdate&lt;'2005-12-1'</div><div>　　10.不要在 where 子句中的&#8220;=&#8221;左边进行函数、算术运算或其他表达式运算，否则系统将可能无法正确使用索引。</div><div>　　11.在使用索引字段作为条件时，如果该索引是复合索引，那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引，否则该索引将不会被使用，并且应尽可能的让字段顺序与索引顺序相一致。</div><div>　　12.不要写一些没有意义的查询，如需要生成一个空表结构：</div><div>　　select col1,col2 into #t from t where 1=0</div><div>　　这类代码不会返回任何结果集，但是会消耗系统资源的，应改成这样：</div><div>　　create table #t(...)</div><div>&nbsp;</div><div>　　13.很多时候用 exists 代替 in 是一个好的选择：</div><div>　　select num from a where num in(select num from b)</div><div>　　用下面的语句替换：</div><div>　　select num from a where exists(select 1 from b where num=a.num)</div><div>　　14.并不是所有索引对查询都有效，SQL是根据表中数据来进行查询优化的，当索引列有大量数据重复时，SQL查询可能不会去利用索引，如一表中有字段sex，male、female几乎各一半，那么即使在sex上建了索引也对查询效率起不了作用。</div><div>　　15.索引并不是越多越好，索引固然可以提高相应的 select 的效率，但同时也降低了 insert 及 update 的效率，因为 insert 或 update 时有可能会重建索引，所以怎样建索引需要慎重考虑，视具体情况而定。一个表的索引数最好不要超过6个，若太多则应考虑一些不常使用到的列上建的索引是否有必要。</div><div>　　16.应尽可能的避免更新 clustered 索引数据列，因为 clustered 索引数据列的顺序就是表记录的物理存储顺序，一旦该列值改变将导致整个表记录的顺序的调整，会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列，那么需要考虑是否应将该索引建为 clustered 索引。</div><div>　　17.尽量使用数字型字段，若只含数值信息的字段尽量不要设计为字符型，这会降低查询和连接的性能，并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符，而对于数字型而言只需要比较一次就够了。</div><div>　　18.尽可能的使用 varchar/nvarchar 代替 char/nchar ，因为首先变长字段存储空间小，可以节省存储空间，其次对于查询来说，在一个相对较小的字段内搜索效率显然要高些。</div><div>　　19.任何地方都不要使用 select * from t ，用具体的字段列表代替&#8220;*&#8221;，不要返回用不到的任何字段。</div><div>　　20.尽量使用表变量来代替临时表。如果表变量包含大量数据，请注意索引非常有限(只有主键索引)。</div><div>　　21.避免频繁创建和删除临时表，以减少系统表资源的消耗。</div><div>　　22.临时表并不是不可使用，适当地使用它们可以使某些例程更有效，例如，当需要重复引用大型表或常用表中的某个数据集时。但是，对于一次性事件，最好使用导出表。</div><div>　　23.在新建临时表时，如果一次性插入数据量很大，那么可以使用 select into 代替 create table，避免造成大量 log ，以提高速度;如果数据量不大，为了缓和系统表的资源，应先create table，然后insert。</div><div>　　24.如果使用到了临时表，在存储过程的最后务必将所有的临时表显式删除，先 truncate table ，然后 drop table ，这样可以避免系统表的较长时间锁定。</div><div>　　25.尽量避免使用游标，因为游标的效率较差，如果游标操作的数据超过1万行，那么就应该考虑改写。</div><div>　　26.使用基于游标的方法或临时表方法之前，应先寻找基于集的解决方案来解决问题，基于集的方法通常更有效。</div><div>　　27.与临时表一样，游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法，尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括&#8220;合计&#8221;的例程通常要比使用游标执行的速度快。如果开发时间允许，基于游标的方法和基于集的方法都可以尝试一下，看哪一种方法的效果更好。</div><div>　　28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ，在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。</div><div>　　29.尽量避免向客户端返回大数据量，若数据量过大，应该考虑相应需求是否合理。</div><div>　　30.尽量避免大事务操作，提高系统并发能力。</div></div><br />上面有几句写的有问题。<br /><br />第二方面：<br /><div>select Count (*)和Select Count(1)以及Select Count(column)区别</div><div><div>一般情况下，Select Count (*)和Select Count(1)两着返回结果是一样的</div><div>&nbsp; &nbsp; 假如表沒有主键(Primary key), 那么count(1)比count(*)快，</div><div>&nbsp; &nbsp; 如果有主键的話，那主键作为count的条件时候count(主键)最快</div><div>&nbsp; &nbsp; 如果你的表只有一个字段的话那count(*)就是最快的</div><div>&nbsp; &nbsp;count(*) 跟 count(1) 的结果一样，都包括对NULL的统计，而count(column) 是不包括NULL的统计</div></div><br /><div>第三方面：</div><font class="Apple-style-span" face="'Microsoft YaHei'"><span class="Apple-style-span" style="font-size: 20px; line-height: 30px; "><div>索引列上计算引起的索引失效及优化措施以及注意事项</div></span></font><br /><span class="Apple-style-span" style="font-family: Arial; line-height: 26px; background-color: #ffffff; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">创建索引、优化查询以便达到更好的查询优化效果。但实际上，MySQL有时并不按我们设计的那样执行查询。MySQL是根据统计信息来生成执行计划的，这就涉及索引及索引的刷选率，表数据量，还有一些额外的因素。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Each table index is queried, and the best index is used unless the optimizer believes that it is more efficient to use a table scan. At one time, a scan was used based on whether the best index spanned more than 30% of the table, but a fixed percentage no longer determines the choice between using an index or a scan. The optimizer now is more complex and bases its estimate on additional factors such as table size, number of rows, and I/O block size.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">简而言之，当MYSQL认为符合条件的记录在30%以上，它就不会再使用索引，因为mysql认为走索引的代价比不用索引代价大，所以优化器选择了自己认为代价最小的方式。事实也的确如此<br /><br /></p><div><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 24px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #f5f5f5; display: inline !important; float: none; ">是MYSQL认为记录是30%以上，而不是实际MYSQL去查完再决定的。都查完了，还用什么索引啊？！</span><br style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 24px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #f5f5f5; " /><span style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 24px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #f5f5f5; display: inline !important; float: none; ">MYSQL会先估算，然后决定是否使用索引。</span></div><br /><p>&nbsp;</p></span><br />第四方面：<br /><div><h3><a href="http://religiose.iteye.com/blog/1685537" style="color: white; text-decoration: underline; background-color: #620091;">mysql中的SQL优化与执行计划</a></h3></div><div><div>一，如何判断SQL的执行效率？</div><div>&nbsp; &nbsp; &nbsp;通过explain 关键字分析效率低的SQL执行计划。</div><div>&nbsp; &nbsp; &nbsp;比如： explain select sum(moneys) from sales a, company b where a.company_id = b.company_id and a.year = 2006;</div><div>&nbsp; &nbsp; &nbsp;id : 1</div><div>&nbsp; &nbsp; &nbsp;select_type: SIMPLE</div><div>&nbsp; &nbsp; &nbsp;table:</div><div>&nbsp; &nbsp; &nbsp;type:</div><div>&nbsp;</div><div>1.row: &nbsp; &nbsp;</div><div>id<span style="white-space:pre">	</span>select_type<span style="white-space:pre">	</span>table<span style="white-space:pre">	</span>type<span style="white-space:pre">	</span>possible_keys<span style="white-space:pre">	</span>key<span style="white-space:pre">	</span>key_len<span style="white-space:pre">	</span>ref<span style="white-space:pre">	</span>rows<span style="white-space:pre">	</span>Extra</div><div>1<span style="white-space:pre">	</span>SIMPLE<span style="white-space:pre">	</span>a<span style="white-space:pre">	</span>ALL<span style="white-space:pre">	</span>NULL<span style="white-space:pre">	</span>NULL<span style="white-space:pre">	</span>NULL<span style="white-space:pre">	</span>NULL<span style="white-space:pre">	</span>1000<span style="white-space:pre">	</span>Using where&nbsp;</div><div>&nbsp;</div><div>2.row</div><div>&nbsp;</div><div>id<span style="white-space:pre">	</span>select_type<span style="white-space:pre">	</span>table<span style="white-space:pre">	</span>type<span style="white-space:pre">	</span>possible_keys<span style="white-space:pre">	</span>key<span style="white-space:pre">	</span>key_len<span style="white-space:pre">	</span>ref<span style="white-space:pre">	</span>rows<span style="white-space:pre">	</span>Extra</div><div>1<span style="white-space:pre">	</span>SIMPLE<span style="white-space:pre">	</span>b<span style="white-space:pre">	</span>ref<span style="white-space:pre">	</span>ind_company_id<span style="white-space:pre">	</span>ind_company_id<span style="white-space:pre">	</span>5<span style="white-space:pre">	</span>sakila.a.company_id<span style="white-space:pre">	</span>1<span style="white-space:pre">	</span>Using where;Using index&nbsp;</div><div>&nbsp;</div><div>select_type: SIMPLE, 简单表，不使用表连接或子查询；PRIMARY，主查询，即外层的查询；UNION，UNION中的第二个查询或后面的查询；SUMQUERY，子查询中的第一个SELECT。</div><div>table: 输出结果集的表。</div><div>type: 表示表的连接类型，性能由好到坏，依次为，</div><div>&nbsp; &nbsp; &nbsp;system，表中只有一行，常量表。</div><div>&nbsp; &nbsp; &nbsp;const，单表中最多有一行匹配，如pramary key 或者 unique index</div><div>&nbsp; &nbsp; &nbsp;eq_ref，对于前面的每一行，此表中只查询一条记录，比如多表连接中，使用primary key 或 unique index</div><div>&nbsp; &nbsp; &nbsp;ref，与eq_ref 类似，区别在于不是primary key 或qunique index, 而是普通索引。</div><div>&nbsp; &nbsp; &nbsp;ref_or_null，与ref 类似，区别在于查询中包含对null的查询。</div><div>&nbsp; &nbsp; &nbsp;index_merge，索引合并优化</div><div>&nbsp; &nbsp; &nbsp;unique_subquery，in的后面是一个查询主键字段的子查询。</div><div>&nbsp; &nbsp; &nbsp;index_subquery，与unique_subquery类似，区别在于是查询非唯一索引字段的子查询。</div><div>&nbsp; &nbsp; &nbsp;range，单表中的范围查询。</div><div>&nbsp; &nbsp; &nbsp;index，对于前面的每一行，都通过查询索引来得到数据。</div><div>&nbsp; &nbsp; &nbsp;all，全表扫描。</div><div>possible_keys: 表示查询时，可能使用的索引。</div><div>key:表示实际使用的索引。</div><div>key_len:索引字段的长度。</div><div>rows:扫描行的数量。</div><div>Extra:执行情况的说明和描述。</div><div>&nbsp;</div><div>二，如何通过查询数据库各操作的比例及索引使用次数来判断数据库索引及使用是否合理？</div><div>&nbsp; &nbsp;1， &nbsp; &nbsp; &nbsp;命令： &gt;show status like 'Com_%';</div><div>&nbsp; &nbsp; &nbsp; 结果：Com_xxx 表示每个xxx语句的执行次数。如：</div><div>&nbsp; &nbsp; Com_select, Com_insert,Com_update,Com_delete。</div><div>特别的，针对InnoDB：</div><div>&nbsp; &nbsp; &nbsp;Innodb_rows_read，select查询返回的行数</div><div>&nbsp; &nbsp; &nbsp;Innodb_rows_inserted，执行insert操作插入的行数 等等。</div><div>通过以上可以查看该数据库的读写比例，以便优化。</div><div>&nbsp; &nbsp; &nbsp;2， &nbsp; &nbsp; 命令：&gt;show status like 'Handler_read%'</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;查看索引使用次数。</div><div>&nbsp;</div><div>三，何时匹配到索引？</div><div>&nbsp; &nbsp; &nbsp; 明确第一索引，第二索引的含义。回表，覆盖索引等优化方法。这里不再赘述。特别的，组合索引只能前缀匹配。同样，like 关键字也只能前缀匹配索引，通配符不能放在第一个字符。</div><div>&nbsp;</div><div>四，何时不走索引？</div><div>&nbsp; &nbsp; &nbsp; &nbsp;1，如果mysql 估计索引使用比全表扫描更慢，则不使用索引。例如几乎获取全表数据的范围查询等等。</div><div>&nbsp; &nbsp; &nbsp; &nbsp;2，or 分开的条件，OR前的条件列有索引，后面的没有索引，那么涉及的索引都不会用到。</div><div>&nbsp; &nbsp; &nbsp; &nbsp;3，条件不是组合索引的第一部分，即不满足前缀左匹配的条件。</div><div>&nbsp; &nbsp; &nbsp; &nbsp;4，like 条件以%开始，则不走索引。</div><div>&nbsp; &nbsp; &nbsp; &nbsp;5，where 条件后如果是字符串，则一定要用引号括起来，不然自动转换其他类型后，不会走索引。</div><div>&nbsp;</div><div>五，常用SQL优化</div><div>&nbsp; &nbsp; &nbsp; &nbsp;1，大批量插入数据，使用多值语句插入。</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;insert into test values (1,2),(2,3),(2,4)......</div><div>&nbsp; &nbsp; &nbsp; &nbsp;2， 优化group by, 默认情况下，mysql 会对所有group by C1,C2,C3 ... 的字段排序，与order by C1,C2,C3 类似，所以在group by 中增加相同列的order by 性能没什么影响。</div><div>&nbsp; &nbsp; &nbsp; &nbsp;如果用户想避免排序带来的影响，可以显式指定不排序，后面加上order by NULL。</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 3，order by 后面的顺序与索引顺序相同，且与where 中使用的条件相同，且是索引，则才会走真正索引。</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 4，in + 子查询的 SQL 尽量用join 连接来代替。</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 5，OR 之间的每个条件列都必须用到索引。</div><div>&nbsp;</div><div>六，深层一些的优化</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 考虑每次查询时的IO消耗，回表次数；考虑表设计时，数据结构的不同，比如varchar ,char 区别；考虑表设计时每行数据的大小，尽量保持在128K以内，让其在一页内，避免跨页，大数据行。</div></div><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/410811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2014-03-10 11:27 <a href="http://www.blogjava.net/stevenjohn/archive/2014/03/10/410811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 切分(Sharding)、水平切分、垂直切分以及读写分离的区别</title><link>http://www.blogjava.net/stevenjohn/archive/2013/05/27/399797.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 27 May 2013 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/05/27/399797.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/399797.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/05/27/399797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/399797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/399797.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">切分（Sharding）并不是特定数据库产品所附属的功能，而是在具体技术细节之上的抽象处理。是水平扩展（Scale Out）的解决方案，主要目的是解决单节点数据库服务器的能力限制，以及整个应用其架构的可扩展性（Scalability）。<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">切分主要有两种方式：水平切分（Horizental Sharding）和垂直切分（Vertical Sharding）。<br /><br />水平切分所指的是通过一系列的切分规则将数据水平分布到不同的DB或table中，在通过相应的DB路由 或者table路由规则找到需要查询的具体的DB或者table以进行Query操作，比如根据用户ID将用户表切分到多台数据库上。<br /><br />垂直切分指的是按业务、产品切分，将不同类型的数据且分到不同的服务器上，通过数据库代理疏通程序与多个数据库的通讯、降低应用的复杂度。<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器，这样能有效地减轻数据库压力，也能减轻io压力。主数据库提供写操作，从数据库提供读操作，这样既避免了主数据库服务器（Master）的过载，也有效地利用了从数据库服务器（Slave）的资源。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">这里ebay工程师的文章：<a href="http://www.infoq.com/cn/articles/ebay-scalability-best-practices" target="_top" style="color: #3fa7cb;">《可伸缩性最佳实践：来自eBay的经验》</a>更详细地介绍了一些概念及业务场景。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">--End--</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/399797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-05-27 10:14 <a href="http://www.blogjava.net/stevenjohn/archive/2013/05/27/399797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>INSERT INTO… ON DUPLICATE KEY UPDATE</title><link>http://www.blogjava.net/stevenjohn/archive/2013/05/14/399244.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 14 May 2013 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/05/14/399244.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/399244.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/05/14/399244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/399244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/399244.html</trackback:ping><description><![CDATA[<div><div>MySQL 当记录不存在时插入，当记录存在时更新.........具体解决办法如下：<br />1、INSERT INTO&#8230; ON DUPLICATE KEY UPDATE<div><pre><span style="color:#000080">如果您指定了ON DUPLICATE KEY UPDATE，并且插入行后会导致在一个UNIQUE<a href="http://apps.hi.baidu.com/share/detail/:;" target="_self"><u><strong>索引</strong></u></a>或PRIMARY KEY中出现重复值，则执行旧行UPDATE。</span></pre></div>使用环境：<br /><div><pre><span style="color:#000080">例如，如果列a被定义为UNIQUE，并且包含值1，则以下两个语句具有相同的效果：</span></pre></div>首先建表(先说UNIQUE)：<br /><div>create table abin1(<br />id int not null unique,<br />username varchar(100),<br />password varchar(100)<br />)</div><div><pre><span style="color:#000080"><div>insert into abin1 (id,username,password) values (1,'abin1','varyall1') on duplicate key update username='abin12',password='varyall12';</div><br />其次再说主键（primary key）类型的：<br /><div><div>create table abin2(<br />id int not null,<br />username varchar(100),<br />password varchar(100),<br />constraint pk_abin2 primary key(id)<br />)</div></div>执行语句：<br /><div><div>insert into abin2 (id,username,password) values (1,'abin1','varyall1') on duplicate key update username='abin12',password='varyall12';<br /><br /><br /><br /><br />2、插入单行记录：如果不存在插入记录，如果存在记录的话，就不再插入<br /><div>insert into abin2 (id,username,password) select 1,'abin12','varyall12' from dual<br />where not exists (select k.* from abin2 k where k.id=1)<br /><br /><br />3、<span style="font-size:16px; color:#000000">示例一：插入多条记录</span><div><p><span style="font-size:16px; color:#000000">假设有一个主键为 id 的 abin2表，可以使用下面的语句：</span></p></div></div></div></div><div>insert into abin2 (id,username,password) select 1,'abin12','varyall12' from dual<br />where not exists (select k.* from abin2 k where k.id=1)</div><br />4、<div><pre>我们在使用<a href="http://hi.baidu.com/magine2003/blog/item/:;" target="_self"><u><strong><span style="color:#000080">数据库</span></strong></u></a><span style="color: #000080;">时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引，当我们再向这个表中使用已经存在的键值插入一条记录，那将会抛出一个主键冲突的<br />错误。当然，我们可能想用新记录的值来覆盖原来的记录值。如果使用传统的做法，必须先使用DELETE语句删除原先的记录，然后再使用INSERT插入新的记录。而在MySQL中为<br />我们提供了一种新的解决方案，这就是REPLACE语句。使用REPLACE插入一条记录时，如果不重复，REPLACE就和INSERT的功能一样，如果有重复记录，REPLACE就使用新记录的值<br />来替换原来的记录值。<br /><br />具体用法：<br /><div><div>replace into abin2 (id,username,password) values (2,'abin','varyall')</div></div><br /></span></pre></div><br /><br /><br /></span></pre></div></div></div><div>http://blog.csdn.net/kesaihao862/article/details/6718443</div><br /><div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/399244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-05-14 11:14 <a href="http://www.blogjava.net/stevenjohn/archive/2013/05/14/399244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 时间函数</title><link>http://www.blogjava.net/stevenjohn/archive/2012/12/14/392991.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 14 Dec 2012 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/12/14/392991.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/392991.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/12/14/392991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/392991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/392991.html</trackback:ping><description><![CDATA[在MYSQL中插入当前时间：<br /><ul style="margin: 0px; padding: 3px; list-style: none; background-color: #ffffff;"><p style="font-family: 宋体; font-size: 12px; line-height: 14px; margin: 0px; padding: 0px;">NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间，可以直接存到DATETIME字段中。<br style="margin: 0px; padding: 0px;" />CURDATE()以&#8217;YYYY-MM-DD&#8217;的格式返回今天的日期，可以直接存到DATE字段中。<br style="margin: 0px; padding: 0px;" /></p><div id="w_hzh" style="font-family: 宋体; font-size: 12px; line-height: 14px; margin: 0px;"></div><font face="宋体"><span style="font-size: 12px; line-height: 14px;">CURTIME()以&#8217;HH:MM:SS&#8217;的格式返回当前的时间，可以直接存到TIME字段中。</span></font><br style="margin: 0px; padding: 0px;" /><font face="宋体"><span style="font-size: 12px; line-height: 14px;">例：insert into tablename (fieldname) values (now())</span></font><br /><p style="margin: 0px 0px 10px; padding: 0px;"></p><div><span style="line-height: 25px;">now()：以'yyyy-mm-dd hh:mm:ss'返回当前的日期时间，可以直接存到datetime字段中。</span></div><div><span style="line-height: 25px;">curdate()：&#8217;yyyy-mm-dd&#8217;的格式返回今天的日期，可以直接存到date字段中。</span></div><p>&nbsp;</p></ul><div>//获取Mysql系统时间 &nbsp;&nbsp;</div><div>select now() as systime &nbsp;;&nbsp;</div><div>select sysdate() as systime &nbsp;;&nbsp;</div><div>select current_date as systime ;</div><div>select current_time as systime ;</div><div>select current_timestamp as systime ;<br /><div>select * from abing where to_days(sysdate())=to_days(createtime); &nbsp;&nbsp;</div><div>select * from abing where to_days(sysdate())=to_days(createtime); &nbsp;&nbsp;</div><div>&nbsp;select * from abing where str_to_date(now(),'%Y-%m-%d')=str_to_date(createtime,'%Y-%m-%d'); &nbsp;<br /></div></div>自己写的例子，为了以后忘记了查询用：<br /><div>use abin;</div><div>create table abin1(</div><div>id integer not null auto_increment,</div><div>name varchar(100),</div><div>create_time datetime ,</div><div>update_time datetime ,</div><div>constraint pk_abin1 primary key(id));<br /><div>insert into abin1(name,create_time,update_time) values ('abin1',now(),now());</div><div>insert into abin1(name,create_time,update_time) values ('abin1',sysdate(),sysdate());<br /><br /><br /><br /><br /></div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/392991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-12-14 14:32 <a href="http://www.blogjava.net/stevenjohn/archive/2012/12/14/392991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql 触发器和存储过程</title><link>http://www.blogjava.net/stevenjohn/archive/2012/10/18/389792.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 18 Oct 2012 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/10/18/389792.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/389792.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/10/18/389792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/389792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/389792.html</trackback:ping><description><![CDATA[<div class="blog_content">1、首先建表： <br />create table tababin( <br />id int not null auto_increment, <br />name varchar(100), <br />constraint pk primary key(id) <br />) <br /><br />2、拷贝一张相同的表： <br />create table tababin1 like tababin; <br /><br />3.建立主键自增触发器： <br />create trigger triabin before insert on tababin for each ROW <br />begin <br />set @new=new.id; <br />end <br /><br />4、插入记录： <br />insert into tababin (name) values ('abin1') <br />insert into tababin (name) values ('abin2') <br />insert into tababin (name) values ('abin3') <br /><br />5&#8216;编写存储过程(带游标和LOOP循环的存储过程)： <br />CREATE&nbsp; PROCEDURE pabin() <br />begin <br />declare id,status int ; <br />declare name varchar(100); <br />declare mycur cursor for select * from tababin; <br />declare continue handler for not found set status=1; <br />open mycur; <br />set status=0; <br />loopLabel:loop <br />fetch mycur into id,name; <br />if status=0 then <br />if id is not null then <br />if name is not null then <br />insert into tababin1 values (id,name); <br />end if; <br />end if; <br />end if; <br />if status =1 then <br />leave loopLabel; <br />end if; <br />end loop; <br />close mycur; <br />end <br /><br />6、测试存储过程： <br />call pabin() <br /><br /><br />结果：tababin1表里面新增了数据。 </div><img src ="http://www.blogjava.net/stevenjohn/aggbug/389792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-10-18 10:21 <a href="http://www.blogjava.net/stevenjohn/archive/2012/10/18/389792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql  创建定时器</title><link>http://www.blogjava.net/stevenjohn/archive/2012/10/08/389202.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 08 Oct 2012 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/10/08/389202.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/389202.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/10/08/389202.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/389202.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/389202.html</trackback:ping><description><![CDATA[mysql定时器是系统给提供了event，而oracle里面的定时器是系统给提供的job。废话少说，下面创建表：<br />create table mytable (<br />id int auto_increment not null,<br />name varchar(100) not null default '',<br />introduce text not null,<br />createtime timestamp not null,<br />constraint pk_mytable primary key(id)<br />)<br /><br /><br />创建存储过程，这里的存储过程主要提供给mysql的定时器event来调用去执行：<br />create procedure mypro()<br />BEGIN<br />insert into mytable (name,introduce,createtime) values ('1111','inner mongolia',now());<br />end;<br />这里只是简单的写了一下，只是为了说明例子。<br /><br /><br />紧接着创建mysql的定时器event：<br />create event if not exists eventJob&nbsp;<br />on schedule every 1 second <br />on completion PRESERVE<br />do call mypro();<br />这里设置为每一秒执行一次<br /><br /><br />至此所有的准备工作已经写完了，做完这些，mysql要想利用定时器必须的做准备工作，就是把mysql的定时器给开启了：<br />SET GLOBAL event_scheduler = 1;&nbsp; -- 启动定时器<br />SET GLOBAL event_scheduler = 0;&nbsp; -- 停止定时器<br /><br /><br />紧接着还要开启事件：<br />ALTER EVENT eventJob&nbsp;ON&nbsp; COMPLETION PRESERVE ENABLE;&nbsp;&nbsp; -- 开启事件<br />ALTER EVENT eventJob&nbsp;ON&nbsp; COMPLETION PRESERVE DISABLE;&nbsp; -- 关闭事件<br /><br /><br />SHOW VARIABLES LIKE '%sche%'; -- 查看定时器状态<br /><br /><br />至此，你去数据库里面的表mytable里面看下，系统会每隔一秒去插入一条数据，嘻嘻，任务完成了。<br />select * from mytable<br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/389202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-10-08 20:22 <a href="http://www.blogjava.net/stevenjohn/archive/2012/10/08/389202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql function函数(一)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/17/387944.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 17 Sep 2012 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/17/387944.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387944.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/17/387944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387944.html</trackback:ping><description><![CDATA[1、建表<br />create table abing(<br />id int not null auto_increment,<br />name varchar(30),<br />constraint pk primary key(id)<br />)<br /><br />2.创建函数<br />create function fabin(parameter varchar(10))returns char(100)<br />BEGIN<br />declare result int;<br />declare restatus char(100);<br />select count(*) into result from abing where name like CONCAT('%',parameter,'%');<br />set restatus=CAST(result AS CHAR);<br />return(restatus);<br />end <br /><br />3、测试函数语句<br />select fabin('abing');<br /><br /><br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/387944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-17 22:32 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/17/387944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql trigger(一)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387830.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 16 Sep 2012 10:50:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387830.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387830.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387830.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387830.html</trackback:ping><description><![CDATA[<p>第一部分：关于delete的触发器执行<br />CREATE TABLE `abin5` (<br />&nbsp; `id` int(11) DEFAULT NULL,<br />&nbsp; `name5` varchar(39) DEFAULT NULL<br />) ENGINE=InnoDB DEFAULT CHARSET=utf8;<br /><br /></p>
<p>create table&nbsp;abin6 like abin5;&nbsp;<br /><br />建立触发器：</p>
<p>CREATE TRIGGER `tabin1` BEFORE DELETE ON `abin5` FOR EACH ROW begin <br />&nbsp;declare id int default 0;<br />&nbsp;declare name varchar(100) default null;<br />&nbsp;set id=OLD.id;<br />&nbsp;set name=OLD.name5;<br />&nbsp;insert into abin6 values (id,name);<br />end;<br /><br />测试语句：<br />delete from abin5 where id='1';<br />然后查看abin6表里面，必定是新增了一条和abin5表里面删除掉的一模一样的记录。<br /><br /><br /><br /><br /><br />第一部分：关于insert的触发器执行<br />建表：<br />create table abing(<br />id int not null auto_increment,<br />name varchar(100),<br />constraint pk primary key(id)<br />)<br /><br />建立触发器：（用于主键自增）<br />create trigger tabing before insert on abing for each row <br />begin <br />&nbsp;set @id=new.id;<br />end<br /><br />执行insert语句：<br />insert into abing (name) values ('abing');<br /><br />查看结果：<br />select * from abing<br /><br />呵呵，结果是自然主键自增了。<br /><br /><br /><br /><br /><br />第一部分：关于update的触发器执行<br />建表：<br />create table abing(<br />id int not null auto_increment,<br />name varchar(100),<br />sid int,<br />constraint pk primary key(id)<br />)<br /><br />建立触发器：<br />create trigger tabing before update on abing for each row <br />begin <br />&nbsp;set @old=old.sid;<br />&nbsp;set @new=new.sid;<br />end<br /><br /><br /><br /><br /><br />参考资料：<a href="http://database.51cto.com/art/201010/229404.htm">http://database.51cto.com/art/201010/229404.htm</a></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/387830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-16 18:50 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/16/387830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql  存储过程游标(一)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387798.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 15 Sep 2012 19:16:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387798.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387798.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387798.html</trackback:ping><description><![CDATA[<p>1、建立存储过程<br />create procedure pabin4()<br />BEGIN<br />declare status,id int;<br />declare az,ax varchar(100) default '';<br />declare mycur cursor for select * from abin5;<br />declare continue handler for not found set status=1;<br />open mycur;<br />&nbsp;set status=0;<br />&nbsp;loopLabel:LOOP</p>
<p>&nbsp;&nbsp;fetch mycur into id,az;</p>
<p>&nbsp;&nbsp;if status = 0 then<br />&nbsp;&nbsp;&nbsp;if az is not null then<br />&nbsp;&nbsp;&nbsp;&nbsp;set ax=CONCAT(az,'mycur');<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;set ax=CONCAT('mysql','mycur');<br />&nbsp;&nbsp;&nbsp;end if;<br />&nbsp;&nbsp;&nbsp;insert into abin5 values (id,ax);<br />&nbsp;&nbsp;end if;</p>
<p>&nbsp;&nbsp;if status = 1 then<br />&nbsp;&nbsp;&nbsp;leave loopLabel;<br />&nbsp;&nbsp;end if;</p>
<p>&nbsp;&nbsp;end loop;<br />close mycur;<br />END</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;2、测试语句<br /></p>
<p>call pabin4()<br />&nbsp;</p> <img src ="http://www.blogjava.net/stevenjohn/aggbug/387798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-16 03:16 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/16/387798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 存储过程循环控制指令</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387797.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 15 Sep 2012 18:30:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387797.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387797.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387797.html</trackback:ping><description><![CDATA[<p style="widows: 2; text-transform: none; background-color: rgb(239,239,239); text-indent: 0px; font: 14px/19px 宋体, Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">在MySQL存储过程的语句中有三个标准的循环方式：WHILE循环，LOOP循环以及REPEAT循环。还有一种非标准的循环方式：GOTO，不过这种循环方式最好别用，很容易引起程序的混乱，在这里就不错具体介绍了。</p>
<p style="widows: 2; text-transform: none; background-color: rgb(239,239,239); text-indent: 0px; font: 14px/19px 宋体, Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">这几个循环语句的格式如下：<br />WHILE&#8230;&#8230;DO&#8230;&#8230;END WHILE<br />REPEAT&#8230;&#8230;UNTIL END REPEAT<br />LOOP&#8230;&#8230;END LOOP<br />GOTO。</p>1、建立存储过程<br />create procedure pabin2()<br />BEGIN<br />declare i int ;<br />set i=0;<br />while i&lt;5 do <br />&nbsp;insert into abin5 values (i,CONCAT('while',i));<br />&nbsp;set i=i+1;<br />end while;<br />END<br />测试语句：<br />call pabin2()<br /><br /><br />2、建立存储过程：<br />create procedure pabin3()<br />BEGIN<br />declare i int ;<br />declare az varchar(100) default '';<br />set i=0;<br />repeat <br />&nbsp;set az=CONCAT('repeat',i);<br />&nbsp;insert into abin5 values (i,az);<br />&nbsp;set i=i+1;<br />&nbsp;until i&gt;=5<br />end repeat;<br />end<br /><br />测试语句：<br />call pabin3()<br /><br /><br />3、建立存储过程：<br />create procedure pabin1()<br />begin <br />declare i int default 0;<br />declare av varchar(100) default '';<br />loop_label:LOOP<br />&nbsp;if i=3 then <br />&nbsp;&nbsp;set i=i+1;<br />&nbsp;&nbsp;iterate loop_label;<br />&nbsp;end if;<br />&nbsp;set av=CONCAT('loop',i); <br />&nbsp;insert into abin5 values (i,av);<br />&nbsp;set i=i+1;<br />&nbsp;if i&gt;=5 then <br />&nbsp;&nbsp;leave loop_label;<br />&nbsp;end if;<br />end loop;<br />end;<br /><br /><br /><br />测试语句：<br />call pabin1()<br /><img src ="http://www.blogjava.net/stevenjohn/aggbug/387797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-16 02:30 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/16/387797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 存储过程(Navicat For Mysql)</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387795.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 15 Sep 2012 18:00:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387795.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/387795.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/16/387795.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/387795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/387795.html</trackback:ping><description><![CDATA[<div>开发环境：Navicat For Mysql<br />第一个例子，<span style="widows: 2; text-transform: none; background-color: rgb(245,245,245); text-indent: 0px; font: 12pt/14px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">带</span><span style="widows: 2; text-transform: none; background-color: rgb(245,245,245); text-indent: 0px; font: 12pt/14px 'Courier New'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">(</span><span style="widows: 2; text-transform: none; background-color: rgb(245,245,245); text-indent: 0px; font: 12pt/14px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">输出参数</span><span style="widows: 2; text-transform: none; background-color: rgb(245,245,245); text-indent: 0px; font: 12pt/14px 'Courier New'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">)</span><span style="widows: 2; text-transform: none; background-color: rgb(245,245,245); text-indent: 0px; font: 12pt/14px 宋体; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">返回值的存储过程：</span><br />1、建表<br />create table abin5(<br />id int,<br />name5 VARCHAR(39)<br />)<br />2、创建存储过程<br />create procedure pabin5(out n int)<br />BEGIN<br />&nbsp;select count(*) from abin5;<br />END<br />3、测试存储过程<br />call pabin5(@n)<br /><br />第二个例子，<span style="widows: 2; text-transform: none; background-color: rgb(245,245,245); text-indent: 0px; display: inline !important; font: 12pt/14px 宋体; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">带输入参数的存储过程：</span><br />1、建立存储过程<br />create procedure pabin6(in n int)<br />BEGIN<br />&nbsp;SELECT * FROM abin5 where id=n;<br />END<br />2、测试存储过程<br />SET @n=1;<br />CALL pabin6(@n)<br /><br /><br /></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/387795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-16 02:00 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/16/387795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL中 ENUM 类型的详细解释</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371766.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 12 Mar 2012 15:31:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371766.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/371766.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/371766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/371766.html</trackback:ping><description><![CDATA[<span class="bold">MYSQL中 ENUM 类型的详细解释</span><br /><br />
<div class="t_msgfont"><code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 类型 
<p><code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 是一个字符串对象，其值通常选自一个允许值列表中，该列表在表创建时的列规格说明中被明确地列举。</p>
<p>在下列某些情况下，值也可以是空串(<code><span style="color: #800080"><font face="NSimsun">""</font></span></code>) 或 <code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code>：</p>
<ul><li>如果将一个无效值插入一个 <code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> (即，一个不在允许值列表中的字符串)，空字符串将作为一个特殊的错误值被插入。事实上，这个字符串有别于一个"普通的"空字符串，因为这个字符串有个数字索引值为 0。稍后有更详细描述。</li><li>如果一个 <code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 被声明为 <code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code>，<code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code> 也是该列的一个合法值，并且该列的缺省值也将为 <code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code> 。如果一个 <code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 被声明为 <code><span style="color: #800080"><font face="NSimsun">NOT NULL</font></span></code>，该列的缺省值将是该列表所允许值的第一个成员。 </li></ul>
<p>每个枚举值均有一个索引值：</p>
<ul><li>在列说明中列表值所允许的成员值被从 1 开始编号。</li><li>空字符串错误值的索引值为 0。这就意味着，你可以使用下面所示的 <code><span style="color: #800080"><font face="NSimsun">SELECT</font></span></code> 语句找出被赋于无效 <code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 值的记录行。 <pre>mysql&gt; SELECT * FROM tbl_name WHERE enum_col=0;</pre></li><li><code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code> 值的索引值为 <code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code>。 </li></ul>
<p>例如，指定为 <code><span style="color: #800080"><font face="NSimsun">ENUM("one", "two", "three")</font></span></code> 的一个列，可以有下面所显示的任一值。每个值的索引值也如下所示：</p>
<table border="1" width="100%">
<tbody>
<tr>
<td><strong>值 </strong></td>
<td><strong>索引值 </strong></td></tr>
<tr>
<td><code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code></td>
<td><code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code></td></tr>
<tr>
<td><code><span style="color: #800080"><font face="NSimsun">""</font></span></code></td>
<td>0</td></tr>
<tr>
<td><code><span style="color: #800080"><font face="NSimsun">"one"</font></span></code></td>
<td>1</td></tr>
<tr>
<td><code><span style="color: #800080"><font face="NSimsun">"two"</font></span></code></td>
<td>2</td></tr>
<tr>
<td><code><span style="color: #800080"><font face="NSimsun">"three"</font></span></code></td>
<td>3</td></tr></tbody></table>
<p>换个枚举最大可以有 65535 个成员值。</p>
<p>从 MySQL 3.23.51 开始，当表被创建时，<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 值尾部的空格将会自动删除。</p>
<p>当为一个 <code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 列赋值时，字母的大小写是无关紧要的。然而，以后从列中检索出来的值的大小写却是匹配于创建表时所指定的允许值。</p>
<p>如果在一个数字语境中检索一个<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code>，列值的索引值将被返回。例如，你可以像这样使用数字值检索一个 <code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 列：</p><pre>mysql&gt; SELECT enum_col+0 FROM tbl_name;</pre>
<p>如果将一个数字存储到一个 <code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 中，数字被当作为一个索引值，并且存储的值是该索引值所对应的枚举成员。(但是，这在 <code><span style="color: #800080"><font face="NSimsun">LOAD DATA</font></span></code> 将不能工作，因为它视所有的输入均为字符串。) 在一个 <code><font face="NSimsun"><span style="color: #800080">ENUM</span> </font></code>字符串中存储数字是不明智的，因为它可能会打乱思维。</p>
<p><code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 值依照列规格说明中的列表顺序进行排序。(换句话说，<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 值依照它们的索引号排序。)举例来说，对于 <code><span style="color: #800080"><font face="NSimsun">ENUM("a", "b")</font></span></code> <code><span style="color: #800080"><font face="NSimsun">"a"</font></span></code> 排在 <code><span style="color: #800080"><font face="NSimsun">"b"</font></span></code> 后，但是对于 <code><span style="color: #800080"><font face="NSimsun">ENUM("b", "a")</font></span></code> ，<code><span style="color: #800080"><font face="NSimsun"> "b"</font></span></code> 却排在 <code><span style="color: #800080"><font face="NSimsun">"a"</font></span></code> 之前。空字符串排在非空字符串前，<code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code> 值排在其它所有的枚举值前。为了防止意想不到的结果，建议依照字母的顺序定义 <code><font face="NSimsun"><span style="color: #800080">ENUM</span> </font></code>列表。也可以通过使用 <code><span style="color: #800080"><font face="NSimsun">GROUP BY CONCAT(col)</font></span></code> 来确定该以字母顺序排序而不是以索引值。</p>
<p>如果希望得到一个 <code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 列的所有可能值，可以使用 <code><span style="color: #800080"><font face="NSimsun">SHOW COLUMNS FROM table_name LIKE enum_colum</font></span></code></p></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/371766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-12 23:31 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/12/371766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql 字段数据类型/长度及表类型详细说明</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371765.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 12 Mar 2012 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371765.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/371765.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/371765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/371765.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; background-color: rgb(244,248,251); text-indent: 0px; font: 14px/21px arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"> 
<div style="border-bottom: rgb(237,241,244) 1px solid; border-left: rgb(237,241,244) 1px solid; padding-bottom: 20px; background-color: rgb(255,255,255); padding-left: 20px; padding-right: 20px; word-wrap: break-word; color: rgb(154,154,154); font-size: 12px; border-top: rgb(237,241,244) 1px solid; border-right: rgb(237,241,244) 1px solid; padding-top: 20px; background-origin: initial; background-clip: initial" id="app-share-content">
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>一、MySQL 字段数据类型/长度</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>1、数值类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>列类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要的存储量<span class="Apple-converted-space">&nbsp;</span><br /></strong>TINYINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 字节<span class="Apple-converted-space">&nbsp;</span><br />SMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 个字节<span class="Apple-converted-space">&nbsp;</span><br />MEDIUMINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 个字节<span class="Apple-converted-space">&nbsp;</span><br />INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 个字节<span class="Apple-converted-space">&nbsp;</span><br />INTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 个字节<span class="Apple-converted-space">&nbsp;</span><br />BIGINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 个字节<span class="Apple-converted-space">&nbsp;</span><br />FLOAT(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 如果 X &lt; = 24 或 8 如果 25 &lt; = X &lt; = 53<span class="Apple-converted-space">&nbsp;</span><br />FLOAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 个字节<span class="Apple-converted-space">&nbsp;</span><br />DOUBLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 个字节<span class="Apple-converted-space">&nbsp;</span><br />DOUBLE PRECISION&nbsp;&nbsp;&nbsp;&nbsp; 8 个字节<span class="Apple-converted-space">&nbsp;</span><br />REAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 个字节<span class="Apple-converted-space">&nbsp;</span><br />DECIMAL(M,D)&nbsp;&nbsp; M字节(D+2 , 如果M &lt; D)<span class="Apple-converted-space">&nbsp;</span><br />NUMERIC(M,D)&nbsp;&nbsp; M字节(D+2 , 如果M &lt; D)</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">MySQL 的数值数据类型可以大致划分为两个类别，一个是整数，另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的，每个子类型支持不同大小的数据，并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　表列出了各种数值类型以及它们的允许范围和占用的内存空间。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"></p>
<table style="width: 496px; border-collapse: collapse; margin-bottom: 0px; height: 841px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px" class="FCK__ShowTableBorders" border="0" cellspacing="1" cellpadding="5" width="496" bgcolor="#ece9d8" align="center">
<tbody>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>类型</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>大小</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>范围（有符号）</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>范围（无符号）</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>用途</strong></div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">TINYINT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">1 字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(-128，127)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(0，255)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">小整数值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">SMALLINT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">2 字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(-32 768，32 767)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(0，65 535)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">大整数值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">MEDIUMINT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">3 字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(-8 388 608，8 388 607)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(0，16 777 215)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">大整数值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">INT或INTEGER</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">4 字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(-2 147 483 648，2 147 483 647)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(0，4 294 967 295)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">大整数值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">BIGINT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">8 字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(-9 233 372 036 854 775 808，9 223 372 036 854 775 807)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(0，18 446 744 073 709 551 615)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">极大整数值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done">FLOAT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">4 字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(-3.402 823 466 E+38，1.175 494 351 E-38)，0，(1.175 494 351 E-38，3.402 823 466 351 E+38)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">0，(1.175 494 351 E-38，3.402 823 466 E+38)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done">单精度<br />浮点数值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done">DOUBLE</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">8 字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">(1.797 693 134 862 315 7 E+308，2.225 073 858 507 201 4 E-308)，0，(2.225 073 858 507 201 4 E-308，1.797 693 134 862 315 7 E+308)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">0，(2.225 073 858 507 201 4 E-308，1.797 693 134 862 315 7 E+308)</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done">双精度<br />浮点数值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done">DECIMAL</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="15%">
<div style="word-wrap: break-word" align="left" twffan="done">对DECIMAL(M,D) ，如果M&gt;D，为M+2否则为D+2</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">依赖于M和D的值</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff" width="30%">
<div style="word-wrap: break-word" align="left" twffan="done">依赖于M和D的值</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" bgcolor="#ffffff">
<div style="word-wrap: break-word" align="left" twffan="done">小数值</div></td></tr></tbody></table>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>INT 类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　在 MySQL 中支持的 5 个主要整数类型是 TINYINT，SMALLINT，MEDIUMINT，INT 和 BIGINT。这些类型在很大程度上是相同的，只有它们存储的值的大小是不相同的。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展，这样当从数据库检索一个值时，可以把这个值加长到指定的长度。例如，指定一个字段的类型为 INT(6)，就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是，使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　万一我们需要对一个字段存储一个超出许可范围的数字，MySQL 会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是，MySQL 会在不合规定的值插入表前自动修改为 0。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　UNSIGNED（未签署） 修饰符规定字段只保存正值。因为不需要保存数字的正、负符号，可以在储时节约一个&#8220;位&#8221;的空间。从而增大这个字段可以存储的值的范围。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　ZEROFILL（零填充） 修饰符规定 0（不是空格）可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>FLOAT、DOUBLE 和 DECIMAL 类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类型用于表示单精度浮点数值，而 DOUBLE 数值类型用于表示双精度浮点数值。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　与整数一样，这些类型也带有附加参数：一个显示宽度指示器和一个小数点指示器。比如语句 FLOAT(7,3) 规定显示的值不会超过 7 位数字，小数点后面带有 3 位数字。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　对于小数点后面的位数超过允许范围的值，MySQL 会自动将它四舍五入为最接近它的值，再插入它。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　DECIMAL 数据类型用于精度要求非常高的计算中，这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数，而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字，并且小数点后不超过 3 位。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　忽略 DECIMAL 数据类型的精度和计数方法修饰符将会使 MySQL 数据库把所有标识为这个数据类型的字段精度设置为 10，计算方法设置为 0。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　UNSIGNED(未签署) 和 ZEROFILL（零填充） 修饰符也可以被 FLOAT、DOUBLE 和 DECIMAL 数据类型使用。并且效果与 INT 数据类型相同。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>2、日期和时间类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>列类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要的存储量</strong><span class="Apple-converted-space">&nbsp;</span><br />DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 个字节<span class="Apple-converted-space">&nbsp;</span><br />DATETIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 个字节<span class="Apple-converted-space">&nbsp;</span><br />TIMESTAMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 个字节<span class="Apple-converted-space">&nbsp;</span><br />TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 个字节<span class="Apple-converted-space">&nbsp;</span><br />YEAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 字节</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在处理日期和时间类型的值时，MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型，和混合日期、时间类型。根据要求的精度，子类型在每个分类型中都可以使用，并且 MySQL 带有内置功能可以把多样化的输入格式变为一个标准格式</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"></p>
<table style="width: 484px; border-collapse: collapse; height: 509px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px" border="1" cellspacing="0" cellpadding="4" width="484" align="center">
<tbody>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>类型</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>大小<br />(字节)</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="40%">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>范围</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>格式</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>用途</strong></div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">DATE</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">3</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="40%">
<div style="word-wrap: break-word" align="left" twffan="done">1000-01-01/9999-12-31</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">YYYY-MM-DD</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">日期值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">TIME</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">3</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="40%">
<div style="word-wrap: break-word" align="left" twffan="done">'-838:59:59'/'838:59:59'</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">HH:MM:SS</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">时间值或持续时间</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">YEAR</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">1</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="40%">
<div style="word-wrap: break-word" align="left" twffan="done">1901/2155</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">YYYY</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">年份值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">DATETIME</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">8</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="40%">
<div style="word-wrap: break-word" align="left" twffan="done">1000-01-01 00:00:00/9999-12-31 23:59:59</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">YYYY-MM-DD HH:MM:SS</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">混合日期和时间值</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">TIMESTAMP</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="10%">
<div style="word-wrap: break-word" align="left" twffan="done">8</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="40%">
<div style="word-wrap: break-word" align="left" twffan="done">1970-01-01 00:00:00/2037 年某时</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">YYYYMMDD HHMMSS</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">混合日期和时间值，时间戳</div></td></tr></tbody></table>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>DATE、TIME 和 TEAR 类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　MySQL 用 DATE 和 TEAR 类型存储简单的日期值，使用 TIME 类型存储时间值。这些类型可以描述为字符串或不带分隔符的整数序列。如果描述为字符串，DATE 类型的值应该使用连字号作为分隔符分开，而 TIME 类型的值应该使用冒号作为分隔符分开。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　需要注意的是，没有冒号分隔符的 TIME 类型值，将会被 MySQL 理解为持续的时间，而不是时间戳。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　MySQL 还对日期的年份中的两个数字的值，或是 SQL 语句中为 TEAR 类型输入的两个数字进行最大限度的通译。因为所有 TEAR 类型的值必须用 4 个数字存储。MySQL 试图将 2 个数字的年份转换为 4 个数字的值。把在 00-69 范围内的值转换到 2000-2069 范围内。把 70-99 范围内的值转换到 1970-1979 之内。如果 MySQL 自动转换后的值并不符合我们的需要，请输入 4 个数字表示的年份。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>DATETIME 和 TIMESTAMP 类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　 除了日期和时间数据类型，MySQL 还支持 DATEYIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳，并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　如果我们对 TIMESTAMP 类型的字段没有明确赋值，或是被赋与了 null 值。MySQL 会自动使用系统当前的日期和时间来填充它。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>3、字符串类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>列类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要的存储量</strong><span class="Apple-converted-space">&nbsp;</span><br />CHAR(M)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M字节，1 &lt;= M &lt;= 255<span class="Apple-converted-space">&nbsp;</span><br />VARCHAR(M)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L+1 字节, 在此L &lt;= M和1 &lt;= M &lt;= 255<span class="Apple-converted-space">&nbsp;</span><br />TINYBLOB, TINYTEXT&nbsp;&nbsp;&nbsp;&nbsp; L+1 字节, 在此L&lt; 2 ^ 8<span class="Apple-converted-space">&nbsp;</span><br />BLOB, TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L+2 字节, 在此L&lt; 2 ^ 16<span class="Apple-converted-space">&nbsp;</span><br />MEDIUMBLOB, MEDIUMTEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L+3 字节, 在此L&lt; 2 ^ 24<span class="Apple-converted-space">&nbsp;</span><br />LONGBLOB, LONGTEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L+4 字节, 在此L&lt; 2 ^ 32<span class="Apple-converted-space">&nbsp;</span><br />ENUM('value1','value2',...)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 或 2 个字节, 取决于枚举值的数目(最大值65535）<span class="Apple-converted-space">&nbsp;</span><br />SET('value1','value2',...)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1，2，3，4或8个字节, 取决于集合成员的数量(最多64个成员）</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MySQL 提供了 8 个基本的字符串类型，可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"></p>
<table style="width: 510px; border-collapse: collapse; height: 448px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px" border="1" cellspacing="0" cellpadding="4" width="510" align="center">
<tbody>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>类型</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>大小</strong></div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done"><strong>用途</strong></div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">CHAR</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-255字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">定长字符串</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">VARCHAR</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-255字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">变长字符串</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">TINYBLOB</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-255字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">不超过 255 个字符的二进制字符串</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">TINYTEXT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-255字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">短文本字符串</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">BLOB</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-65 535字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">二进制形式的长文本数据</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">TEXT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-65 535字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">长文本数据</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">MEDIUMBLOB</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-16 777 215字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">二进制形式的中等长度文本数据</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">MEDIUMTEXT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-16 777 215字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">中等长度文本数据</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">LOGNGBLOB</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-4 294 967 295字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">二进制形式的极大文本数据</div></td></tr>
<tr>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="20%">
<div style="word-wrap: break-word" align="left" twffan="done">LONGTEXT</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="25%">
<div style="word-wrap: break-word" align="left" twffan="done">0-4 294 967 295字节</div></td>
<td style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" width="55%">
<div style="word-wrap: break-word" align="left" twffan="done">极大文本数据</div></td></tr></tbody></table>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>CHAR 和 VARCHAR 类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　CHAR 类型用于定长字符串，并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短，而比指定长度小的值将会用空格作填补。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时，这个修饰符使 CHAR 以二进制方式参于运算，而不是以传统的区分大小写的方式。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　CHAR 类型的一个变体是 VARCHAR 类型。它是一种可变长度的字符串类型，并且也必须带有一个范围在 0-255 之间的指示器。CHAR 和 VARCHGAR 不同之处在于 MuSQL 数据库处理这个指示器的方式：CHAR 把这个大小视为值的大小，不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度（增加一个额外字节来存储字符串本身的长度）来存储值。所以短于指示器长度的 VARCHAR 类型不会被空格填补，但长于指示器的值仍然会被截短。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度，所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>TEXT 和 BLOB 类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　对于字段长度要求超过 255 个的情况下，MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小，它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写，而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。比指定类型支持的最大范围大的值将被自动截短。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>3、复合类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　MySQL 还支持两种复合数据类型 ENUM 和 SET，它们扩展了 SQL 规范。虽然这些类型在技术上是字符串类型，但是可以被视为不同的数据类型。一个 ENUM 类型只允许从一个集合中取得一个值；而 SET 类型允许从一个集合中取得任意多个值。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>ENUM 类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　ENUM 类型因为只允许在集合中取得一个值，有点类似于单选项。在处理相互排拆的数据时容易让人理解，比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用 null 值，除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配，MySQL 会自动使用插入值的大小写转换成与集合中大小写一致的值。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　 ENUM 类型在系统内部可以存储为数字，并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素，其中一个元素被 MySQL 保留，用来存储错误信息，这个错误值用索引 0 或者一个空字符串表示。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　MySQL 认为 ENUM 类型集合中出现的值是合法输入，除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>SET 类型</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使 MySQL 插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录，MySQL 将会保留合法的元素，除去非法的元素。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　一个 SET 类型最多可以包含 64 项元素。在 SET 元素中值被存储为一个分离的&#8220;位&#8221;序列，这些&#8220;位&#8221;表示与它相对应的元素。&#8220;位&#8221;是创建有序元素集合的一种简单而有效的方式。并且它还去除了重复的元素，所以 SET 类型中不可能包含两个相同的元素。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px">　　希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>二、MySQL 数据表类型说明</strong></p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>1. MyISAM 表</strong><span class="Apple-converted-space">&nbsp;</span>MyISAM 存储格式自版本3.23 以来是 MySQL 中的缺省类型，它有下列特点：<br />&#9632; 如果操作系统自身允许更大的文件，那么文件比 ISAM 存储方法的大。<br />&#9632; 数据以低字节优先的机器独立格式存储。这表示可将表从一种机器拷贝到另一种机器，即使它们的体系结构不同也可以拷贝。<br />&#9632; 数值索引值占的存储空间较少，因为它们是按高字节优先存储的。索引值在低位字节中变化很快，因此高位字节更容易比较。<br />&#9632; AUTO_INCREMENT 处理比 ISAM 的表更好。<br />&#9632; 减少了几个索引限制。例如，可对含 NULL 值的列进行索引，还可以对 BLOB 和 TEXT 类型的列进行索引。<br />&#9632; 为了改善表的完整性检查，每个表都具有一个标志，在 myisamchk 对表进行过检查后，设置该标志。可利用 myisamchk - fast 跳过对自前次检查以来尚未被修改过表的检查，这样使此管理任务更快。表中还有一个指示表是否正常关闭的标志。如果服务器关闭不正常，或机器崩溃，此标志可用来检测出服务器起动时需要检查的表。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>2. ISAM 表</strong><span class="Apple-converted-space">&nbsp;</span>ISAM 存储格式是 MySQL3.23 所用的最旧的格式，但当前仍然可用。通常，相对于 ISAM 表来说，宁可使用 MyISAM 表，因为它们的限制较少。对 ISAM 表的支持随着此存储格式被 MyISAM 表格式所支持很有可能会逐渐消失。</p>
<p style="padding-bottom: 0px; line-height: 26px; margin: 0px 0px 1em; padding-left: 0px; padding-right: 0px; color: rgb(109,109,109); padding-top: 0px"><strong>3. HEAP 表</strong><span class="Apple-converted-space">&nbsp;</span>HEAP 存储格式建立利用定长行的内存中的表，这使表运行得非常快。在服务器停止时，它们将会消失。在这种意义上，这些表是临时的。但是，与用 CREATE TEMPORARY TABLE 所创建的临时表相比，HEAP 表是其他客户机可见的。HEAP 表有几个限制，这些限制对 MyISAM 或 ISAM 表没有，如下所示：<br />&#9632; 索引仅用于&#8220;=&#8221;和&#8220;&lt; = &gt;&#8221;比较。<br />&#9632; 索引列中不能有 NULL 值。<br />&#9632; 不能使用 BLOB 和 TEXT 列。<br />&#9632; 不能使用 AUTO_INCREMENT 列。　</p></div>
<div style="margin-top: 10px; word-wrap: break-word; color: rgb(153,153,153); clear: both; font-size: 12px; border-top: rgb(244,244,244) 1px solid" id="appShareUrl">来自:<span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(154,154,154); text-decoration: none" href="http://hi.baidu.com/patty555/blog/item/cb4d6e971d00fe1c7bf480ba.html" target="_blank">http://hi.baidu.com/patty555/blog/item/cb4d6e971d00fe1c7bf480ba.html</a></div></span><img src ="http://www.blogjava.net/stevenjohn/aggbug/371765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-12 22:58 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/12/371765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>