<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://jyqx.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fjyqx.spaces.live.com%2fcategory%2f%e6%95%b0%e6%8d%ae%e5%ba%93%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>金颖的日志: 数据库</title><description /><link>http://jyqx.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=cat%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593</link><language>en-US</language><pubDate>Fri, 08 Aug 2008 02:40:04 GMT</pubDate><lastBuildDate>Fri, 08 Aug 2008 02:40:04 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://jyqx.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-434847513997895356</live:id><live:alias>jyqx</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>检查用户名是否重复的时候慎用count</title><link>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!241.entry</link><description>&lt;div&gt;数据量小的时候不觉得，量大了就知道了&lt;/div&gt;
&lt;div&gt;要用select语句取出然后再判断 这样效果比较好&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-434847513997895356&amp;page=RSS%3a+%e6%a3%80%e6%9f%a5%e7%94%a8%e6%88%b7%e5%90%8d%e6%98%af%e5%90%a6%e9%87%8d%e5%a4%8d%e7%9a%84%e6%97%b6%e5%80%99%e6%85%8e%e7%94%a8count&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=jyqx.spaces.live.com&amp;amp;GT1=jyqx"&gt;</description><comments>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!241.entry#comment</comments><guid isPermaLink="true">http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!241.entry</guid><pubDate>Wed, 11 Oct 2006 02:05:45 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://jyqx.spaces.live.com/blog/cns!F9F71C7D6CB19944!241/comments/feed.rss</wfw:commentRss><wfw:comment>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!241.entry#comment</wfw:comment><dcterms:modified>2006-10-11T02:05:45Z</dcterms:modified></item><item><title>MySQL编码问题，网上都没有说清楚</title><link>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!204.entry</link><description>&lt;div&gt;mysql自从4.1以后 就似乎存在编码的问题，但最近由于一个项目初期是用utf8的，做到一般要改成gb2312的，那么多的数据库要改成gb2312的比较麻烦，想想如果是以前3.23多好啊，随便我存什么就取什么！正因为这个念头，而且对mysql的编码也似懂非懂就自己稍微研究一下，研究过程先不说，结论就是，其实无论数据库定义为什么字符类型，只要程序中定义好那么你取出的数据还是完整的&lt;/div&gt; &lt;div&gt;&lt;strong&gt;比如我程序中用如下语句指定：&lt;/strong&gt;&lt;/div&gt; &lt;div&gt; &lt;hr&gt; &lt;/div&gt;&lt;pre&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;?&lt;/span&gt;
&lt;a style="color:#ffa500" href="http://www.php.net/header"&gt;header&lt;/a&gt;(&amp;quot;&lt;span style="color:#8b0000"&gt;Content-type: text/html; charset=GB2312&lt;/span&gt;&amp;quot;);
$db-&amp;gt;Execute(&amp;quot;&lt;span style="color:#8b0000"&gt;set names GB2312&lt;/span&gt;&amp;quot;);
$db-&amp;gt;Execute(&amp;quot;&lt;span style="color:#8b0000"&gt;SET CHARACTER SET GB2312&lt;/span&gt;&amp;quot;);
$db-&amp;gt;Execute(&amp;quot;&lt;span style="color:#8b0000"&gt;SET COLLATION_CONNECTION='gb2312_chinese_ci'&lt;/span&gt;&amp;quot;); 
&lt;span style="color:#0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;hr&gt;
&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;而我的数据库是utf8的，即便这样我存取中文依然没有问题，而且phpmyadmin里页面用utf8也正常显示中文&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;随后我又测试把上面的语句去掉，结果是意想不到的，程序中读取中文依然正常，但phpmyadmin里面变成了乱码!&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#000000"&gt;说道这里大家应该基本明白了吧，如果你用set语句指定了环境变量，mysql可以非常好的处理好字符串，无论你如何存取都可以得到准确的结果，而如果你没有用set语句 那么你也能存取你存入的数据，不过别人再读就有点困难了&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#000000"&gt;所以说大家如果在使用上面的一段代码后存入GB2312数据，再用下面的下面一段读取UTF8数据数据也是很正常的&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&lt;font color="#000000"&gt;
&lt;div&gt;
&lt;hr&gt;
&lt;/div&gt;&lt;pre&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;?&lt;/span&gt;
&lt;a style="color:#ffa500" href="http://www.php.net/header"&gt;header&lt;/a&gt;(&amp;quot;&lt;span style="color:#8b0000"&gt;Content-type: text/html; charset=UTF-8&lt;/span&gt;&amp;quot;);
$db-&amp;gt;Execute(&amp;quot;&lt;span style="color:#8b0000"&gt;set names utf8&lt;/span&gt;&amp;quot;);
$db-&amp;gt;Execute(&amp;quot;&lt;span style="color:#8b0000"&gt;SET CHARACTER SET utf8&lt;/span&gt;&amp;quot;);
$db-&amp;gt;Execute(&amp;quot;&lt;span style="color:#8b0000"&gt;SET COLLATION_CONNECTION='utf8_unicode_ci'&lt;/span&gt;&amp;quot;); 
&lt;span style="color:#0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;hr&gt;
&lt;/div&gt;&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-434847513997895356&amp;page=RSS%3a+MySQL%e7%bc%96%e7%a0%81%e9%97%ae%e9%a2%98%ef%bc%8c%e7%bd%91%e4%b8%8a%e9%83%bd%e6%b2%a1%e6%9c%89%e8%af%b4%e6%b8%85%e6%a5%9a&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=jyqx.spaces.live.com&amp;amp;GT1=jyqx"&gt;</description><comments>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!204.entry#comment</comments><guid isPermaLink="true">http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!204.entry</guid><pubDate>Thu, 10 Aug 2006 09:02:01 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://jyqx.spaces.live.com/blog/cns!F9F71C7D6CB19944!204/comments/feed.rss</wfw:commentRss><wfw:comment>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!204.entry#comment</wfw:comment><dcterms:modified>2006-08-19T05:24:01Z</dcterms:modified></item><item><title>垃圾索引引起的MySQL性能下降</title><link>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!202.entry</link><description>&lt;div&gt;前段时间有个程序运行在一个精简过数据的mysql上，所用到的库从曾经的3.6G降到了400M，但最近发现这个mysql特别占资源，双至强的cpu，10秒钟都可以到100％，修复n次都没找到问题，后来发现索引文件的大小几乎和数据库大小一样，后来才想到有可能是精简库的时候没有重建索引，果然重建索引后mysql的系统占用降低到了20％以下！&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;（注：上面这个库每秒模糊搜索10次以上）&lt;/strong&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-434847513997895356&amp;page=RSS%3a+%e5%9e%83%e5%9c%be%e7%b4%a2%e5%bc%95%e5%bc%95%e8%b5%b7%e7%9a%84MySQL%e6%80%a7%e8%83%bd%e4%b8%8b%e9%99%8d&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=jyqx.spaces.live.com&amp;amp;GT1=jyqx"&gt;</description><comments>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!202.entry#comment</comments><guid isPermaLink="true">http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!202.entry</guid><pubDate>Thu, 27 Jul 2006 06:01:01 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://jyqx.spaces.live.com/blog/cns!F9F71C7D6CB19944!202/comments/feed.rss</wfw:commentRss><wfw:comment>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!202.entry#comment</wfw:comment><dcterms:modified>2006-07-27T06:01:01Z</dcterms:modified></item><item><title>MySQL中的一些函数</title><link>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!183.entry</link><description>&lt;div&gt;
&lt;div&gt;
&lt;p&gt;&lt;font size=2&gt;算数运算子&lt;br&gt;+, -, *, /&lt;br&gt;除于 0 会等于 NULL。&lt;br&gt;比较运算子&lt;br&gt;任何东西跟 NULL 比较会等于 NULL。&lt;br&gt;比较字符串通常不需要注意大小写，如果要比较大小写，用 BINARY 关键词。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;SELECT *&lt;br&gt;FROM department&lt;br&gt;WHERE name = BINARY 'marketing';&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;=      相等&lt;br&gt;!= 或 &amp;lt;&amp;gt;    不相等&lt;br&gt;&amp;lt;      小于&lt;br&gt;&amp;lt;=     小或等于&lt;br&gt;&amp;gt;      大于&lt;br&gt;&amp;gt;=     大或等于&lt;br&gt;n BETWEEN&lt;br&gt;min AND max    测试范围&lt;br&gt;n IN (set)    set 可以是一系列的数值或子查询。&lt;br&gt;&amp;lt;=&amp;gt;    可以比较 NULL，如果比较两个 NULL 会传回 1。&lt;br&gt;n IS NULL    测试 n 是否 NULL。&lt;br&gt;ISNULL(n)    测试 n 是否 NULL。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;逻辑运算子&lt;br&gt;传回的值有 1 (true), 0 (false, 或 NULL。&lt;br&gt;任何不是 0 或不是 NULL 的值都是 true。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;AND 或 &amp;amp;&amp;amp;  n &amp;amp;&amp;amp; m       和&lt;br&gt;               true &amp;amp;&amp;amp; true = true&lt;br&gt;               false &amp;amp;&amp;amp; anything = false&lt;br&gt;               其它会等于 NULL&lt;br&gt;OR 或 ||   n || m       或&lt;br&gt;               true || anything = true&lt;br&gt;               NULL || false = NULL&lt;br&gt;               NULL || NULL = NULL&lt;br&gt;               false || false = false&lt;br&gt;NOT 或 !    NOT n      不是&lt;br&gt;               !true = false&lt;br&gt;               !false = true&lt;br&gt;               !NULL = NULL&lt;br&gt;XOR    n XOR m      不包含的 OR&lt;br&gt;               true XOR true = false&lt;br&gt;               true XOR false = true&lt;br&gt;               false XOR true = true&lt;br&gt;               NULL XOR n = NULL&lt;br&gt;               n XOR NULL = NULL&lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=2&gt;控制流向的函式&lt;br&gt;IF (e1, e2, e3)&lt;br&gt;如果 e1 是 true，IF 会传回 e2，不然会传回 e3。&lt;br&gt;CASE value&lt;br&gt;WHEN [compare-value] THEN result&lt;br&gt;[WHEN [compare-value] THEN result ...]&lt;br&gt;[ELSE result]&lt;br&gt;END&lt;br&gt;或是&lt;br&gt;CASE&lt;br&gt;WHEN [condition] THEN result&lt;br&gt;[WHEN [condition] THEN result ...]&lt;br&gt;[ELSE result]&lt;br&gt;END&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;SELECT workdate, CASE&lt;br&gt;    WHEN workdate &amp;lt; 2000-01-01 THEN &amp;quot;archived&amp;quot;&lt;br&gt;    WHEN workdate &amp;lt; 2003-01-01 THEN &amp;quot;old&amp;quot;&lt;br&gt;    ELSE &amp;quot;current&amp;quot;&lt;br&gt;    END&lt;br&gt;FROM assignment;&lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=2&gt;字符串函式&lt;br&gt;concat(s1, s2, ...) - 连接字符串 s1 和 s2...&lt;br&gt;conv(n, original_base, new_base) - 转换数字 n 从本来的 base 到新的 base&lt;br&gt;length(s) - 找字符串的长度&lt;br&gt;load_file(filename) - 依照字符串传回档案的内容&lt;br&gt;locate(needle, haystack, position) - 传回 needle 字符串的开始位置，在 haystack 字符串里，从 position 开始&lt;br&gt;lower(s) and upper(s) - 转换 s 到小写或大写&lt;br&gt;quote(s) - 跳脱 s 字符串，让它可以安全输入数据库&lt;br&gt;replace(target, find, replace) - 传回 target 字符串，将 find 字符串覆盖成 replace 字符串&lt;br&gt;soundex(s) - 传回跟 s 类似的 soundex 字符串。soundex 是字符串的发音&lt;br&gt;substring(s, position, length) - 传回字符串里的字符串，s 是本来的字符串，position 是开始的位置，length 是传回的字数&lt;br&gt;trim(s) - 移除开头跟字尾的空格符。也可以用 rtrim() 或 ltrim()&lt;br&gt;字符串比较的函式&lt;br&gt;LIKE - 利用通配字符来进行比较&lt;br&gt;RLIKE - 利用正规表示法来进行比较&lt;br&gt;STRCMP - 比较字符串，类似 C 里面的 strcmp()&lt;br&gt;MATCH - 进行 full-text 比较&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;利用通配字符来进行比较&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;SELECT *&lt;br&gt;FROM department&lt;br&gt;WHERE name LIKE '%research%';&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;% 会吻合任何字数，包括 0。&lt;br&gt;_ 会吻合单一字数， _at 会吻合 cat, mat, bat...&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;利用正规表示法来进行比较&lt;br&gt;RLIKE 可以用来吻合正规表示法。&lt;br&gt;'cat' 会吻合 'catacomb' 和 'the cat sat on the mat'。&lt;br&gt;如果只要吻合 'cat'，用 '^cat$'。&lt;br&gt;^ 表示在吻合的字符串开头是 'cat'。&lt;br&gt;$ 表示在吻合的字符串最后是 'cat'。&lt;br&gt;. 可以用来代表通配字符，'.at' 会吻合 'cat', 'bat', 'mat'。&lt;br&gt;* 表示字符可以出现零或多次，'n*' 会吻合 '', 'nn', 'nnn'。&lt;br&gt;() 会归类字符，'(cat)*' 会吻合 '', 'cat', 'catcat', 'catcatcat'。&lt;br&gt;.* 会吻合任何字或字符串。&lt;br&gt;+ 表示在他之后的字或字符串会重复一或多次。&lt;br&gt;? 表示吻合一或零次。&lt;br&gt;列出特定的范围，'(cat)(2,4)' 会吻合 'catcat', 'catcatcat', 和 'catcatcatcat'。&lt;br&gt;[] 可以列出一系列的文字，'[a-z]' 会吻合任何字母，'[a-z]*' 会吻合任何数量的字母。&lt;br&gt;文字类别，[[:alnum:]] 会吻合任何字母和数字的文字。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;SELECT *&lt;br&gt;FROM department&lt;br&gt;WHERE name RLIKE 'an';&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;这会吻合全部有包括 'an' 的部门。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;用 STRCMP() 来比较字符串&lt;br&gt;STRCMP(s1, s2)&lt;br&gt;如果字符串相同会传回 0，-1 如果 s1 比 s2 小 (s1 比 s2 早出现)。&lt;br&gt;1 如果 s1 比 s2 大 (s1 比 s2 晚出现)。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;SELECT STRCMP('cat', 'cat');&lt;br&gt;// 传回 0&lt;br&gt;SELECT STRCMP('cat', 'dog');&lt;br&gt;// 传回 -1&lt;br&gt;SELECT STRCMP('cat', 'ant');&lt;br&gt;// 传回 1&lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=2&gt;数字函式&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;abs(n)&lt;br&gt; 传回 n 的正数&lt;br&gt; &lt;br&gt;ceiling(n)&lt;br&gt; n rounded up to the nearest integer&lt;br&gt; &lt;br&gt;floor(n)&lt;br&gt; n rounded down to the nearest integer&lt;br&gt; &lt;br&gt;mod(n,m) 和 div&lt;br&gt; 这两个函式会将 n 除于 m。div 传回商数，mod() 会传回剩余数。&lt;br&gt; &lt;br&gt;power(n,m)&lt;br&gt; n to the power of m&lt;br&gt; &lt;br&gt;rand(n)&lt;br&gt; 传回 0 到 1 的随意数。n 可以不提供，如果提供会用来产生随意数。&lt;br&gt;相同的 n 会产生相同的随意数。&lt;br&gt; &lt;br&gt;round(n[,d])&lt;br&gt; n rounded to the nearest integer. if supply d, n will be rounded to d decimal places.&lt;br&gt; &lt;br&gt;sqrt(n)&lt;br&gt; 传回 n 的平方&lt;br&gt; &lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;mod() 可以是 mod(9,2) 或 9 mod 2 或 9 % 2。&lt;br&gt;div 只能用 9 div 2。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;SELECT 9 mod 2;&lt;br&gt;// 传回 1&lt;br&gt;SELECT 9 div 2;&lt;br&gt;// 传回 4&lt;/font&gt;
&lt;p&gt;&lt;br&gt;&lt;font size=2&gt;日期和时间函式&lt;br&gt;adddate(date, INTERVAL n type) 和 subdate(date, INTERVAL n type)&lt;br&gt;这些函式可以用来增加和减少日期。从 date 的日期开始计算，然后增加或减少 INTERVAL 后的日期范围。&lt;br&gt;你必须提供 n 和他的类型。类型可以是 SECOND, MINUTE, HOUR, DAY, MONTH, YEAR, MINUTE:SECOND (m:s),&lt;br&gt;HOUR:MINUTE (h:m), DAY_HOUR(d h), YEAR_MONTH (y-m), HOUR_SECOND (h:m:s), DAY_MINUTE (d h:m),&lt;br&gt;DAY_SECOND (d h:m:s)。&lt;br&gt;curdate(), curtime(), now()&lt;br&gt;这些函式会传回目前的日期，目前的时间，还有时间和日期。&lt;br&gt;date_format(date, format) 和 time_format(time, format)&lt;br&gt;这些可以用来改变日期和时间的格式。&lt;br&gt;你必须提供格式的字符串，譬如说 date_format(workdate, '%W %D of %M, %Y')，&lt;br&gt;这会给你 'Monday 16th of June, 2003)。&lt;br&gt;全部可用的格式请看 MySQL 的手册。&lt;br&gt;dayname(date)&lt;br&gt;传回日期的名称，例如 Monday。&lt;br&gt;extract(type FROM date)&lt;br&gt;传回 date 的日期，譬如说 YEAR，他就会传回那个日期的年数。&lt;br&gt;函式可用的类型跟 adddate() 和 subdate() 的类型相同。&lt;br&gt;unix_timestamp([date])&lt;br&gt;传回目前的 Unix 时间。如果跟 date 一起使用，传回的日期会从 date 的日期开始计算。&lt;br&gt;范例：&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;程序代码:&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;SELECT adddate(&amp;quot;1999-01-01&amp;quot;, INTERVAL &amp;quot;1-6&amp;quot; YEAR_MONTH);&lt;br&gt;// 传回 2000-07-01&lt;br&gt;SELECT unix_timestamp(adddate(&amp;quot;1999-01-01&amp;quot;, INTERVAL &amp;quot;1-6&amp;quot; YEAR_MONTH);&lt;br&gt;// 传回 962373600&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;可以用 PHP 的 date() 函式来将 Unix 的时间格式化。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;cast 函式&lt;br&gt;cast 可以用来改变类型，用 cast() 和 convert() 函式。&lt;br&gt;两个函式相同，但是不同的语法构造。&lt;br&gt;cast(expression AS type)&lt;br&gt;convert(expression, type)&lt;br&gt;cast() 是依照 ANSI 的规格，convert() 是依照 ODBC 的规格。&lt;br&gt;类型可以是 BINARY, CHAR, DATE, DATETIME, SIGNED (INTEGER), 和 UNSIGNED (INTEGER)。&lt;br&gt;通常 MySQL 会自动帮你改变类型。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;其它函式&lt;br&gt;benchmark(count, expression)&lt;br&gt;这个函式是用来测试查询的速度，只会传回 0 值。&lt;br&gt;encrypt(s[,salt])&lt;br&gt;将 s 加密用 Unix 的加密系统。salt 字符串是两个字符的字符串，可以不用。&lt;br&gt;如果没有 crypt 功能，像在 Windows 系统，这个函式会传回 NULL。&lt;br&gt;found_rows()&lt;br&gt;传回字段的数量，如果没有用 LIMIT。&lt;br&gt;只有在 SELECT 里使用 SQL_CALC_FOUND_ROWS 才能用这个函式。&lt;br&gt;last_insert_id()&lt;br&gt;传回最后产生的 AUTO_INCREMENT 值。&lt;br&gt;md5(s)&lt;br&gt;传回 128bit MD5 的加密字符串。&lt;br&gt;password(s)&lt;br&gt;计算 s 的密码，不建议用这个函式来储存密码。&lt;/font&gt;
&lt;p&gt;&lt;font size=2&gt;用于 GROUP BY 的函式&lt;br&gt;这些还是专门为了 GROUP BY 而写的。&lt;br&gt;avg(column) - 传回字段的平均值&lt;br&gt;count(column) - 传回字段的数量&lt;br&gt;min(column) - 传回字段的最小值&lt;br&gt;max(column) - 传回字段的最大值&lt;br&gt;std(column) - 传回字段的标准差&lt;br&gt;sum(column) - 传回字段的总数&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-434847513997895356&amp;page=RSS%3a+MySQL%e4%b8%ad%e7%9a%84%e4%b8%80%e4%ba%9b%e5%87%bd%e6%95%b0&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=jyqx.spaces.live.com&amp;amp;GT1=jyqx"&gt;</description><comments>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!183.entry#comment</comments><guid isPermaLink="true">http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!183.entry</guid><pubDate>Tue, 06 Jun 2006 22:19:57 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://jyqx.spaces.live.com/blog/cns!F9F71C7D6CB19944!183/comments/feed.rss</wfw:commentRss><wfw:comment>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!183.entry#comment</wfw:comment><dcterms:modified>2006-07-26T03:51:33Z</dcterms:modified></item><item><title>Mysql数据库的索引分析和优化</title><link>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!182.entry</link><description>&lt;div&gt;&lt;font style="font-size:14px;font-family:宋体, Verdana, Arial, Helvetica, sans-serif"&gt;
&lt;p&gt;
&lt;p style="text-indent:2em"&gt;&lt;strong&gt;一、什么是索引？&lt;/strong&gt; 
&lt;p&gt;　　索引用来快速地寻找那些具有特定值的记录，所有MySQL索引都以B-树的形式保存。如果没有索引，执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录，直至找到符合要求的记录。表里面的记录数量越多，这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引，MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录，通过索引查找记录至少要比顺序扫描记录快100倍。
&lt;p&gt;　　假设我们创建了一个名为people的表：
&lt;div&gt;
&lt;p&gt;CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );&lt;/div&gt;
&lt;p&gt;　　然后，我们完全随机把1000个不同name值插入到people表。下图显示了people表所在数据文件的一小部分：
&lt;p&gt; 
&lt;p&gt;

