﻿<?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>C++博客-网络服务器软件开发/中间件开发，关注ACE/ICE/boost-随笔分类-mysql</title><link>http://www.cppblog.com/true/category/4716.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 06 Apr 2011 08:50:33 GMT</lastBuildDate><pubDate>Wed, 06 Apr 2011 08:50:33 GMT</pubDate><ttl>60</ttl><item><title>mysql的加密函数</title><link>http://www.cppblog.com/true/archive/2011/04/06/143517.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Wed, 06 Apr 2011 06:04:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2011/04/06/143517.html</guid><wfw:comment>http://www.cppblog.com/true/comments/143517.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2011/04/06/143517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/143517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/143517.html</trackback:ping><description><![CDATA[<div class=informaltable>
<table border=1>
    <colgroup>
    <col>
    <col></colgroup>
    <tbody>
        <tr>
            <td><span class=bold><strong>Compression or encryption</strong></span></td>
            <td><span class=bold><strong>Uncompression or decryption</strong></span></td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_aes_encrypt"><font color=#800080><u>AES_ENCRYT()</u></font></a></td>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_aes_encrypt"><font color=#800080><u>AES_DECRYPT()</u></font></a></td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_compress"><font color=#800080><u>COMPRESS()</u></font></a></td>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_uncompress"><font color=#800080><u>UNCOMPRESS()</u></font></a></td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_encode"><font color=#800080><u>ENCODE()</u></font></a></td>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_decode"><font color=#800080><u>DECODE()</u></font></a></td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_des_encrypt"><font color=#800080><u>DES_ENCRYPT()</u></font></a></td>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_des_decrypt"><font color=#800080><u>DES_DECRYPT()</u></font></a></td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_encrypt"><u><font color=#800080>ENCRYPT()</font></u></a></td>
            <td>Not available</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_md5"><u><font color=#800080>MD5()</font></u></a></td>
            <td>Not available</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_old_password"><u><font color=#800080>OLD_PASSWORD()</font></u></a></td>
            <td>Not available</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_password"><u><font color=#800080>PASSWORD()</font></u></a></td>
            <td>Not available</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_sha1"><u><font color=#800080>SHA() or SHA1()</font></u></a></td>
            <td>Not available</td>
        </tr>
        <tr>
            <td>Not available</td>
            <td><a href="mk:@MSITStore:C:\Program%20Files\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch12s09.html#function_uncompressed_length"><u><font color=#800080>UNCOMPRESSED_LENGTH()</font></u></a></td>
        </tr>
    </tbody>