&lt;p&gt;
&lt;p&gt;&lt;img height=115 alt="" src="http://www.stupai.com/tech/UploadPic/2006-5/2006519153119685.gif" width=232&gt;
&lt;p&gt;
&lt;p&gt;　　可以看到，在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引，MySQL将在索引中排序name列：
&lt;p&gt; 
&lt;p&gt;

&lt;p&gt;
&lt;p&gt;&lt;img height=119 alt="" src="http://www.stupai.com/tech/UploadPic/2006-5/2006519153120570.gif" width=162&gt;
&lt;p&gt;
&lt;p&gt;　　对于索引中的每一项，MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此，如果我们要查找name等于“Mike”记录的peopleid（SQL命令为“SELECT peopleid FROM people WHERE name=\’Mike\’;”），MySQL能够在name的索引中查找“Mike”值，然后直接转到数据文件中相应的行，准确地返回该行的peopleid（999）。在这个过程中，MySQL只需处理一个行就可以返回结果。如果没有“name”列的索引，MySQL要扫描数据文件中的所有记录，即1000个记录！显然，需要MySQL处理的记录数量越少，则它完成任务的速度就越快。
&lt;p style="text-indent:2em"&gt;二、索引的类型
&lt;p&gt;　　MySQL提供多种索引类型供选择：
&lt;ul&gt;
&lt;li&gt;普通索引&lt;br&gt;这是最基本的索引类型，而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建： 
&lt;ul&gt;
&lt;li&gt;创建索引，例如CREATE INDEX &amp;lt;索引的名字&amp;gt; ON tablename (列的列表); 
&lt;li&gt;修改表，例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表); 
&lt;li&gt;创建表的时候指定索引，例如CREATE TABLE tablename ( […], INDEX [索引的名字] (列的列表) ); &lt;/ul&gt;
&lt;li&gt;唯一性索引&lt;br&gt;这种索引和前面的“普通索引”基本相同，但有一个区别：索引列的所有值都只能出现一次，即必须唯一。唯一性索引可以用以下几种方式创建： 
&lt;ul&gt;
&lt;li&gt;创建索引，例如CREATE UNIQUE INDEX &amp;lt;索引的名字&amp;gt; ON tablename (列的列表); 
&lt;li&gt;修改表，例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表); 
&lt;li&gt;创建表的时候指定索引，例如CREATE TABLE tablename ( […], UNIQUE [索引的名字] (列的列表) ); &lt;/ul&gt;
&lt;li&gt;主键&lt;br&gt;主键是一种唯一性索引，但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列，你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定，例如“CREATE TABLE tablename ( […], PRIMARY KEY (列的列表) ); ”。但是，我们也可以通过修改表的方式加入主键，例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。 
&lt;li&gt;全文索引&lt;br&gt;MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中，全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建，也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集，通过ALTER TABLE（或者CREATE INDEX）命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引，要了解更多信息，请参见MySQL documentation。 &lt;/ul&gt;
&lt;p style="text-indent:2em"&gt;三、单列索引与多列索引
&lt;p&gt;　　索引可以是单列索引，也可以是多列索引。下面我们通过具体的例子来说明这两种索引的区别。假设有这样一个people表：
&lt;div&gt;
&lt;p&gt;ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);&lt;/div&gt;
&lt;p&gt;　　由于索引文件以B-树格式保存，MySQL能够立即转到合适的firstname，然后再转到合适的lastname，最后转到合适的age。在没有扫描数据文件任何一个记录的情况下，MySQL就正确地找出了搜索的目标记录！
&lt;p&gt;　　那么，如果在firstname、lastname、age这三个列上分别创建单列索引，效果是否和创建一个firstname、lastname、age的多列索引一样呢？答案是否定的，两者完全不同。当我们执行查询的时候，MySQL只能使用一个索引。如果你有三个单列的索引，MySQL会试图选择一个限制最严格的索引。但是，即使是限制最严格的单列索引，它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。
&lt;p&gt;&lt;strong&gt;　　四、最左前缀&lt;/strong&gt;
&lt;p&gt;　　多列索引还有另外一个优点，它通过称为最左前缀（Leftmost Prefixing）的概念体现出来。继续考虑前面的例子，现在我们有一个firstname、lastname、age列上的多列索引，我们称这个索引为fname_lname_age。当搜索条件是以下各种列的组合时，MySQL将使用fname_lname_age索引：
&lt;ul&gt;
&lt;li&gt;firstname，lastname，age 
&lt;li&gt;firstname，lastname 
&lt;li&gt;firstname &lt;/ul&gt;
&lt;p&gt;　　从另一方面理解，它相当于我们创建了(firstname，lastname，age)、(firstname，lastname)以及(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引：
&lt;p&gt;　　找到有关该命令的更多说明。下面是一个例子：
&lt;table bordercolor="#111111" cellspacing=0 cellpadding=5 width="95%" bgcolor="#e9e9e9" border=1&gt;
&lt;tbody&gt;
&lt;tr align=middle bgcolor="#dbdbdb"&gt;
&lt;td&gt;table
&lt;td&gt;type
&lt;td&gt;possible_keys
&lt;td&gt;key
&lt;td&gt;key_len
&lt;td&gt;ref
&lt;td&gt;rows
&lt;td&gt;Extra
&lt;tr&gt;
&lt;td&gt;people
&lt;td&gt;ref
&lt;td&gt;fname_lname_age
&lt;td&gt;fname_lname_age
&lt;td&gt;102
&lt;td&gt;const,const,const
&lt;td&gt;1
&lt;td&gt;Where used&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt; 
&lt;p style="text-indent:2em"&gt;下面我们就来看看这个EXPLAIN分析结果的含义。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;table&lt;/strong&gt;：这是表的名字。 
&lt;li&gt;&lt;strong&gt;type&lt;/strong&gt;：连接操作的类型。下面是MySQL文档关于ref连接类型的说明： 
&lt;p&gt;“对于每一种与另一个表中记录的组合，MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀，或者如果键不是UNIQUE或PRIMARY KEY类型（换句话说，如果连接操作不能根据键值选择出唯一行），则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录，则ref是一种好的连接类型。”
&lt;p&gt;在本例中，由于索引不是UNIQUE类型，ref是我们能够得到的最好连接类型。
&lt;p&gt;如果EXPLAIN显示连接类型是“ALL”，而且你并不想从表里面选择出大多数记录，那么MySQL的操作效率将非常低，因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息，请参见MySQL的手册说明。 
&lt;li&gt;&lt;strong&gt;possible_keys&lt;/strong&gt;：&lt;br&gt;可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称；如果索引没有昵称，则默认显示的是索引中第一个列的名字（在本例中，它是“firstname”）。默认索引名字的含义往往不是很明显。 
&lt;li&gt;&lt;strong&gt;Key&lt;/strong&gt;：&lt;br&gt;它显示了MySQL实际使用的索引的名字。如果它为空（或NULL），则MySQL不使用索引。 
&lt;li&gt;&lt;strong&gt;key_len&lt;/strong&gt;：&lt;br&gt;索引中被使用部分的长度，以字节计。在本例中，key_len是102，其中firstname占50字节，lastname占50字节，age占2字节。如果MySQL只使用索引中的firstname部分，则key_len将是50。 
&lt;li&gt;&lt;strong&gt;ref&lt;/strong&gt;：&lt;br&gt;它显示的是列的名字（或单词“const”），MySQL将根据这些列来选择行。在本例中，MySQL根据三个常量选择行。 
&lt;li&gt;&lt;strong&gt;rows&lt;/strong&gt;：&lt;br&gt;MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然，这里最理想的数字就是1。 
&lt;li&gt;&lt;strong&gt;Extra&lt;/strong&gt;：&lt;br&gt;这里可能出现许多不同的选项，其中大多数将对查询产生负面影响。在本例中，MySQL只是提醒我们它将用WHERE子句限制搜索结果集。 &lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;　　七、索引的缺点&lt;/strong&gt;
&lt;p&gt;　　到目前为止，我们讨论的都是索引的优点。事实上，索引也是有缺点的。
&lt;p&gt;　　首先，索引要占用磁盘空间。通常情况下，这个问题不是很突出。但是，如果你创建每一种可能列组合的索引，索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表，索引文件的大小可能达到操作系统允许的最大文件限制。
&lt;p&gt;　　第二，对于需要写入数据的操作，比如DELETE、UPDATE以及INSERT操作，索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件，而且它还要把这些改动写入索引文件。
&lt;p&gt;　　【结束语】在大型数据库中，索引是提高速度的一个关键因素。不管表的结构是多么简单，一次500000行的表扫描操作无论如何不会快。如果你的网站上也有这种大规模的表，那么你确实应该花些时间去分析可以采用哪些索引，并考虑是否可以改写查询以优化应用。要了解更多信息，请参见MySQL manual。另外注意，本文假定你所使用的MySQL是3.23版，部分查询不能在3.22版MySQL上执行。
&lt;p&gt;&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-434847513997895356&amp;page=RSS%3a+Mysql%e6%95%b0%e6%8d%ae%e5%ba%93%e7%9a%84%e7%b4%a2%e5%bc%95%e5%88%86%e6%9e%90%e5%92%8c%e4%bc%98%e5%8c%96&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=jyqx.spaces.live.com&amp;amp;GT1=jyqx"&gt;</description><comments>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!182.entry#comment</comments><guid isPermaLink="true">http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!182.entry</guid><pubDate>Mon, 05 Jun 2006 00:02:32 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://jyqx.spaces.live.com/blog/cns!F9F71C7D6CB19944!182/comments/feed.rss</wfw:commentRss><wfw:comment>http://jyqx.spaces.live.com/Blog/cns!F9F71C7D6CB19944!182.entry#comment</wfw:comment><dcterms:modified>2006-06-05T00:02:32Z</dcterms:modified></item></channel></rss>