</table>
</div>
从文档中的描述来看，mysql是支持AES和DES的 
<img src ="http://www.cppblog.com/true/aggbug/143517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2011-04-06 14:04 <a href="http://www.cppblog.com/true/archive/2011/04/06/143517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用微软企业库连接mysql碰到的奇怪问题</title><link>http://www.cppblog.com/true/archive/2011/01/24/139216.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Mon, 24 Jan 2011 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2011/01/24/139216.html</guid><wfw:comment>http://www.cppblog.com/true/comments/139216.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2011/01/24/139216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/139216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/139216.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;有个存储过程内容如下：<br>&nbsp;&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;InsertProfile(Profile&nbsp;model)<br><img id=Codehighlighter1_47_776_Open_Image onclick="this.style.display='none'; Codehighlighter1_47_776_Open_Text.style.display='none'; Codehighlighter1_47_776_Closed_Image.style.display='inline'; Codehighlighter1_47_776_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_47_776_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_47_776_Closed_Text.style.display='none'; Codehighlighter1_47_776_Open_Image.style.display='inline'; Codehighlighter1_47_776_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_47_776_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_47_776_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_55_714_Open_Image onclick="this.style.display='none'; Codehighlighter1_55_714_Open_Text.style.display='none'; Codehighlighter1_55_714_Closed_Image.style.display='inline'; Codehighlighter1_55_714_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_55_714_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_714_Closed_Text.style.display='none'; Codehighlighter1_55_714_Open_Image.style.display='inline'; Codehighlighter1_55_714_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_55_714_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_55_714_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DbCommand&nbsp;dbc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_Db.GetStoredProcCommand(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Profile_Insert</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_Db.AddInParameter(dbc,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">@pSourceID</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;DbType.String,&nbsp;model.SourceID);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_Db.AddInParameter(dbc,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">@pName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;DbType.String,&nbsp;model.Name);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_Db.AddInParameter(dbc,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">@pAddress</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;DbType.String,&nbsp;model.Address);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_Db.AddInParameter(dbc,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">@pCity</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;DbType.String,&nbsp;model.City);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_Db.AddInParameter(dbc,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">@pTel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;DbType.String,&nbsp;model.Tel);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_Db.AddInParameter(dbc,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">@pCode</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;DbType.String,&nbsp;model.code);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;obj&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_Db.ExecuteScalar(dbc);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(obj&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_642_684_Open_Image onclick="this.style.display='none'; Codehighlighter1_642_684_Open_Text.style.display='none'; Codehighlighter1_642_684_Closed_Image.style.display='inline'; Codehighlighter1_642_684_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_642_684_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_642_684_Closed_Text.style.display='none'; Codehighlighter1_642_684_Open_Image.style.display='inline'; Codehighlighter1_642_684_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_642_684_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_642_684_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">.Parse(obj.ToString());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_693_711_Open_Image onclick="this.style.display='none'; Codehighlighter1_693_711_Open_Text.style.display='none'; Codehighlighter1_693_711_Closed_Image.style.display='inline'; Codehighlighter1_693_711_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_693_711_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_693_711_Closed_Text.style.display='none'; Codehighlighter1_693_711_Open_Image.style.display='inline'; Codehighlighter1_693_711_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_693_711_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_693_711_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(System.Exception&nbsp;e)<br><img id=Codehighlighter1_745_774_Open_Image onclick="this.style.display='none'; Codehighlighter1_745_774_Open_Text.style.display='none'; Codehighlighter1_745_774_Closed_Image.style.display='inline'; Codehighlighter1_745_774_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_745_774_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_745_774_Closed_Text.style.display='none'; Codehighlighter1_745_774_Open_Image.style.display='inline'; Codehighlighter1_745_774_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_745_774_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_745_774_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>上面的AddInParameter的参数顺序和Profile_insert在数据库中定义的参数顺序不同。之前都能正常工作，上周六突然发现不行了，实际写入表的时候，顺序乱掉了，直到今天才找到解决方案：<strong>把AddIn的参数顺序和声明的参数保持一致</strong>。这个问题太奇怪了。大概环境是，表的存储引擎为MyISAM，上百万记录，mysql部署在ubuntu，mysql版本5.1.53。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最开始的思路是：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;代码问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp;DbCommand dbc = m_Db.GetStoredProcCommand("Profile_Insert");的多线程调用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3. mysql的配置问题<br>思维定势导致没怀疑过参数顺序,上面存储过程是为说明问题而临时改动的，实际系统中的存储过程和业务有很强的关联，不方便介绍.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<img src ="http://www.cppblog.com/true/aggbug/139216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2011-01-24 12:38 <a href="http://www.cppblog.com/true/archive/2011/01/24/139216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql将查询结果保存到文件</title><link>http://www.cppblog.com/true/archive/2011/01/19/138825.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Wed, 19 Jan 2011 01:55:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2011/01/19/138825.html</guid><wfw:comment>http://www.cppblog.com/true/comments/138825.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2011/01/19/138825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/138825.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/138825.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.新建查询语句文件query.sql，内容如下:<br>--------------------------------------分割线----------------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use appdb;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set names utf8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select FeedID, City , Message&nbsp; from Feed limit 1000;<br>--------------------------------------分割线----------------------------------------<br>上面的set names utf8语句是设施当前使用的编码，如果编码和数据库的编码不一致，会出现乱码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.执行如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[root@proxy tianqg]# mysql -uroot -p &lt; query.sql &gt; query.txt<br>回车，输入密码，在当前目录下会产生查询结果文件query.txt<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这些语句以前都是非常熟悉的，昨天有人问起，一时没有给出准确的回答，命令行操作这种东西是容易忘记的，还是记下来备忘吧
<img src ="http://www.cppblog.com/true/aggbug/138825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2011-01-19 09:55 <a href="http://www.cppblog.com/true/archive/2011/01/19/138825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql中在not in后面慎用 select子查询 及临时表的使用</title><link>http://www.cppblog.com/true/archive/2011/01/13/138458.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Thu, 13 Jan 2011 05:05:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2011/01/13/138458.html</guid><wfw:comment>http://www.cppblog.com/true/comments/138458.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2011/01/13/138458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/138458.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/138458.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有个存储过程，功能是：根据用户名查询非好友的ID，代码如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">begin<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;select&nbsp;UserID&nbsp;&nbsp;from&nbsp;&nbsp;Users<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;where<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;UserID&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;pUserID&nbsp;and<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Users.UserID&nbsp;&nbsp;not&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;(<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;FriendID&nbsp;from&nbsp;Users_Friend&nbsp;where&nbsp;Users_Friend.UserID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pUserID&nbsp;and&nbsp;DeleteFlag&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;and<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Users.Name&nbsp;like&nbsp;BINARY&nbsp;&nbsp;concat(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,pUserName,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)&nbsp;&nbsp;;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>end</span></div>
&nbsp;其中，pUserID是搜索者的UID,pUserName是要搜索的用户名。今天发现这个存储过程非常慢，分析结论是：not in 后面的select子查询是每次都执行的，这出乎意料！mysql难道不能优化掉这样的查询吗？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后来用了临时表的方案，如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">begin<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Create&nbsp;TEMPORARY&nbsp;&nbsp;Table&nbsp;&nbsp;IF&nbsp;NOT&nbsp;EXISTS&nbsp;temp(FriendID&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;insert&nbsp;into&nbsp;temp(FriendID)&nbsp;select&nbsp;FriendID&nbsp;from&nbsp;Users_Friend&nbsp;where&nbsp;Users_Friend.UserID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pUserID&nbsp;and&nbsp;DeleteFlag&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;UserID&nbsp;&nbsp;from&nbsp;&nbsp;Users<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;where<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;UserID&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;pUserID&nbsp;and<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Users.UserID&nbsp;&nbsp;not&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;(<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;FriendID&nbsp;from&nbsp;temp<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;and<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Users.Name&nbsp;like&nbsp;BINARY&nbsp;&nbsp;concat(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,pUserName,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)&nbsp;&nbsp;;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;drop&nbsp;TEMPORARY&nbsp;&nbsp;table&nbsp;temp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>end</span></div>
<br>问题较好的解决了，因为临时表temp中保存的都是好友的ID，非常快，不用每次都去执行好友的筛选逻辑。另外一种方式是：将好友ID作为参数传递到存储过程中，在程序外面查询好友，但要改动程序。<br>&nbsp; 
<img src ="http://www.cppblog.com/true/aggbug/138458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2011-01-13 13:05 <a href="http://www.cppblog.com/true/archive/2011/01/13/138458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql的unix时间戳</title><link>http://www.cppblog.com/true/archive/2010/12/20/137000.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Mon, 20 Dec 2010 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2010/12/20/137000.html</guid><wfw:comment>http://www.cppblog.com/true/comments/137000.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2010/12/20/137000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/137000.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/137000.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;手册上的说明：<br>&nbsp;&nbsp;&nbsp;
<p><code class=literal>&nbsp;&nbsp;&nbsp;UNIX_TIMESTAMP()</code>, <code class=literal>UNIX_TIMESTAMP(<em class=replaceable><code>date</code></em>)</code> </p>
<p>If called with no argument, returns a Unix timestamp (seconds since <code class=literal>'1970-01-01 00:00:00'</code> UTC) as an unsigned integer. If <code class=literal>UNIX_TIMESTAMP()</code> is called with a <em class=replaceable><code>date</code></em> argument, it returns the value of the argument as seconds since <code class=literal>'1970-01-01 00:00:00'</code> UTC. <em class=replaceable><code>date</code></em> may be a <code class=literal>DATE</code> string, a <code class=literal>DATETIME</code> string, a <code class=literal>TIMESTAMP</code>, or a number in the format <code class=literal>YYMMDD</code> or <code class=literal>YYYYMMDD</code>. The server interprets <em class=replaceable><code>date</code></em> as a value in the current time zone and converts it to an internal value in UTC. Clients can set their time zone as described in <a title="5.11.8.&nbsp;MySQL Server Time Zone Support" href="mk:@MSITStore:E:\MeYou\meyou2.0\meyou_server\第三方插件\MysqlManual.chm::/ch05s11.html#time-zone-support"><u><font color=#0000ff>Section&nbsp;5.11.8, &#8220;MySQL Server Time Zone Support&#8221;</font></u></a>. </p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里的<font face="Courier New">UNIX_TIMESTAMP()的返回值和C函数time(NULL)的返回值含义一样，<br>&nbsp;&nbsp;mysql&gt; select UNIX_TIMESTAMP();<br>+------------------+<br>| UNIX_TIMESTAMP() |<br>+------------------+<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1292815556 |<br>+------------------+<br>1 row in set</font></p>
<p><font face="Courier New">mysql&gt; select FROM_UNIXTIME(1292815556);<br>+---------------------------+<br>| FROM_UNIXTIME(1292815556) |<br>+---------------------------+<br>| 2010-12-20 11:25:56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>+---------------------------+<br>1 row in set</font></p>
<img src ="http://www.cppblog.com/true/aggbug/137000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2010-12-20 12:01 <a href="http://www.cppblog.com/true/archive/2010/12/20/137000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql存储过程中使用事务</title><link>http://www.cppblog.com/true/archive/2010/09/16/126778.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Thu, 16 Sep 2010 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2010/09/16/126778.html</guid><wfw:comment>http://www.cppblog.com/true/comments/126778.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2010/09/16/126778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/126778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/126778.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: mysql 存储过程 事物 异常处理&nbsp;&nbsp;<a href='http://www.cppblog.com/true/archive/2010/09/16/126778.html'>阅读全文</a><img src ="http://www.cppblog.com/true/aggbug/126778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2010-09-16 15:57 <a href="http://www.cppblog.com/true/archive/2010/09/16/126778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转自群里面的讨论sql语句：varbinary类型，取某连续几个字节，排序</title><link>http://www.cppblog.com/true/archive/2010/08/31/125419.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Tue, 31 Aug 2010 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2010/08/31/125419.html</guid><wfw:comment>http://www.cppblog.com/true/comments/125419.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2010/08/31/125419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/125419.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/125419.html</trackback:ping><description><![CDATA[select * from actor_success order by conv(MID(HEX(success_kind),9,8),16,10);<br>这样的需求一般是做游戏相关的：）
<img src ="http://www.cppblog.com/true/aggbug/125419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2010-08-31 16:57 <a href="http://www.cppblog.com/true/archive/2010/08/31/125419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql自动备份脚本</title><link>http://www.cppblog.com/true/archive/2010/08/27/124914.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Fri, 27 Aug 2010 01:39:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2010/08/27/124914.html</guid><wfw:comment>http://www.cppblog.com/true/comments/124914.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2010/08/27/124914.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/124914.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/124914.html</trackback:ping><description><![CDATA[<p>1.开机自动启动备份功能<br>2.备份文件名按照日期及时间分文件<br>3.包含存储过程的备份<br><br>主要有两个文件：<br>1.mysqlbackup.py是定时驱动脚本(这里没用cron)，内容如下：<br>---------------------------------------------------------分割线---------------------------------------------------------------------------<br><br>import time,os,sys</p>
<p>while 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.system("sh /root/mysql/mysqlbackup.sh")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time.sleep(60*60)<br><br><br>---------------------------------------------------------分割线----------------------------------------------------------------------------<br></p>
<p>2.mysqlbackup.sh是具体的备份脚本，实现备份表和存储过程，内容如下：<br>---------------------------------------------------------分割线---------------------------------------------------------------------------<br><br>#!/bin/sh </p>
<p>Time=`date +%Y_%m_%d_%H_%M_%S`</p>
<p>mysqldump -uroot -pmysql sns2 -R &gt; /root/mysql/logs/sns2.$Time.sql<br><br>---------------------------------------------------------分割线---------------------------------------------------------------------------<br><br>3.开机启动备份功能：在/etc/rc.local 文件里面添加下面内容，注意要指定python的可执行文件目录，此处为/usr/bin/python,后面是py脚本的目录：<br>---------------------------------------------------------分割线---------------------------------------------------------------------------<br>/usr/bin/python /root/mysql/mysqlbackup.py &amp;<br>---------------------------------------------------------分割线---------------------------------------------------------------------------</p>
<img src ="http://www.cppblog.com/true/aggbug/124914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2010-08-27 09:39 <a href="http://www.cppblog.com/true/archive/2010/08/27/124914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql存储过程事务执行过程中出现异常回滚机制</title><link>http://www.cppblog.com/true/archive/2010/08/12/123178.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Thu, 12 Aug 2010 06:38:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2010/08/12/123178.html</guid><wfw:comment>http://www.cppblog.com/true/comments/123178.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2010/08/12/123178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/123178.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/123178.html</trackback:ping><description><![CDATA[<p>1.SQLEXCEPTION对应存储过程中的所有异常<br>2.通过输出参数，来返回事务是否执行成功<br>3.一个疑问：为什么mysql事务执行成功后，受影响的记录数都是0呢？<br><br>下为SQL代码：<br>-- Procedure "Users_Test" DDL</p>
<p>CREATE <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#68;&#69;&#70;&#73;&#78;&#69;&#82;&#61;&#96;&#114;&#111;&#111;&#116;&#96;&#64;&#96;&#37;">DEFINER=`root`@`%</a>` PROCEDURE `Users_Test`(out pCode int)<br>begin</p>
<p>&nbsp;</p>
<p>declare userID int default 0;</p>
<p>DECLARE CONTINUE HANDLER FOR SQLEXCEPTION</p>
<p>begin</p>
<p>rollback;</p>
<p>SET pCode=1;</p>
<p>end;</p>
<p>&nbsp;</p>
<p>set pCode = 0;</p>
<p>&nbsp;-- savepoint sp;</p>
<p>&nbsp;</p>
<p>&nbsp; -- SET&nbsp;&nbsp; AUTOCOMMIT= 1;</p>
<p>&nbsp; start transaction;</p>
<p>&nbsp;-- call Users_WriteLog('haha ,log');</p>
<p>&nbsp;insert into Users_Login (LoginName,LoginPwd,Banned) values ('1234','0000',0);</p>
<p>&nbsp;</p>
<p>&nbsp; set userID = @@IDENTITY;</p>
<p>&nbsp; insert into Users_Profile(UserID,UserName,CharactorName,HeadImageID,Sex,FromType,ProfileComplete)</p>
<p>&nbsp;&nbsp;values ( 5,'999999',10,1,1,0,1);</p>
<p>&nbsp;commit;</p>
<p>&nbsp;</p>
<p>--&nbsp; SELECT ROW_COUNT();</p>
<p>&nbsp;-- set rowcnt = mysql_affected_rows();</p>
<p>-- rollback to sp;</p>
<p>&nbsp;</p>
<p>end;<br></p>
<img src ="http://www.cppblog.com/true/aggbug/123178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2010-08-12 14:38 <a href="http://www.cppblog.com/true/archive/2010/08/12/123178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>360竟会自动关闭mysql</title><link>http://www.cppblog.com/true/archive/2009/08/29/94730.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Sat, 29 Aug 2009 01:10:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2009/08/29/94730.html</guid><wfw:comment>http://www.cppblog.com/true/comments/94730.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2009/08/29/94730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/94730.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/94730.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 上周，用python连接mysql的时候，总出现时连时不连的问题，通过 管理-&gt;服务和应用程序-&gt;服务，查看，mysql服务竟然停止了，最后问了下google,搜到360可能会关闭mysql，实验了下，果然如此，360安全卫士版本：5.2，mysql版本：5.0，解决方案：将360实时保护中的&#8220;系统防火墙&#8221;关闭即可。<br><br><br><img src ="http://www.cppblog.com/true/aggbug/94730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2009-08-29 09:10 <a href="http://www.cppblog.com/true/archive/2009/08/29/94730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL服务维护笔记-转帖</title><link>http://www.cppblog.com/true/archive/2008/01/12/41035.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Sat, 12 Jan 2008 09:45:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2008/01/12/41035.html</guid><wfw:comment>http://www.cppblog.com/true/comments/41035.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2008/01/12/41035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/41035.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/41035.html</trackback:ping><description><![CDATA[<h2 id=archive-title>MySQL服务维护笔记</h2>
<span class=post-footers twffan="done">作者：<a href="http://www.chedong.com/"><u><font color=#0000ff>车东</font></u></a> 发表于：2002-07-09 16:07 最后更新于：2007-04-17 08:04<br><a href="http://creativecommons.org/licenses/by/3.0/deed.zh"><u><font color=#0000ff>版权声明</font></u></a>：可以任意转载，转载时请务必以超链接形式标明文章<a class=permalink href="http://www.chedong.com/tech/mysql.html"><u><font color=#800080>原始出处</font></u></a>和作者信息及<a href="http://www.chedong.com/blog/archives/001249.html"><u><font color=#0000ff>本声明</font></u></a>。<br><a class=permalink href="http://www.chedong.com/tech/mysql.html"><u><font color=#800080>http://www.chedong.com/tech/mysql.html</font></u></a> </span>
<hr>
<div class=entry id=entry-1276 twffan="done">
<div class=entry-content twffan="done">
<div class=entry-body twffan="done">
<p>内容摘要：使用MySQL服务的一些经验，主要从以下几个方面考虑的MySQL服务规划设计。对于高负载站点来说PHP和MySQL运行在一起（或者说任何应用和数据库运行在一起的规划）都是性能最大的瓶颈，这样的设计有如让人一手画圆一手画方，这样2个人的工作效率肯定不如让一个人专门画圆一个人专门画方效率高，让应用和数据库都跑在一台高性能服务器上说不定还不如跑在2台普通服务器上快。<br></p>
<p>以下就是针对MySQL作为专门的数据库服务器的优化建议：</p>
<ol>
    <li>MySQL服务的安装/配置的通用性；
    <li>系统的升级和数据迁移方便性；
    <li>备份和系统快速恢复；
    <li>数据库应用的设计要点；
    <li>一次应用优化实战； </li>
</ol>
</div>
<div class=entry-more id=more twffan="done">
<p>MySQL服务器的规划<br>=================<br>为了以后维护，升级备份的方便和数据的安全性，最好将MySQL程序文件和数据分别安装在&#8220;不同的硬件&#8221;上。<br></p>
<pre>         /   / <br>        |    /usr                     &lt;== 操作系统         <br>        |    /home/mysql              &lt;== mysql主目录，为了方便升级，这只是一个最新版本目录的链接 <br>硬盘1==&gt;|    /home/mysql-3.23.54/     &lt;== 最新版本的mysql /home/mysql链接到这里<br>         \   /home/mysql-old/         &lt;== 以前运行的旧版本的mysql<br><br>         /   /data/app_1/             &lt;== 应用数据和启动脚本等<br>硬盘2==&gt;|    /data/app_2/<br>         \   /data/app_3/<br></pre>
<br>MySQL服务的安装和服务的启动：<br>MySQL一般使用当前STABLE的版本：<br>尽量不使用--with-charset=选项，我感觉with-charset只在按字母排序的时候才有用，这些选项会对数据的迁移带来很多麻烦。<br>尽量不使用innodb，innodb主要用于需要外键，事务等企业级支持，代价是速度比MYISAM有数量级的下降。<br>./configure --prefix=/home/mysql --without-innodb<br>make <br>make install<br><br>服务的启动和停止<br>================<br>1 复制缺省的mysql/var/mysql到 /data/app_1/目录下，<br>2 MySQLD的启动脚本：start_mysql.sh<br>#!/bin/sh<br>rundir=`dirname "$0"`<br>echo "$rundir"<br>/home/mysql/bin/safe_mysqld --user=mysql --pid-file="$rundir"/mysql.pid --datadir="$rundir"/var "$@"\<br>-O max_connections=500 -O wait_timeout=600 -O key_buffer=32M --port=3402 --socket="$rundir"/mysql.sock &amp;
<p>注释：<br>--pid-file="$rundir"/mysql.pid --socket="$rundir"/mysql.sock --datadir="$rundir"/var <br>目的都是将相应数据和应用临时文件放在一起；<br>-O 后面一般是服务器启动全局变量优化参数，有时候需要根据具体应用调整；<br>--port: 不同的应用使用PORT参数分布到不同的服务上去，一个服务可以提供的连接数一般是MySQL服务的主要瓶颈； </p>
<p>修改不同的服务到不同的端口后，在rc.local文件中加入：<br>/data/app_1/start_mysql.sh<br>/data/app_2/start_mysql.sh<br>/data/app_3/start_mysql.sh<br><em>注意：必须写全路径<br></em><br>3 MySQLD的停止脚本：stop_mysql.sh<br>#!/bin/sh<br>rundir=`dirname "$0"`<br>echo "$rundir"<br>/home/mysql/bin/mysqladmin -u mysql -S"$rundir"/mysql.sock shutdown <br><br>使用这个脚本的好处在于：<br>1 多个服务启动：对于不同服务只需要修改脚本中的--port[=端口号]参数。单个目录下的数据和服务脚本都是可以独立打包的。<br>2 所有服务相应文件都位于/data/app_1/目录下：比如：mysql.pid mysql.sock，当一台服务器上启动多个服务时，多个服务不会互相影响。但都放到缺省的/tmp/下则有可能被其他应用误删。<br>3 当硬盘1出问题以后，直接将硬盘2放到一台装好MySQL的服务器上就可以立刻恢复服务（如果放到my.cnf里则还需要备份相应的配置文件）。 </p>
<p>服务启动后/data/app_1/下相应的文件和目录分布如下：<br>/data/app_1/<br>&nbsp; &nbsp; start_mysql.sh 服务启动脚本<br>&nbsp; &nbsp; stop_mysql.sh 服务停止脚本<br>&nbsp; &nbsp; mysql.pid 服务的进程ID<br>&nbsp; &nbsp; mysql.sock 服务的SOCK<br>&nbsp; &nbsp; var/ 数据区<br>&nbsp; &nbsp; &nbsp; &nbsp;mysql/ 用户库<br>&nbsp; &nbsp; &nbsp; &nbsp;app_1_db_1/ 应用库<br>&nbsp; &nbsp; &nbsp; &nbsp;app_1_db_2/<br>...<br>/data/app_2/<br>... </p>
<p>查看所有的应用进程ID：<br>cat /data/*/mysql.pid </p>
<p>查看所有数据库的错误日志：<br>cat /data/*/var/*.err </p>
<p>个人建议：MySQL的主要瓶颈在PORT的连接数上，因此，将表结构优化好以后，相应单个MySQL服务的CPU占用仍然在10％以上，就要考虑将服务拆分到多个PORT上运行了。</p>
<p>服务的备份<br>==========<br>尽量使用MySQL DUMP而不是直接备份数据文件，以下是一个按weekday将数据轮循备份的脚本：备份的间隔和周期可以根据备份的需求确定<br>/home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f&gt;/path/to/backup/db_name.`date +%w`.dump.gz<br>因此写在CRONTAB中一般是：<br>15 4 * * * /home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f&gt;/path/to/backup/db_name.`date +\%w`.dump.gz<br><em>注意：<br>1 在crontab中'%'需要转义成'\%'<br>2 根据日志统计，应用负载最低的时候一般是在早上4-6点<br></em><br>先备份在本地然后传到远程的备份服务器上，或者直接建立一个数据库备份帐号，直接在远程的服务器上备份，远程备份只需要将以上脚本中的-S /path/to/msyql.sock改成-h IP.ADDRESS即可。<br><br>数据的恢复和系统的升级<br>======================<br>日常维护和数据迁移：在数据盘没有被破坏的情况下<br>硬盘一般是系统中寿命最低的硬件。而系统（包括操作系统和MySQL应用）的升级和硬件升级，都会遇到数据迁移的问题。<br>只要数据不变，先装好服务器，然后直接将数据盘（硬盘2）安装上，只需要将启动脚本重新加入到rc.local文件中，系统就算是很好的恢复了。<br><br>灾难恢复：数据库数据本身被破坏的情况下<br>确定破坏的时间点，然后从备份数据中恢复。</p>
<p>应用的设计要点<br>==============<br>如果MySQL应用占用的CPU超过10%就应该考虑优化了。<br></p>
<ol>
    <li>如果这个服务可以被其他非数据库应用代替（比如很多基于数据库的计数器完全可以用WEB日志统计代替）最好将其禁用：<br>非用数据库不可吗？虽然数据库的确可以简化很多应用的结构设计，但本身也是一个系统资源消耗比较大的应用。在某些情况下文本，DBM比数据库是更好的选择，比如：很多应用如果没有很高的实时统计需求的话，完全可以先记录到文件日志中，定期的导入到数据库中做后续统计分析。如果还是需要记录简单的2维键－值对应结构的话可以使用类似于DBM的HEAP类型表。因为HEAP表全部在内存中存取，效率非常高，但服务器突然断电时有可能出现数据丢失，所以非常适合存储在线用户信息，日志等临时数据。即使需要使用数据库的，应用如果没有太复杂的数据完整性需求的化，完全可以不使用那些支持外键的商业数据库，比如MySQL。只有非常需要完整的商业逻辑和事务完整性的时候才需要Oracle这样的大型数据库。对于高负载应用来说完全可以把日志文件，DBM，MySQL等轻量级方式做前端数据采集格式，然后用Oracle MSSQL DB2 Sybase等做数据库仓库以完成复杂的数据库挖掘分析工作。<br>有朋友和我说用标准的MyISAM表代替了InnoDB表以后，数据库性能提高了20倍。<br><br>
    <li>数据库服务的主要瓶颈：单个服务的连接数<br>对于一个应用来说，如果数据库表结构的设计能够按照数据库原理的范式来设计的话，并且已经使用了最新版本的MySQL，并且按照比较优化的方式运行了，那么最后的主要瓶颈一般在于单个服务的连接数，即使一个数据库可以支持并发500个连接，最好也不要把应用用到这个地步，因为并发连接数过多数据库服务本身用于调度的线程的开销也会非常大了。所以如果应用允许的话：让一台机器多跑几个MySQL服务分担。将服务均衡的规划到多个MySQL服务端口上：比如app_1 ==&gt; 3301 app_2 ==&gt; 3302...app_9 ==&gt; 3309。一个1G内存的机器跑上10个MySQL是很正常的。让10个MySQLD承担1000个并发连接效率要比让2个MySQLD承担1000个效率高的多。当然，这样也会带来一些应用编程上的复杂度；<br><br>
    <li>使用单独的数据库服务器（不要让数据库和前台WEB服务抢内存），MySQL拥有更多的内存就可能能有效的进行结果集的缓存；在前面的启动脚本中有一个-O key_buffer=32M参数就是用于将缺省的8M索引缓存增加到32M（当然对于）<br><br>
    <li>应用尽量使用PCONNECT和polling机制，用于节省MySQL服务建立连接的开销，但也会造成MySQL并发链接数过多（每个HTTPD都会对应一个MySQL线程）；<br><br>
    <li>表的横向拆分：让最常被访问的10%的数据放在一个小表里，90%的历史数据放在一个归档表里（所谓：快慢表），数据中间通过定期&#8220;搬家&#8221;和定期删除无效数据来节省，毕竟大部分应用（比如论坛）访问2个月前数据的几率会非常少，而且价值也不是很高。这样对于应用来说总是在一个比较小的结果级中进行数据选择，比较有利于数据的缓存，不要指望MySQL中对单表记录条数在10万级以上还有比较高的效率。而且有时候数据没有必要做那么精确，比如一个快表中查到了某个人发表的文章有60条结果，快表和慢表的比例是1:20，那么就可以简单的估计这个人一共发表了1200篇。Google的搜索结果数也是一样：对于很多上十万的结果数，后面很多的数字都是通过一定的算法估计出来的。<br><br>
    <li>数据库字段设计：表的纵向拆分（过渡范化）：将所有的定长字段（char, int等）放在一个表里，所有的变长字段（varchar,text,blob等）放在另外一个表里，2个表之间通过主键关联，这样，定长字段表可以得到很大的优化（这样可以使用HEAP表类型，数据完全在内存中存取），这里也说明另外一个原则，对于我们来说，尽量使用定长字段可以通过空间的损失换取访问效率的提高。在MySQL4中也出现了支持外键和事务的InnoDB类型表，标准的MyISAM格式表和基于HASH结构的HEAP内存表，MySQL之所以支持多种表类型，实际上是针对不同应用提供了不同的优化方式；<br><br>
    <li>仔细的检查应用的索引设计：可以在服务启动参数中加入 --log-slow-queries[=file]用于跟踪分析应用瓶颈，对于跟踪服务瓶颈最简单的方法就是用MySQL的status查看MySQL服务的运行统计和show processlist来查看当前服务中正在运行的SQL，如果某个SQL经常出现在PROCESS LIST中，一。有可能被查询的此时非常多，二，里面有影响查询的字段没有索引，三，返回的结果数过多数据库正在排序（SORTING）；所以做一个脚本：比如每2秒运行以下show processlist;把结果输出到文件中，看到底是什么查询在吃CPU。<br><br>
    <li>全文检索：如果相应字段没有做全文索引的话，全文检索将是一个非常消耗CPU的功能，因为全文检索是用不上一般数据库的索引的，所以要进行相应字段记录遍历。关于全文索引可以参考一下基于<a href="http://www.chedong.com/cgi-bin/mt/lucene.html"><u><font color=#0000ff>Java的全文索引引擎lucene的介绍</font></u></a>。<br><br>
    <li>前台应用的记录缓存：比如一个经常使用数据库认证，如果需要有更新用户最后登陆时间的操作，最好记录更新后就把用户放到一个缓存中（设置2个小时后过期），这样如果用户在2个小时内再次使用到登陆，就直接从缓存里认证，避免了过于频繁的数据库操作。<br><br>
    <li>查询优先的表应该尽可能为where和order by字句中的字段加上索引，数据库更新插入优先的应用索引越少越好。<br></li>
</ol>
<p>总之：对于任何数据库单表记录超过100万条优化都是比较困难的，关键是要把应用能够转化成数据库比较擅长的数据上限内。也就是把复杂需求简化成比较成熟的解决方案内。</p>
<p>一次优化实战<br>============<br>以下例子是对一个论坛应用进行的优化：<br></p>
<ol>
    <li>用Webalizer代替了原来的通过数据库的统计。<br>
    <li>首先通过TOP命令查看MySQL服务的CPU占用左右80%和内存占用：10M，说明数据库的索引缓存已经用完了，修改启动参数，增加了-O key_buffer=32M，过一段时间等数据库稳定后看的内存占用是否达到上限。最后将缓存一直增加到64M，数据库缓存才基本能充分使用。对于一个数据库应用来说，把内存给数据库比给WEB服务实用的多，因为MySQL查询速度的提高能加快web应用从而节省并发的WEB服务所占用的内存资源。<br>
    <li>用show processlist;统计经常出现的SQL：<br><br>每分钟运行一次show processlist并记录日志：<br>* * * * * (/home/mysql/bin/mysql -uuser -ppassword &lt; /home/chedong/show_processlist.sql &gt;&gt;&nbsp; /home/chedong/mysql_processlist.log)<br><br>show_processlist.sql里就一句：<br>show processlist;<br><br>比如可以从日志中将包含where的字句过滤出来：<br>grep where mysql_processlist.log<br>如果发现有死锁，一定要重新审视一下数据库设计了，对于一般情况：查询速度很慢，就将SQL where字句中没有索引的字段加上索引，如果是排序慢就将order by字句中没有索引的字段加上。对于有%like%的查询，考虑以后禁用和使用全文索引加速。<br><br>
    <li>还是根据show processlist;看经常有那些数据库被频繁使用，考虑将数据库拆分到其他服务端口上。 </li>
</ol>
<p>MSSQL到MySQL的数据迁移：ACCESS＋MySQL ODBC Driver</p>
<p>在以前的几次数据迁移实践过程中，我发现最简便的数据迁移过程并不是通过专业的数据库迁移工具，也不是MSSQL自身的DTS进行数据迁移（迁移过程中间会有很多表出错误警告），但通过将MSSQL数据库通过ACCESS获取外部数据导入到数据库中，然后用ACCESS的表==&gt;右键==&gt;导出，制定ODBC，通过MySQL的DSN将数据导出。这样迁移大部分数据都会非常顺利，如果导出的表有索引问题，还会出添加索引提示（DTS就不行），然后剩余的工作就是在MySQL中设计字段对应的SQL脚本了。</p>
<p>参考文档：</p>
<p>MySQL的参考：<br><a href="http://dev.mysql.com/doc/"><u><font color=#0000ff>http://dev.mysql.com/doc/</font></u><br></a></p>
</div>
</div>
</div>
<img src ="http://www.cppblog.com/true/aggbug/41035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2008-01-12 17:45 <a href="http://www.cppblog.com/true/archive/2008/01/12/41035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql总结【转】</title><link>http://www.cppblog.com/true/archive/2007/09/05/31625.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Wed, 05 Sep 2007 06:49:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2007/09/05/31625.html</guid><wfw:comment>http://www.cppblog.com/true/comments/31625.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2007/09/05/31625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/31625.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/31625.html</trackback:ping><description><![CDATA[<strong>一、 简单查询 </strong>
<p>　　简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。<br>　　例如，下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。</p>
<p>&nbsp;　　SELECT nickname,email<br>　　FROM testtable<br>　　WHERE name='张三' <br><br>　　(一) 选择列表</p>
<p>　　选择列表(select_list)指出所查询列，它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。</p>
<p>　　1、选择所有列</p>
<p>　　例如，下面语句显示testtable表中所有列的数据：</p>
<p>&nbsp;　　SELECT *<br>　　FROM testtable </p>
<p>　　2、选择部分列并指定它们的显示次序</p>
<p>　　查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。<br>　　例如：</p>
<p>&nbsp;　　SELECT nickname,email<br>　　FROM testtable </p>
<p>　　3、更改列标题</p>
<p>　　在选择列表中，可重新指定列标题。定义格式为：<br>　　列标题=列名<br>　　列名 列标题<br>　　如果指定的列标题不是标准的标识符格式时，应使用引号定界符，例如，下列语句使用汉字显示列标题：</p>
<p>&nbsp;　　SELECT 昵称=nickname,电子邮件=email<br>　　FROM testtable </p>
<p>　　4、删除重复行</p>
<p>　　SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行，默认为ALL。使用DISTINCT选项时，对于所有重复的数据行在SELECT返回的结果集合中只保留一行。</p>
<p>　　5、限制返回的行数</p>
<p>　　使用TOP n [PERCENT]选项限制返回的数据行数，TOP n说明返回n行，而TOP n PERCENT时，说明n是表示一百分数，指定返回的行数等于总行数的百分之几。<br>　　例如：</p>
<p>&nbsp;　 SELECT TOP 2 *<br>　　FROM testtable<br>　　SELECT TOP 20 PERCENT *<br>　　FROM testtable</p>
<p>　　(二)FROM子句 </p>
<p>　　FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图，它们之间用逗号分隔。<br>　　在FROM子句同时指定多个表或视图时，如果选择列表中存在同名列，这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列，在查询两个表中的cityid时应使用下面语句格式加以限定：</p>
<p>&nbsp;　&nbsp; SELECT username,citytable.cityid<br>　　FROM usertable,citytable<br>　　WHERE usertable.cityid=citytable.cityid </p>
<p>　　在FROM子句中可用以下两种格式为表或视图指定别名：<br>　　表名 as 别名<br>　　表名 别名</p>
<p>　　(二) FROM子句</p>
<p>　　FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图，它们之间用逗号分隔。<br>　　在FROM子句同时指定多个表或视图时，如果选择列表中存在同名列，这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列，在查询两个表中的cityid时应使用下面语句格式加以限定：</p>
<p>&nbsp;　 SELECT username,citytable.cityid<br>　　FROM usertable,citytable<br>　　WHERE usertable.cityid=citytable.cityid </p>
<p>　　在FROM子句中可用以下两种格式为表或视图指定别名：<br>　　表名 as 别名<br>　　表名 别名<br>　　例如上面语句可用表的别名格式表示为：</p>
<p>&nbsp;　 SELECT username,b.cityid<br>　　FROM usertable a,citytable b<br>　　WHERE a.cityid=b.cityid </p>
<p>　　SELECT不仅能从表或视图中检索数据，它还能够从其它查询语句所返回的结果集合中查询数据。</p>
<p>　　例如：</p>
<p>&nbsp;　&nbsp; SELECT a.au_fname+a.au_lname<br>　　FROM authors a,titleauthor ta<br>　　(SELECT title_id,title<br>　　FROM titles<br>　　WHERE ytd_sales&gt;10000<br>　　) AS t<br>　　WHERE a.au_id=ta.au_id<br>　　AND ta.title_id=t.title_id </p>
<p>　　此例中，将SELECT返回的结果集合给予一别名t，然后再从中检索数据。</p>
<p>　　(三) 使用WHERE子句设置查询条件</p>
<p>　　WHERE子句设置查询条件，过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据：</p>
<p>&nbsp;　 SELECT *<br>　　FROM usertable<br>　　WHERE age&gt;20 </p>
<p>　　WHERE子句可包括各种条件运算符：<br>　　比较运算符(大小比较)：&gt;、&gt;=、=、&lt;、&lt;=、&lt;&gt;、!&gt;、!&lt;<br>　　范围运算符(表达式值是否在指定的范围)：BETWEEN...AND...<br>　　NOT BETWEEN...AND...<br>　　列表运算符(判断表达式是否为列表中的指定项)：IN (项1,项2......)<br>　　NOT IN (项1,项2......)<br>　　模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE<br>　　空值判断符(判断表达式是否为空)：IS NULL、NOT IS NULL<br>　　逻辑运算符(用于多条件的逻辑连接)：NOT、AND、OR</p>
<p>　　1、范围运算符例：age BETWEEN 10 AND 30相当于age&gt;=10 AND age&lt;=30<br>　　2、列表运算符例：country IN ('Germany','China')<br>　　3、模式匹配符例：常用于模糊查找，它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。<br>　　可使用以下通配字符：<br>　　百分号%：可匹配任意类型和长度的字符，如果是中文，请使用两个百分号即%%。<br>　　下划线_：匹配单个任意字符，它常用来限制表达式的字符长度。<br>　　方括号[]：指定一个字符、字符串或范围，要求所匹配对象为它们中的任一个。[^]：其取值也[] 相同，但它要求所匹配对象为指定字符以外的任一个字符。<br>　　例如：<br>　　限制以Publishing结尾，使用LIKE '%Publishing'<br>　　限制以A开头：LIKE '[A]%'<br>　　限制以A开头外：LIKE '[^A]%'</p>
<p>　　4、空值判断符例WHERE age IS NULL</p>
<p>　　5、逻辑运算符：优先级为NOT、AND、OR</p>
<p>　　(四)查询结果排序 </p>
<p>　　使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为：<br>　　ORDER BY {column_name [ASC|DESC]} [,...n]<br>　　其中ASC表示升序，为默认值，DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排<br>　　序。<br>　　例如：</p>
<p>&nbsp;　&nbsp; SELECT *<br>　　FROM usertable<br>　　ORDER BY age desc,userid ASC </p>
<p>　　另外，可以根据表达式进行排序。</p>
<p>　　<strong>二、 联合查询</strong></p>
<p>　　UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示，即执行联合查询。UNION的语法格式为：</p>
<p>&nbsp;　&nbsp; select_statement<br>　　UNION [ALL] selectstatement<br>　　[UNION [ALL] selectstatement][...n] </p>
<p>　　其中selectstatement为待联合的SELECT查询语句。</p>
<p>　　ALL选项表示将所有行合并到结果集合中。不指定该项时，被联合查询结果集合中的重复行将只保留一行。</p>
<p>　　联合查询时，查询结果的列标题为第一个查询语句的列标题。因此，要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时，也必须使用第一查询语句中的列名、列标题或者列序号。 </p>
<p>　　在使用UNION 运算符时，应保证每个联合查询语句的选择列表中有相同数量的表达式，并且每个查询选择表达式应具有相同的数据类型，或是可以自动将它们转换为相同的数据类型。在自动转换时，对于数值类型，系统将低精度的数据类型转换为高精度的数据类型。</p>
<p>　　在包括多个查询的UNION语句中，其执行顺序是自左至右，使用括号可以改变这一执行顺序。例如：</p>
<p>　　查询1 UNION (查询2 UNION 查询3)</p>
<p>　　<strong>三、连接查询</strong></p>
<p>　　通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点，也是它区别于其它类型数据库管理系统的一个标志。</p>
<p>　　在关系数据库管理系统中，表建立时各数据之间的关系不必确定，常把一个实体的所有信息存放在一个表中。当检索数据时，通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性，他们可以在任何时候增加新的数据类型。为不同实体创建新的表，尔后通过连接进行查询。</p>
<p>　　连接可以在SELECT 语句的FROM子句或WHERE子句中建立，似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以，在Transact-SQL中推荐使用这种方法。</p>
<p>　　SQL-92标准所定义的FROM子句的连接语法格式为：</p>
<p>&nbsp;　　FROM join_table join_type join_table<br>　　[ON (join_condition)] </p>
<p>　　其中join_table指出参与连接操作的表名，连接可以对同一个表操作，也可以对多表操作，对同一个表操作的连接又称做自连接。</p>
<p>　　join_type 指出连接类型，可分为三种：内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作，并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同，内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是，外连接不只列出与连接条件相匹配的行，而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。</p>
<p>　　交叉连接(CROSS JOIN)没有WHERE 子句，它返回连接表中所有数据行的笛卡尔积，其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。</p>
<p>　　连接操作中的ON (join_condition) 子句指出连接条件，它由被连接表中的列和比较运算符、逻辑运算符等构成。</p>
<p>　　无论哪种连接都不能对text、ntext和image数据类型列进行直接连接，但可以对这三种列进行间接连接。例如：</p>
<p>&nbsp;　　SELECT p1.pub_id,p2.pub_id,p1.pr_info<br>　　FROM pub_info AS p1 INNER JOIN pub_info AS p2<br>　　ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) </p>
<p>　　(一)内连接<br>　　内连接查询操作列出与连接条件匹配的数据行，它使用比较运算符比较被连接列的列值。内连接分三种：<br>　　1、等值连接：在连接条件中使用等于号(=)运算符比较被连接列的列值，其查询结果中列出被连接表中的所有列，包括其中的重复列。<br>　　2、不等连接： 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括&gt;、&gt;=、&lt;=、&lt;、!&gt;、!&lt;和&lt;&gt;。<br>　　3、自然连接：在连接条件中使用等于(=)运算符比较被连接列的列值，但它使用选择列表指出查询结果集合中所包括的列，并删除连接表中的重复列。<br>　　例，下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社：</p>
<p>&nbsp;　 SELECT *<br>　　FROM authors AS a INNER JOIN publishers AS p<br>　　ON a.city=p.city<br>　　又如使用自然连接，在选择列表中删除authors 和publishers 表中重复列(city和state)：<br>　　SELECT a.*,p.pub_id,p.pub_name,p.country<br>　　FROM authors AS a INNER JOIN publishers AS p<br>　　ON a.city=p.city </p>
<p>　　(二)外连接<br>　　内连接时，返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时，它返回到查询结果集合中的不仅包含符合连接条件的行，而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来：</p>
<p>&nbsp;　 SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b<br>　　ON a.username=b.username </p>
<p>　　下面使用全外连接将city表中的所有作者以及user表中的所有作者，以及他们所在的城市：</p>
<p>&nbsp;　&nbsp; SELECT a.*,b.*<br>　　FROM city as a FULL OUTER JOIN user as b<br>　　ON a.username=b.username </p>
<p>　　(三)交叉连接<br>　　交叉连接不带WHERE 子句，它返回被连接的两个表所有数据行的笛卡尔积，返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例，titles表中有6类图书，而publishers表中有8家出版社，则下列交叉连接检索到的记录数将等于6*8=48行。<br>&nbsp;&nbsp;&nbsp;SELECT type,pub_name<br>　　FROM titles CROSS JOIN publishers<br>　　ORDER BY type<br></p>
<p>修改字段属性</p>
<p>alter table tablename modify id int(10) unsigned auto_increment primary key not null</p>
<p>修改默认值</p>
<p>alter table tablename alter id default 0</p>
<p>给字段增加primary key</p>
<p>alter table tablename add primary key(id);</p>
<p>删除primary key</p>
<p>1、alter table tablename drop primary key;</p>
<p>2、drop primary key on tablename;</p>
<p><br>查看table表结构</p>
<p>show create table tableName;</p>
<p><br>修改table表数据引擎</p>
<p>alter table tableName ENGINE = MyISAM (InnoDB);</p>
<p>增加字段<br>ALTER TABLE `table` ADD `field` INT(11) UNSIGNED NOT NULL</p>
<p>删除字段</p>
<p>alert table 'table' drop 'field'</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/true/aggbug/31625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2007-09-05 14:49 <a href="http://www.cppblog.com/true/archive/2007/09/05/31625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL使用tips【转】</title><link>http://www.cppblog.com/true/archive/2007/08/30/31191.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Thu, 30 Aug 2007 02:20:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2007/08/30/31191.html</guid><wfw:comment>http://www.cppblog.com/true/comments/31191.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2007/08/30/31191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/31191.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/31191.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="90%" align=center border=0>
    <tbody>
        <tr>
            <th class=f24>
            <h1>MySQL使用tips</h1>
            </th>
        </tr>
        <tr>
            <td align=middle height=20><font color=#999999><small>作者：叶金荣 (Email:imysql@gmail.com) 来源:http://imysql.cn (2006-07-12 17:05:03)</small></font></td>
        </tr>
        <tr>
            <td><br></td>
        </tr>
        <tr>
            <td class=l17><font class=f14 id=zoom><font color=#cccccc><!-- 正文begin --><br>1、用mysql内置函数转换ip地址和数字<br>利用两个内置函数<br>inet_aton:将ip地址转换成数字型<br>inet_ntoa:将数字型转换成ip地址<br><br>2、充分利用mysql内置的format函数<br>尤其是在处理字符格式的时候,例如将12345转换成12,345这样的,只要用:format(12345,0)即可,如果用format(12345,2)则显示的是12,345.00了...<br><br>3、利用mysql的内置函数处理时间戳问题<br>eg : select FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x');<br>结果: 2004 3rd August 03:35:48 2004<br><br>4、利用mysql_convert_table_format转换表类型<br>需要DBI和DBD的mysql相关模块支持才能用,例子:<br>mysql_convert_table_format --user=root --password='xx' --type=myisam test yejr<br><br>5、修改mysql表中的字段名<br>alter table tb_name change old_col new_col definition...<br><br>6、利用临时变量<br>select @var1:=a1+a2 as a_sum,@var2:=b1+b2 as b_sum,@var1+@var2 as total_sum from test_table xxx;<br><br>7、用int类型存储ip地址<br>原先错误的认为必须用bigint才够，后来发现使用int unsigned类型就足够了。 :)<br><br>8、CREATE TABLE IF NOT EXISTS ... select 语法局限<br>尽管只是对目标表的insert操作，但是&#8216;居然&#8217;不允许源表的insert操作，真是莫名其妙<br><br>9、利用IF函数快速修改ENUM字段值<br>一个例子：<br>update rule set enable = if('0' = enable,'1','0') where xxx;<br>enable 类型：enum('0','1') not null default '0'<br><br>10、事务无法嵌套<br><br>11、避免长时间的sleep连接造成的连接数超出问题<br>设定全局变量 wait_timeout 和 interactive_timeout 为比较小的值，例如 10(s)，就能使每个sleep连接在10s之后如果还没有查询的话自动断开。<br><!-- 正文end --><br>(http://www.fanqiang.com)<br></font></font></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/true/aggbug/31191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2007-08-30 10:20 <a href="http://www.cppblog.com/true/archive/2007/08/30/31191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql下如何执行sql脚本【转】</title><link>http://www.cppblog.com/true/archive/2007/07/17/28174.html</link><dc:creator>true</dc:creator><author>true</author><pubDate>Tue, 17 Jul 2007 02:45:00 GMT</pubDate><guid>http://www.cppblog.com/true/archive/2007/07/17/28174.html</guid><wfw:comment>http://www.cppblog.com/true/comments/28174.html</wfw:comment><comments>http://www.cppblog.com/true/archive/2007/07/17/28174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/true/comments/commentRss/28174.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/true/services/trackbacks/28174.html</trackback:ping><description><![CDATA[<table id=article4ccda6b5010008nw cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td align=middle></td>
        </tr>
        <tr id=articleBody4ccda6b5010008nw>
            <td class=aBody>
            <table class=description cellSpacing=0 cellPadding=0 align=center border=0>
                <tbody>
                    <tr>
                        <td align=middle>
                        <div class="sysBr500 text" id=articleText4ccda6b5010008nw align=left twffan="done">
                        <div twffan="done">&nbsp;
                        <p><font face=宋体>首要步骤(一般可省略):<br>开启mysql服务(默认是开机时就自动运行了):<br>控制面板--&gt;管理工具--&gt;服务,在里面找到名称为mysql的项,双击就可看它的服务状态是启动还是停止,把它设为启动</font></p>
                        <p><font face=宋体>连接mysql:<br>在命令行下输入 mysql -h localhost -u root -p回车,然后输入密码即可;或直接运行mysql自带的连接工具,然后输入密码即可.</font></p>
                        <p><font face=宋体>1.编写sql脚本,假设内容如下:</font></p>
                        <p><font face=宋体>&nbsp; create database dearabao;<br>&nbsp; use dearabao;<br>&nbsp; create table niuzi (name varchar(20));</font></p>
                        <p><font face=宋体>&nbsp; 保存脚本文件,假设我把它保存在F盘的hello world目录下,于是该文件的路径为:F:\hello world\niuzi.sql</font></p>
                        <p><font face=宋体><br>2.执行sql脚本,可以有2种方法:<br>&nbsp; 第一种方法:<br>&nbsp;在命令行下(未连接数据库),输入 mysql -h localhost -u root -p123456 &lt; F:\hello world\niuzi.sql (注意路径不用加引号的!!) 回车即可.<br>&nbsp; 第二种方法:<br>&nbsp;在命令行下(已连接数据库,此时的提示符为 mysql&gt; ),输入 source F:\hello world\niuzi.sql (注意路径不用加引号的) 或者 \. F:\hello world\niuzi.sql (注意路径不用加引号的) 回车即可</font></p>
                        <p><br>&nbsp;</p>
                        </div>
                        </div>
                        </td>
                    </tr>
                </tbody>
            </table>
            <table class=dashed cellSpacing=0 cellPadding=0 align=center border=0>
                <tbody>
                    <tr>
                        <td></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/true/aggbug/28174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/true/" target="_blank">true</a> 2007-07-17 10:45 <a href="http://www.cppblog.com/true/archive/2007/07/17/28174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>