<?xml version="1.0" encoding="GB2312"?>  
<rss version="2.0" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
xmlns:admin="http://webns.net/mvcb/" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
  
<channel> 
<title><![CDATA[LAMP笔记]]></title> 
<link>http://linux.bokee.com/index.html</link> 
<description><![CDATA[中文linux笔记；linux；红旗linux；lamp;php；linux资料；apache；linux下载；symfony；ajax；mysql；LAMP笔记]]></description> 
<dc:language>zh-cn</dc:language> 
<dc:creator>china_linux@163.com</dc:creator> 
<dc:date>2008-08-04T16:03:04Z</dc:date> 
<admin:generatorAgent rdf:resource="http://blog.bokee.com.com" /> 

<item> 
<title><![CDATA[查询重复记录]]></title> 
<link>http://linux.bokee.com/6776293.html</link> 
<description><![CDATA[用select语句，查询重复记录<br />假设，表名为 T1 子段为 A,B,C<br />&amp;nbsp;select count(*) ,A,B,C from T1<br />&amp;nbsp;&amp;nbsp; group by A,B,C having count(*) &amp;gt; 1 <br /><br />测试数据：<br />&amp;nbsp;&amp;nbsp;&amp;nbsp; A100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; A101&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B101&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C101&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; A102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; A102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; A102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; A102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; A100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />运行结果：<br />2&amp;nbsp;&amp;nbsp;&amp;nbsp; A100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <br />3&amp;nbsp;&amp;nbsp;&amp;nbsp; A102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B102&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; C102&amp;nbsp;&amp;nbsp;&amp;nbsp;]]></description> 
<guid isPermaLink="false">6776293@http://linux.bokee.com/</guid> 
<dc:subject>Web开发</dc:subject> 
<dc:date>2008-08-06T17:15:02Z</dc:date> 
</item> 
<item> 
<title><![CDATA[SourceForge宣布了2008年度社区选择奖]]></title> 
<link>http://linux.bokee.com/6774780.html</link> 
<description><![CDATA[<p><br />最可能改变世界的项目：<a href="http://www.linux.org/">Linux</a>；<br />最佳项目、最佳企业项目和最佳教育项目皆为<a href="http://www.openoffice.org/">OpenOffice.org</a>；<br />最有可能成为下个10亿美元收购项目：<a href="http://sourceforge.net/projects/phpmyadmin">phpMyAdmin</a>；<br />最佳多媒体项目：<a href="http://www.videolan.org/vlc/">VLC</a>；<br />最佳游戏项目：<a href="http://sourceforge.net/projects/xbmc">XBMC</a>；<br />最佳新项目：<a href="http://www.magentocommerce.com/">Magento</a>；<br />最有可能被起诉侵犯专利的项目：<a href="http://sourceforge.net/projects/wine">Wine Is Not an Emulator</a>；<br />最有可能让用户被过时的行业协会为保护死亡的商业模式起诉的项目：<a href="http://sourceforge.net/projects/emule">eMule</a>；<br />最佳系统管理工具：<a href="http://sourceforge.net/projects/phpmyadmin">phpMyAdmin</a>；<br />最佳开发者工具：<a href="http://sourceforge.net/projects/notepad-plus">Notepad++</a>。</p><p>Notepad++的作者是中国台湾省深绿人士，所以建议我们的同胞像他抵-制#北^京*奥@运!会一样抵制他的项目</p>]]></description> 
<guid isPermaLink="false">6774780@http://linux.bokee.com/</guid> 
<dc:subject>新闻</dc:subject> 
<dc:date>2008-08-04T16:03:03Z</dc:date> 
</item> 
<item> 
<title><![CDATA[mysql丢失.myd .myi 文件原因及处理办法]]></title> 
<link>http://linux.bokee.com/6768459.html</link> 
<description><![CDATA[<p>　　今天突然发现部分表不能打开了，并提示如上信息。数据库目录里丢失了 .myd .myi 文件，只剩下了个对应的.frm文件。找不到了！</p><p>　　以为是普通的表损坏故障，但是所有的修复方法都不管用。</p><p>　　经过仔细排查，原来是一个疏忽了的小问题：数据库中大部分表都是 MyISAM引擎的，而新建的表默认是用的InnoDB引擎，本来是没有问题的，用InnoDB也可以正常运行，只是今天在对数据库配置文件my.ini优化时顺手关掉了 InnoDB 引擎，因为根本不打算用InnoDB引擎。</p><p>　　所以导致打不开这个默认使用InnoDB引擎的表，开启InnoDB引擎后该表恢复正常。</p><p>　　因为InnoDB的数据单独存储，和MyISAM的存储方式不同，所以也就导致找不到.myd .myi文件了。</p>]]></description> 
<guid isPermaLink="false">6768459@http://linux.bokee.com/</guid> 
<dc:subject>Web开发</dc:subject> 
<dc:date>2008-07-26T09:23:57Z</dc:date> 
</item> 
<item> 
<title><![CDATA[js判断输入是否中文，数字，身份证等函数]]></title> 
<link>http://linux.bokee.com/6760277.html</link> 
<description><![CDATA[* <br />判断指定的内容是否为空，若为空则弹出 警告框 <br />*/ <br />function isEmpty(theValue, strMsg){ <br />if(theValue==&amp;quot;&amp;quot;){ <br />alert(strMsg+&amp;quot;不能为空!&amp;quot;); <br />return true; <br />} <br />return false; <br />} <br />/* <br />中文判断函数，允许生僻字用英文“*”代替 <br />返回true表示是符合条件，返回false表示不符合 <br />*/ <br />function isChinese(str){ <br />var badChar =&amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;; <br />badChar += &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;; <br />badChar += &amp;quot;0123456789&amp;quot;; <br />badChar += &amp;quot; &amp;quot;+&amp;quot;　&amp;quot;;//半角与全角空格 <br />badChar += &amp;quot;<a href="mailto:`~!@#$%^&amp;()-_=+]  |:; "   <,>?/";//"><font color="#000000">`~!@#$%^&amp;amp;()-_=+]\\|:;\&amp;quot;\\'&amp;lt;,&amp;gt;?/&amp;quot;;//</font></a>不包含*或.的英文符号 <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />for(var i=0;i var c = str.charAt(i);//字符串str中的字符 <br />if(badChar.indexOf(c) &amp;gt; -1){ <br />return false; <br />} <br />} <br />return true; <br />} <br />/* <br />数字判断函数，返回true表示是全部数字，返回false表示不全部是数字 <br />*/ <br />function isNumber(str){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />var reg = /\D/; <br />return str.match(reg)==null; <br />} <p>/* <br />判断给定的字符串是否为指定长度的数字 <br />是返回true，不是返回false <br />*/ <br />function isNumber_Ex(str,len){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />}</p><p>if(str.length!=len){ <br />return false; <br />}</p><p>if(!isNumber(str)){ <br />return false; <br />} <br />return true; <br />}</p><p>/* <br />money判断函数，允许第一位为&amp;quot;-&amp;quot;来表示欠钱 <br />返回true表示格式正确，返回false表示格式错误 <br />*/ <br />function isMoney(str){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />for(var i=0;i var c = str.charAt(i); <br />if(i==0){ <br />if(c!=&amp;quot;-&amp;quot;&amp;amp;&amp;amp;(c&amp;lt;&amp;quot;0&amp;quot;||c&amp;gt;&amp;quot;9&amp;quot;)){ <br />return false; <br />}else if(c==&amp;quot;-&amp;quot;&amp;amp;&amp;amp;str.length==1){ <br />return false; <br />} <br />}else if(c &amp;lt; &amp;quot;0&amp;quot; || c &amp;gt; &amp;quot;9&amp;quot;){ <br />return false; <br />} <br />} <br />return true; <br />} <br />/* <br />英文判断函数，返回true表示是全部英文，返回false表示不全部是英文 <br />*/ <br />function isLetter(str){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />for(var i=0;i var c = str.charAt(i); <br />if((c&amp;lt;&amp;quot;a&amp;quot;||c&amp;gt;&amp;quot;z&amp;quot;)&amp;amp;&amp;amp;(c&amp;lt;&amp;quot;A&amp;quot;||c&amp;gt;&amp;quot;Z&amp;quot;)){ <br />return false; <br />} <br />} <br />return true; <br />} <br />/* <br />空格判断，当包含有空格返回false，当不包含一个空格返回true <br />&amp;quot;&amp;quot;不能被判断 <br />*/ <br />function notInSpace(str){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />var badChar =&amp;quot; &amp;quot;; <br />badChar += &amp;quot;　&amp;quot;; <br />for(var i=0;i var c = str.charAt(i);//字符串str中的字符 <br />if(badChar.indexOf(c) &amp;gt; -1){ <br />return false; <br />} <br />} <br />return true; <br />} <br />/* <br />发票号判断函数，返回true表示是发票号，返回false表示不符合规范 <br />*/ <br />function isFPH(str){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />for(var i=0;i var c = str.charAt(i); <br />if((c &amp;lt; &amp;quot;0&amp;quot; || c &amp;gt; &amp;quot;9&amp;quot;) &amp;amp;&amp;amp; (c!=&amp;quot;-&amp;quot;)&amp;amp;&amp;amp;(c!=&amp;quot;,&amp;quot;)){ <br />return false; <br />} <br />} <br />return true; <br />} <br />/* <br />电话判断函数，允许“数字”、“;”、“-”、“(”、”)“， <br />true表示是电话号码 <br />*/ <br />function isTelephone(str){ <br />var trueChar = &amp;quot;()-;1234567890&amp;quot;; <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />for(var i=0;i var c = str.charAt(i);//字符串str中的字符 <br />if(trueChar.indexOf(c) == -1) return false; <br />} <br />return true; <br />} <br />/** <br />学制可以为1-7，也可以为3.5这种形式，不能超过7年或者低于1年 <br />*/ <br />function isXZ(str){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />var reg = /^[1-6](\.5)?$/; <br />var r = str.match(reg); <br />if(null!=r){ <br />return true; <br />}else{ <br />if(str==&amp;quot;7&amp;quot;){ <br />return true; <br />}else{ <br />return false; <br />} <br />} <br />}</p><p>/* <br />判断证书编号是否符合要求，证书编号包含中文、数字、大小写字母、(、)、- <br />是返回true，不是返回false <br />*/ <br />function isZSBH(str){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />for(var i=0;i var c = str.charAt(i); <br />alpha = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;; <br />alpha += &amp;quot;abcdefghijklmnopqrstuvwxyz&amp;quot;; <br />alpha += &amp;quot;()-&amp;quot;; <br />if(!isChinese(c)&amp;amp;&amp;amp;!isNumber(c)&amp;amp;&amp;amp;alpha.indexOf(c)==-1){ <br />return false; <br />} <br />} <br />return true; <br />}</p><p>/* <br />身份证判断函数，是返回true，不是返回false <br />15位数字，18位数字或者最后一位为X（大写） <br />*/ <br />function isSFZ(str){ <br />if(&amp;quot;&amp;quot;==str){ <br />return false; <br />} <br />if(str.length!=15&amp;amp;&amp;amp;str.length!=18){//身份证长度不正确 <br />return false; <br />} <br />if(str.length==15){ <br />if(!isNumber(str)){ <br />return false; <br />} <br />}else{ <br />str1 = str.substring(0,17); <br />str2 = str.substring(17,18); <br />alpha = &amp;quot;X0123456789&amp;quot;; <br />if(!isNumber(str1)||alpha.indexOf(str2)==-1){ <br />return false; <br />} <br />} <br />return true; <br />} <br />/* <br />得到今天的年,月,日 <br />调用方法：today = new getToday(); 则today.year为今天的年以此类推 <br />*/ <br />function getToday(){ <br />this.now = new Date(); <br />this.year = this.now.getFullYear(); <br />this.month = this.now.getMonth(); <br />this.day = this.now.getDate(); <br />}</p><p><br />js判断数字，字母，中文 <br />1.</p><p>var reg = /^(\w|[\u4E00-\u9FA5])*$/; <br />if(arr=username.match(reg)) <br />{ <br />ti=1; <br />return ture; <br />} <br />else <br />{ <br />alert(&amp;quot;用户名只允许为英文，数字和汉字的混合,\n请检查是否前后有空格或者其他符号&amp;quot;); <br />ti=0; <br />return false; <br />}</p><p>2.利用正则表达式限制网页表单里的文本框输入内容：</p><p>用正则表达式限制只能输入中文：onkeyup=&amp;quot;value=value.replace(/[^\u4E00-\u9FA5]/g,'')&amp;quot; onbeforepaste=&amp;quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))&amp;quot;</p><p>用正则表达式限制只能输入全角字符： onkeyup=&amp;quot;value=value.replace(/[^\uFF00-\uFFFF]/g,'')&amp;quot; onbeforepaste=&amp;quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))&amp;quot;</p><p>用正则表达式限制只能输入数字：onkeyup=&amp;quot;value=value.replace(/[^\d]/g,'') &amp;quot;onbeforepaste=&amp;quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))&amp;quot;</p><p>用正则表达式限制只能输入数字和英文：onkeyup=&amp;quot;value=value.replace(/[\W]/g,'') &amp;quot;onbeforepaste=&amp;quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))&amp;quot;</p><p><br />数字 <br />&amp;lt;script&amp;gt; <br />function check() <br />{ <br />if(!isNaN(document.all.form.str.value)) <br />{ <br />alert(&amp;quot;数字&amp;quot;); <br />} <br />&amp;lt;/script&amp;gt; <br />字母 <br />&amp;lt;script&amp;gt; <br />function check() <br />{ <br />var str = /[_a-zA-Z]/; <br />if(str.test(document.all.form.str.value)) <br />{ <br />alert(&amp;quot;字母&amp;quot;); <br />} <br />} <br />&amp;lt;/script&amp;gt; <br />&amp;lt;form name=&amp;quot;form&amp;quot; action=&amp;quot;&amp;quot; onsubmit=&amp;quot;return check();&amp;quot;&amp;gt; <br />&amp;lt;input type=text name=str&amp;gt; <br />&amp;lt;input type=submit&amp;gt; <br />&amp;lt;form&amp;gt;</p><p>--------------------------------------------------- <br />/** <br />* 一些常用的javascript函数(方法) <br />* <br />* 为便于使用，均书写成String对象的方法 <br />* 把他保存为.js文件，可方便的扩展字符串对象的功能 <br />* <br />* 方法名 功 能 <br />* ----------- -------------------------------- <br />* Trim 删除首位空格 <br />* Occurs 统计指定字符出现的次数 <br />* isDigit 检查是否由数字组成 <br />* isAlpha 检查是否由数字字母和下划线组成 <br />* isNumber 检查是否为数 <br />* lenb 返回字节数 <br />* isInChinese 检查是否包含汉字 <br />* isEmail 简单的email检查 <br />* isDate 简单的日期检查，成功返回日期对象 <br />* isInList 检查是否有列表中的字符字符 <br />* isInList 检查是否有列表中的字符字符 <br />*/</p><p>/*** 删除首尾空格 ***/ <br />String.prototype.Trim = function() { <br />return this.replace(/(^\s*)|(\s*$)/g, &amp;quot;&amp;quot;); <br />}</p><p>/*** 统计指定字符出现的次数 ***/ <br />String.prototype.Occurs = function(ch) { <br />// var re = eval(&amp;quot;/[^&amp;quot;+ch+&amp;quot;]/g&amp;quot;); <br />// return this.replace(re, &amp;quot;&amp;quot;).length; <br />return this.split(ch).length-1; <br />}</p><p>/*** 检查是否由数字组成 ***/ <br />String.prototype.isDigit = function() { <br />var s = this.Trim(); <br />return (s.replace(/\d/g, &amp;quot;&amp;quot;).length == 0); <br />}</p><p>/*** 检查是否由数字字母和下划线组成 ***/ <br />String.prototype.isAlpha = function() { <br />return (this.replace(/\w/g, &amp;quot;&amp;quot;).length == 0); <br />} <br />/*** 检查是否为数 ***/ <br />String.prototype.isNumber = function() { <br />var s = this.Trim(); <br />return (s.search(/^[+-]?[0-9.]*$/) &amp;gt;= 0); <br />}</p><p>/*** 返回字节数 ***/ <br />String.prototype.lenb = function() { <br />return this.replace(/[^\x00-\xff]/g,&amp;quot;**&amp;quot;).length; <br />}</p><p>/*** 检查是否包含汉字 ***/ <br />String.prototype.isInChinese = function() { <br />return (this.length != this.replace(/[^\x00-\xff]/g,&amp;quot;**&amp;quot;).length); <br />}</p><p>/*** 简单的email检查 ***/ <br />String.prototype.isEmail = function() { <br />　var strr; <br />var mail = this; <br />　var re = /(\w+@\w+\.\w+)(\.{0,1}\w*)(\.{0,1}\w*)/i; <br />　re.exec(mail); <br />　if(RegExp.$3!=&amp;quot;&amp;quot; &amp;amp;&amp;amp; RegExp.$3!=&amp;quot;.&amp;quot; &amp;amp;&amp;amp; RegExp.$2!=&amp;quot;.&amp;quot;) <br />strr = RegExp.$1+RegExp.$2+RegExp.$3; <br />　else <br />　　if(RegExp.$2!=&amp;quot;&amp;quot; &amp;amp;&amp;amp; RegExp.$2!=&amp;quot;.&amp;quot;) <br />strr = RegExp.$1+RegExp.$2; <br />　　else <br />　strr = RegExp.$1; <br />　return (strr==mail); <br />}</p><p>/*** 简单的日期检查，成功返回日期对象 ***/ <br />String.prototype.isDate = function() { <br />var p; <br />var re1 = /(\d{4})[年./-](\d{1,2})[月./-](\d{1,2})[日]?$/; <br />var re2 = /(\d{1,2})[月./-](\d{1,2})[日./-](\d{2})[年]?$/; <br />var re3 = /(\d{1,2})[月./-](\d{1,2})[日./-](\d{4})[年]?$/; <br />if(re1.test(this)) { <br />p = re1.exec(this); <br />return new Date(p[1],p[2],p[3]); <br />} <br />if(re2.test(this)) { <br />p = re2.exec(this); <br />return new Date(p[3],p[1],p[2]); <br />} <br />if(re3.test(this)) { <br />p = re3.exec(this); <br />return new Date(p[3],p[1],p[2]); <br />} <br />return false; <br />} <br />/*** 检查是否有列表中的字符字符 ***/ <br />String.prototype.isInList = function(list) { <br />var re = eval(&amp;quot;/[&amp;quot;+list+&amp;quot;]/&amp;quot;); <br />return re.test(this); <br />}</p>]]></description> 
<guid isPermaLink="false">6760277@http://linux.bokee.com/</guid> 
<dc:subject>Web开发</dc:subject> 
<dc:date>2008-07-14T21:47:22Z</dc:date> 
</item> 
<item> 
<title><![CDATA[关闭apache和mysql日志]]></title> 
<link>http://linux.bokee.com/6727903.html</link> 
<description><![CDATA[<p>关闭apache日志</p><p>CustomLog /dev/null common</p><p>#<br /># If you would like to have agent and referer logfiles, uncomment the<br /># following directives.<br />#<br />#CustomLog /usr/local/apache/logs/referer_log referer<br />#CustomLog /usr/local/apache/logs/agent_log agent</p><p>#<br /># If you prefer a single logfile with access, agent, and referer information<br /># (Combined Logfile Format) you can use the following directive.<br />#<br />#CustomLog /usr/local/apache/logs/access_log combined</p><p>关闭mysql日志</p><p>#log-bin=mysql-bin</p>]]></description> 
<guid isPermaLink="false">6727903@http://linux.bokee.com/</guid> 
<dc:subject>Web开发</dc:subject> 
<dc:date>2008-06-02T10:32:28Z</dc:date> 
</item> 
<item> 
<title><![CDATA[改变互联网的PHP程序]]></title> 
<link>http://linux.bokee.com/6725823.html</link> 
<description><![CDATA[<div style="TEXT-INDENT: 21pt">从数据库管理到在线购物，从博客到电子邮件，开放源代码的<span>PHP程序数不胜数。从1998年到现在，十年的热情与坚持、良好的软件架构、团队协作和创新理念，造就了一批优秀的PHP程序。下面让我们来看看互联网上有史以来最具影响力的PHP程序：</span></div><div style="TEXT-INDENT: 21pt">&amp;nbsp;</div><div><strong><font color="#ff0000" size="4">1998</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.phpmyadmin.net/" target="_blank"><span style="COLOR: blue">phpMyAdmin</span></a></span></div><div style="TEXT-INDENT: 21pt">phpMyAdmin是一个通过<span>WEB界面管理MySQL数据库的程序。它可以创建、删除数据库，创建、删除和编辑数据表，删除、编辑和新增字段，执行任何SQL语句，管理字段上的主键，管理用户权限，输出数据到多种数据格式，而且目前有50种各国语言版本。 本程序由phpMyAdmin团队开发。</span></div><div style="TEXT-INDENT: 21pt"><span></span></div><div><strong><font color="#ff0000" size="4">1999</font></strong></div><div></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://squirrelmail.org/" target="_blank"><span style="COLOR: blue">SquirrelMail</span></a></span></div><div style="TEXT-INDENT: 21pt">SquirrelMail是一个基于标准的<span>Webmail类库。它包含了PHP内置的IMAP和SMTP协议，及用于生成HTML4.0界面的代码，支持多种浏览器。SquirrelMail易于安装和配置，提供所有你想要从邮件客户端得到的功能，例如强大的MIME支持，地址簿和文件目录操作等。</span></div><div style="TEXT-INDENT: 21pt"><span></span></div><div><strong><font color="#ff0000" size="4">2000</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://ez.no/ezpublish" target="_blank"><span style="COLOR: blue">eZ Publish</span></a></span></div><div style="TEXT-INDENT: 21pt">eZ Publish是一个企业级的内容管理系统，而不仅是一个<span>WEB内容管理系统。它开放源代码，并且是eZ Publish系列产品的基石。作为一个CMS，eZ Publish最大的创新是所有模块都是可以定制和扩展的。你可以以eZ Publish为基础开发自己的专业站点。eZ Publish的标准功能有：非常方便创建和编辑内容、工作流系统、内容版本系统、多语言功能、团队协作功能、电子商务功能、新型的分类系统及基于角色的访问控制。eZ Publish成为互联网上领先的开源CMS系统，在商业应用，政府办公和教育机构中广受好评。</span></div><div align="left">&amp;nbsp;</div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.oscommerce.com/" target="_blank"><span style="COLOR: blue">osCommerce</span></a></span></div><div style="TEXT-INDENT: 21pt">osCommerce是一个开源的电子商务解决方案，由开源团队开发。它允许你免费地开设自己的网上商店。</div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.openx.org/" target="_blank"><span style="COLOR: blue">phpAdsNew </span></a></span></div><div style="TEXT-INDENT: 21pt">phpAdsNew是<span>OpenX的前身，更早这个程序称为phpAds，由Tobias Ratschiller在1998年创建。OpenX是一个非常流行的免费WEB发布系统。它主要用来管理你的广告。可以很方便地把第三方网络广告公司的banner集成到你的网站上。</span></div><div align="left">&amp;nbsp;</div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.phpbb.com/" target="_blank"><span style="COLOR: blue">phpBB</span></a></span></div><div style="TEXT-INDENT: 21pt">phpBB是一个高效的论坛程序，支持多种数据库。功能主要包括：发表，回复，站内消息，投票，用户名<span>/IP禁止，密码加密、用户排名、强大的隐私版块管理，模板和简单但强大的翻译系统。</span></div><div style="TEXT-INDENT: 21pt"><span></span></div><div><strong><font color="#ff0000" size="4">2001</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://gallery.menalto.com/" target="_blank"><span style="COLOR: blue">Gallery</span></a></span></div><div style="TEXT-INDENT: 21pt">Gallery是一个在线的相册管理程序，安装非常简单，提供了一个安装向导。<span>Gallery允许用户通过友好易用的界面来创建和管理相册。照片管理包括自动生成缩略图，图像放大缩小，旋转，排序，文字说明等。对于每个用户，相册可以设置读写和评论的权限，可以很好地保证隐私。</span></div><div style="TEXT-INDENT: 21pt">最新版本是<span>Gallery2，核心代码完全重写过――Haohappy注</span></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.drupal.org/" target="_blank"><span style="COLOR: blue">Drupal</span></a></span></div><div style="TEXT-INDENT: 21pt">Drupal是一个模块化的<span>CMS（内容管理系统），同时也有论坛，博客和社区功能。它的数据库后端可以使用MySQL，MySQLi和PostgreSQL。Drupal的功能包括论坛，模板支持，内容评价，版本管理，用户管理（及用户角色和用户组的权限系统），错误日志，内容同步，本地化支持等等。Drupal的代码很简洁干净，对于程序员来说是一个很好的系统，易于进行二次开发和扩展。可以算是一个WEB应用程序框架。</span></div><div style="TEXT-INDENT: 21pt">&amp;nbsp;</div><div style="TEXT-INDENT: 21pt">Drupal的代码质量不错――<span>Haohappy注</span></div><div style="TEXT-INDENT: 21pt"><span></span></div><div><strong><font color="#ff0000" size="4">2002</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.mediawiki.org/" target="_blank"><span style="COLOR: blue">MediaWiki</span></a></span></div><div style="TEXT-INDENT: 21pt">MediaWiki是一个在线的<span>Wiki程序，用于Wikimedia基金会的所有项目，包括最知名的世界百科。该程序最早用于免费的Wikipedia，而今天很多商业公司也用于内部知识管理及内容管理。例如Novell就使用了MediaWiki来运行不少高流量的站点。</span></div><div style="TEXT-INDENT: 21pt">全球最热门的网站之一维基百科所采用的后台程序，代码质量一般，但功能强大。――<span>Haohappy注</span></div><div style="TEXT-INDENT: 21pt"><span></span></div><div><strong><font color="#ff0000" size="4">2003</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://wordpress.org/" target="_blank"><span style="COLOR: blue">WordPress</span></a></span></div><div style="TEXT-INDENT: 21pt">WordPress是一个个性化的博客发布程序，符合<span>WEB标准，易用而强大。它来自于一个良好架构的个人发布系统，最终演化成了一个博客程序。WordPress也是一个灵活的CMS系统，可以用来运营各种类型的网站。除了基本的博客功能，它可以管理友情链接（blogroll），文件附件，XFN支持，独立静态页面支持，Atom和RSS支持（日志内容和评论），API支持（支持多种协议，包括Atom Publishing Protocol, Blogger, MetaWeblog, 和 Movable Type API），垃圾评论过滤，高级的URL生成，可定制的模板系统及高级的插件API体系。</span></div><div>&amp;nbsp;</div><div><strong><font color="#ff0000" size="4">2004</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.sugarcrm.com/" target="_blank"><span style="COLOR: blue">SugarCRM</span></a></span></div><div style="TEXT-INDENT: 21pt">SugarCRM是一个完整的<span>CRM系统，可以为各种规模的企业提供服务。其核心的CRM功能包括销售，市场，商业示例，项目管理，日历等等。由PHP语言开发，支持MySQL和SQL数据库。</span></div><div style="TEXT-INDENT: 21pt">&amp;nbsp;</div><div><strong><font color="#ff0000" size="4">2005</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.joomla.org/" target="_blank"><span style="COLOR: blue">Joomla!</span></a></span></div><div style="TEXT-INDENT: 21pt">Joomla!是一个屡获大奖的<span>CMS，它把前端内容访问和后端的管理后台分开来。基于用户组的访问控制提供了多级的权限管理。Joomla!框架允许你创建自己的扩展模块，语言、模板和插件。</span></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.symfony-project.org/" target="_blank"><span style="COLOR: blue">Symfony</span></a></span></div><div style="TEXT-INDENT: 21pt">Symfony是一个全功能的<span>PHP开发框架，开发语言为PHP5.它向程序员提供了良好的架构，常用的功能组件及工具，可用于快速创建复杂的WEB程序。选择Symfony可以让你更快地发布你的产品，并且很容易运营和扩展。Symfony的团队很有经验，不重复发明轮子：它使用了很多WEB开发中的“最佳实践”并集成了一些优秀的第三方类库。</span></div><div style="TEXT-INDENT: 21pt"><span></span></div><div><strong><font color="#ff0000" size="4">2006</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://framework.zend.com/" target="_blank"><span style="COLOR: blue">Zend Framework</span></a></span></div><div style="TEXT-INDENT: 21pt">Zend Framework的优点在于简洁、面向对象最佳实践、友好的版权协议和严格测试的代码库。另外，<span>ZF致力于创建更加安全，可靠和现代的WEB2.0项目及Web服务，并提供了很多用于访问API的类库，你可以很方便地访问Google、 Amazon、 Yahoo!、Flickr,还有StrikeIron和ProgrammableWeb等网站提供的服务。</span></div><div style="TEXT-INDENT: 21pt">&amp;nbsp;</div><div><strong><font color="#ff0000" size="4">2007</font></strong></div><div></div><div align="left"><span style="FONT-SIZE: 12pt"><a href="http://www.magentocommerce.com/" target="_blank"><span style="COLOR: blue">Magento eCommerce</span></a></span></div><div style="TEXT-INDENT: 21pt">Magento是一个专业的电子商务程序，有极强的灵活性和可定制性。它的思想是每一个电子商务的实现都应该是独一无二，与众不同的。<span>Magento的模块化结构使商家可以有效控制电子商务的工作流程。</span></div><div style="TEXT-INDENT: 21pt">&amp;nbsp;</div><div style="TEXT-INDENT: 21pt">以上程序主要是在欧美比较流行，欢迎大家补充。也欢迎大家来总结一下在中国比较重要和流行的PHP程序。</div>]]></description> 
<guid isPermaLink="false">6725823@http://linux.bokee.com/</guid> 
<dc:subject>新闻</dc:subject> 
<dc:date>2008-05-30T13:07:34Z</dc:date> 
</item> 
<item> 
<title><![CDATA[windows下非安装版的mysql和php的使用]]></title> 
<link>http://linux.bokee.com/6720873.html</link> 
<description><![CDATA[<p><font size="3">mysql5 for windows noinstall </font></p><p>下载MySQL5.0的免安装版本mysql-noinstall-5.0.24-win32.zip。 <br />将其解压缩至D:\MySQL5.0-noinstall目录。 <br />编辑配置文件my.ini。拷贝 my-large.ini 到 my.ini，这里是D:\MySQL5.0-noinstall\my.ini。 <br />[mysqld]<br />port=3306<br />basedir=&amp;quot;D:/MySQL5.0-noinstall/&amp;quot;<br />datadir=&amp;quot;D:/MySQL5.0-noinstall/data/&amp;quot;<br />default-character-set=utf8<br />default-storage-engine=innodb<br />max_allowed_packet =12M</p><p><br />　　这里的路径使用正斜线，而非反斜线；如果使用反斜线，必须成对使用。如果3306端口被系统已有MySQL安装所占用，这里须更改端口号</p><p>　　打开Windows命令行窗口，执行如下命令：</p><p><font size="2">c:\mysql5\bin\mysqld-nt.exe --install MySQL-noinstall </font>（安装服务）<br />C:\&amp;gt;net start MySQL-noinstall （启动）<br />C:\&amp;gt;net stop MySQL-noinstall （停止）<br />C:\&amp;gt;mysqld-nt --remove MySQL-noinstall （卸载服务） <br /></p><p>修改mysql密码的方法</p><p>use mysql <br />update user set Password=password('newpassword') where User='root'; <br />flush privileges; </p><p>1.通过修改MYSQL数据库中MYSQL库的USER表<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 就用普通的UPDATE、INSERT语句就可以</p><p>2.在命令行中使用如下命令<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MYSQLADMIN -u root -p PASSWORD mypasswd </p><p /><p>PHP</p><p>解压后，把 ext/php_mysql.dll，libmysql.dll，php.ini拷到windows/system32下边即可</p>]]></description> 
<guid isPermaLink="false">6720873@http://linux.bokee.com/</guid> 
<dc:subject>Web开发</dc:subject> 
<dc:date>2008-05-24T12:28:25Z</dc:date> 
</item> 
<item> 
<title><![CDATA[php支持的数据库]]></title> 
<link>http://linux.bokee.com/6711505.html</link> 
<description><![CDATA[<p>php支持的数据库，真多啊！<br /></p><p><table><tbody><tr><td>AdabasD</td><td>InterBase</td><td>PostgreSQL</td></tr><tr><td>dBase</td><td>FrontBase</td><td>SQLite</td></tr><tr><td>Empress</td><td>mSQL</td><td>Solid</td></tr><tr><td>FilePro（只读）</td><td>Direct MS-SQL</td><td>Sybase</td></tr><tr><td>Hyperwave</td><td>MySQL</td><td>Velocis</td></tr><tr><td>IBM DB2</td><td>ODBC</td><td>Unix dbm</td></tr><tr><td>Informix</td><td>Oracle（OCI7 和 OCI8）</td><td></td></tr><tr><td>Ingres</td><td>Ovrimos</td></tr></tbody></table></p>]]></description> 
<guid isPermaLink="false">6711505@http://linux.bokee.com/</guid> 
<dc:subject>新闻</dc:subject> 
<dc:date>2008-05-14T17:35:58Z</dc:date> 
</item> 
<item> 
<title><![CDATA[PHP取得星期数]]></title> 
<link>http://linux.bokee.com/6656164.html</link> 
<description><![CDATA[&amp;lt;?&amp;nbsp;&amp;nbsp; <br />&amp;nbsp; setlocale(LC_TIME,&amp;quot;&amp;quot;);&amp;nbsp;&amp;nbsp; <br />&amp;nbsp; echo&amp;nbsp;&amp;nbsp; strftime(&amp;quot;&amp;nbsp;&amp;nbsp; %A&amp;quot;);&amp;nbsp;&amp;nbsp;&amp;nbsp;//获取当天的<br />&amp;nbsp; echo date(&amp;quot;w&amp;quot;);//获取当天的<br />&amp;nbsp; echo date(&amp;quot;w&amp;quot;, strtotime(&amp;quot;2008-03-11&amp;quot;));//获取某天的<br />?&amp;gt;&amp;nbsp;&amp;nbsp; <br />]]></description> 
<guid isPermaLink="false">6656164@http://linux.bokee.com/</guid> 
<dc:subject>Web开发</dc:subject> 
<dc:date>2008-03-11T13:15:25Z</dc:date> 
</item> 
<item> 
<title><![CDATA[举例理解数据库设计中的第三范式]]></title> 
<link>http://linux.bokee.com/6583835.html</link> 
<description><![CDATA[<a href="http://www.itisedu.com/phrase/200604241402075.html" target="_new">第三范式</a>（<a href="http://www.itisedu.com/phrase/200604172019525.html" target="_new">3NF</a>）是要求一个<a href="http://www.itisedu.com/phrase/200602271218062.html" target="_new">数据库</a>表中不包含已在其它表中已包含的非主关键字信息。例如，存在一个部门信息表，其中每个部门有部门编号（dept_id）、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表，则根据第三<a href="http://www.itisedu.com/phrase/200604241409355.html" target="_new">范式</a>（3NF）也应该构建它，否则就会有大量的数据冗余。简而言之，第三范式就是属性不依赖于其它非主属性。 满足第三范式（3NF）必须先满足<a href="http://www.itisedu.com/phrase/200604241401205.html" target="_new">第二范式</a>（<a href="http://www.itisedu.com/phrase/200604171811355.html" target="_new">2NF</a>）。<p>&amp;nbsp;</p><p><font face="Verdana">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <a href="http://www.itisedu.com/phrase/200604171749365.html" target="_new">设计范式</a>是符合某一种级别的关系<a href="http://www.itisedu.com/phrase/200603061709535.html" target="_new">模式</a>的集合。构造数据库必须遵循一定的规则。在关系数据库中，这种规则就是范式。关系数据库中的关系必须满足一定的要求，即满足不同的范式。目前关系数据库有六种范式：<a href="http://www.itisedu.com/phrase/200604241400035.html" target="_new">第一范式</a>（<a href="http://www.itisedu.com/phrase/200604171759045.html" target="_new">1NF</a>）、第二范式（2NF）、第三范式（3NF）、第四范式（4NF）、第五范式（5NF）和第六范式（6NF）。满足最低要求的范式是第一范式（1NF）。在第一范式的基础上进一步满足更多要求的称为第二范式（2NF），其余范式以次<a href="http://www.itisedu.com/phrase/200603090857555.html" target="_new">类</a>推。一般说来，数据库只需满足第三范式（3NF）就行了。下面我们举例介绍第一范式（1NF）、第二范式（2NF）和第三范式（3NF）。</font></p><p><font face="Verdana">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在创建一个数据库的过程中，范化是将其转化为一些表的过程，这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据，从而导致创建多余的表。范化是在识别数据库中的数据元素、关系，以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。</font></p><p><font face="Verdana">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面是范化的一个例子Customer Item purchased  Purchase price Thomas Shirt $40 Maria Tennis shoes  $35 Evelyn  Shirt $40Pajaro Trousers $25 </font></p><p><font face="Verdana">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果上面这个表用于保存物品的价格，而你想要删除其中的一个顾客，这时你就必须同时删除一个价格。范化就是要解决这个问题，你可以将这个表化为两个表，一个用于存储每个顾客和他所买物品的信息，另一个用于存储每件产品和其价格的信息，这样对其中一个表做添加或删除操作就不会影响另一个表。<br /><br /><strong><u>关系数据库的几种设计范式介绍</u></strong></font></p><font face="Verdana"><p><br />1 第一范式（1NF）</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在任何一个关系数据库中，第一范式（1NF）是对关系模式的基本要求，不满足第一范式（1NF）的数据库就不是关系数据库。</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 所谓第一范式（1NF）是指数据库表的每一列都是不可分割的基本数据项，同一列中不能有多个值，即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性，就可能需要定义一个新的实体，新的实体由重复的属性构成，新实体与原实体之间为一对多关系。在第一范式（1NF）中表的每一行只包含一个实例的信息。例如，对于图3-2 中的员工信息表，不能将员工信息都放在一列中显示，也不能将其中的两列或多列在一列中显示；员工信息表的每一行只表示一个员工的信息，一个员工的信息在表中只出现一次。简而言之，第一范式就是无重复的列。</p><p>2 第二范式（2NF）</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第二范式（2NF）是在第一范式（1NF）的基础上建立起来的，即满足第二范式（2NF）必须先满足第一范式（1NF）。第二范式（2NF）要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列，以存储各个实例的惟一标识。如图3-2 员工信息表中加上了员工编号（emp_id）列，因为每个员工的员工编号是惟一的，因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第二范式（2NF）要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性，如果存在，那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体，新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列，以存储各个实例的惟一标识。简而言之，第二范式就是非主属性非部分依赖于主关键字。</p><p>3 第三范式（3NF）</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 满足第三范式（3NF）必须先满足第二范式（2NF）。简而言之，第三范式（3NF）要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如，存在一个部门信息表，其中每个部门有部门编号（dept_id）、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表，则根据第三范式（3NF）也应该构建它，否则就会有大量的数据冗余。简而言之，第三范式就是属性不依赖于其它非主属性。 </p><p><font face="Verdana"><strong><u><a href="http://www.itisedu.com/phrase/200603011123415.html" target="_new">数据库设计</a>三大范式应用实例剖析</u></strong> </font></p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; <a href="http://www.itisedu.com/phrase/200604241410255.html" target="_new">数据库的设计范式</a>是数据库设计所需要满足的规范，满足这些规范的数据库是简洁的、结构明晰的，同时，不会发生插入（insert）、删除（delete）和更新（update）操作异常。反之则是乱七八糟，不仅给数据库的编程人员制造麻烦，而且面目可憎，可能存储了大量不需要的冗余信息。 <br /><br />　　 设计范式是不是很难懂呢？非也，大学教材上给我们一堆数学公式我们当然看不懂，也记不住。所以我们很多人就根本不按照范式来设计数据库。 <br /><br />　　 实质上，设计范式用很形象、很简洁的话语就能说清楚，道明白。本文将对范式进行通俗地说明，并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。 <br /><br /><strong>　　 范式说明 </strong><br /><br />　　 第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本<a href="http://www.itisedu.com/phrase/200603051002565.html" target="_new">类型</a>构成，包括整型、实数、字符型、逻辑型、日期型等。 <br /><br />　　 例如，如下的数据库表是符合第一范式的： <br /><br /><table height="43" cellspacing="0" cellpadding="2" align="center" border="1"><tbody><tr><td height="18">字段1 </td><td>字段2 </td><td>字段3 </td><td>字段4 </td></tr><tr><td height="23">　　 </td><td>　　 </td><td>　　 </td><td>　　 </td></tr></tbody></table><br />　　 而这样的数据库表是不符合第一范式的： <br /><br /><table height="25" cellspacing="0" cellpadding="2" align="center" border="1"><tbody><tr><td>字段1 </td><td>字段2 </td><td colspan="2">字段3 </td><td>字段4 </td></tr><tr><td>　　 </td><td>　　 </td><td>字段3.1 </td><td>字段3.2 </td><td>　　 </td></tr></tbody></table></p><p class="main"><br />　　 很显然，在当前的任何关系<a href="http://www.itisedu.com/phrase/200603011033425.html" target="_new">数据库管理系统</a>（<a href="http://www.itisedu.com/phrase/200604221337185.html" target="_new">DBMS</a>）中，傻瓜也不可能做出不符合第一范式的数据库，因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此，你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。 <br /><br />　　 第二范式（2NF）：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。 <br /><br />　　 假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分)，关键字为组合关键字(学号, 课程名称)，因为存在如下决定关系： <br /><br />　　 (学号, 课程名称) → (姓名, 年龄, 成绩, 学分) <br /><br />　　 这个数据库表不满足第二范式，因为存在如下决定关系： <br /><br />　　 (课程名称) → (学分) <br /><br />　　 (学号) → (姓名, 年龄) <br /><br />　　 即存在组合关键字中的字段决定非关键字的情况。 <br /><br />　　 由于不符合2NF，这个选课关系表会存在如下问题： <br /><br />　　 (1) 数据冗余： <br /><br />　　 同一门课程由n个学生选修，&amp;quot;学分&amp;quot;就重复n-1次；同一个学生选修了m门课程，姓名和年龄就重复了m-1次。 <br /><br />　　 (2) 更新异常： <br /><br />　　 若调整了某门课程的学分，数据表中所有行的&amp;quot;学分&amp;quot;值都要更新，否则会出现同一门课程学分不同的情况。 <br /><br />　　 (3) 插入异常： <br /><br />　　 假设要开设一门新的课程，暂时还没有人选修。这样，由于还没有&amp;quot;学号&amp;quot;关键字，课程名称和学分也无法记录入数据库。 <br /><br />　　 (4) 删除异常： <br /><br />　　 假设一批学生已经完成课程的选修，这些选修记录就应该从数据库表中删除。但是，与此同时，课程名称和学分信息也被删除了。很显然，这也会导致插入异常。 <br /><br />　　 把选课关系表SelectCourse改为如下三个表： <br /><br />　　 学生：Student(学号, 姓名, 年龄)； <br /><br />　　 课程：Course(课程名称, 学分)； <br /><br />　　 选课关系：SelectCourse(学号, 课程名称, 成绩)。 <br /><br />　　 这样的数据库表是符合第二范式的， 消除了数据冗余、更新异常、插入异常和删除异常。 <br /><br />　　 另外，所有单关键字的数据库表都符合第二范式，因为不可能存在组合关键字。 <br /><br />　　 第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在&amp;quot;A → B → C&amp;quot;的决定关系，则C传递函数依赖于A。因此，满足第三范式的数据库表应该不存在如下依赖关系： <br /><br />　　 关键字段 → 非关键字段x → 非关键字段y <br /><br />　　 假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)，关键字为单一关键字&amp;quot;学号&amp;quot;，因为存在如下决定关系： <br /><br />　　 (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话) <br /><br />　　 这个数据库是符合2NF的，但是不符合3NF，因为存在如下决定关系： <br /><br />　　 (学号) → (所在学院) → (学院地点, 学院电话) <br /><br />　　 即存在非关键字段&amp;quot;学院地点&amp;quot;、&amp;quot;学院电话&amp;quot;对关键字段&amp;quot;学号&amp;quot;的传递函数依赖。 <br /><br />　　 它也会存在数据冗余、更新异常、插入异常和删除异常的情况，读者可自行分析得知。 <br /><br />　　 把学生关系表分为如下两个表： <br /><br />　　 学生：(学号, 姓名, 年龄, 所在学院)； <br /><br />　　 学院：(学院, 地点, 电话)。 <br /><br />　　 这样的数据库表是符合第三范式的，消除了数据冗余、更新异常、插入异常和删除异常。 <br /><br />　　 鲍依斯-科得范式（BCNF）：在第三范式的基础上，数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。 <br /><br />　　 假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)，且有一个管理员只在一个仓库工作；一个仓库可以存储多种物品。这个数据库表中存在如下决定关系： <br /><br />　　 (仓库ID, 存储物品ID) →(管理员ID, 数量) <br /><br />　　 (管理员ID, 存储物品ID) → (仓库ID, 数量) <br /><br />　　 所以，(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字，表中的唯一非关键字段为数量，它是符合第三范式的。但是，由于存在如下决定关系： <br /><br />　　 (仓库ID) → (管理员ID) <br /><br />　　 (管理员ID) → (仓库ID) <br /><br />　　 即存在关键字段决定关键字段的情况，所以其不符合BCNF范式。它会出现如下异常情况： <br /><br />　　 (1) 删除异常： <br /><br />　　 当仓库被清空后，所有&amp;quot;存储物品ID&amp;quot;和&amp;quot;数量&amp;quot;信息被删除的同时，&amp;quot;仓库ID&amp;quot;和&amp;quot;管理员ID&amp;quot;信息也被删除了。 <br /><br />　　 (2) 插入异常： <br /><br />　　 当仓库没有存储任何物品时，无法给仓库分配管理员。 <br /><br />　　 (3) 更新异常： <br /><br />　　 如果仓库换了管理员，则表中所有行的管理员ID都要修改。 <br /><br />　　 把仓库管理关系表分解为二个关系表： <br /><br />　　 仓库管理：StorehouseManage(仓库ID, 管理员ID)； <br /><br />　　 仓库：Storehouse(仓库ID, 存储物品ID, 数量)。 <br /><br />　　 这样的数据库表是符合BCNF范式的，消除了删除异常、插入异常和更新异常。 </p><p><strong>　　 范式应用 </strong><br /><br />　　 我们来逐步搞定一个论坛的数据库，有如下信息： <br /><br />　　 （1） 用户：用户名，email，主页，电话，联系地址 <br /><br />　　 （2） 帖子：发帖标题，发帖内容，回复标题，回复内容 <br /><br />　　 第一次我们将数据库设计为仅仅存在表： <br /></p><p><table height="25" cellspacing="0" cellpadding="2" align="center" border="1"><tbody><tr><td>用户名 </td><td>email </td><td>主页 </td><td>电话 </td><td>联系地址 </td><td>发帖标题 </td><td>发帖内容 </td><td>回复标题 </td><td>回复内容 </td></tr></tbody></table><br />　　 这个数据库表符合第一范式，但是没有任何一组候选关键字能决定数据库表的整行，唯一的关键字段用户名也不能完全决定整个元组。我们需要增加&amp;quot;发帖ID&amp;quot;、&amp;quot;回复ID&amp;quot;字段，即将表修改为： <br /><br /><table height="25" cellspacing="0" cellpadding="2" align="center" border="1"><tbody><tr><td>用户名 </td><td>email </td><td>主页 </td><td>电话 </td><td>联系地址 </td><td>发帖ID </td><td>发帖标题 </td><td>发帖内容 </td><td>回复ID </td><td>回复标题 </td><td>回复内容 </td></tr></tbody></table><br />　　 这样数据表中的关键字(用户名，发帖ID，回复ID)能决定整行： <br /><br />　　 (用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容) <br /><br />　　 但是，这样的设计不符合第二范式，因为存在如下决定关系： <br /><br />　　 (用户名) → (email,主页,电话,联系地址) <br /><br />　　 (发帖ID) → (发帖标题,发帖内容) <br /><br />　　 (回复ID) → (回复标题,回复内容) <br /><br />　　 即非关键字段部分函数依赖于候选关键字段，很明显，这个设计会导致大量的数据冗余和操作异常。 <br /><br />　　 我们将数据库表分解为（带下划线的为关键字）： <br /><br />　　 （1） 用户信息：用户名，email，主页，电话，联系地址 <br /><br />　　 （2） 帖子信息：发帖ID，标题，内容 <br /><br />　　 （3） 回复信息：回复ID，标题，内容 <br /><br />　　 （4） 发贴：用户名，发帖ID <br /><br />　　 （5） 回复：发帖ID，回复ID <br /><br />　　 这样的设计是满足第1、2、3范式和BCNF范式要求的，但是这样的设计是不是最好的呢？ <br /><br />　　 不一定。 <br /><br />　　 观察可知，第4项&amp;quot;发帖&amp;quot;中的&amp;quot;用户名&amp;quot;和&amp;quot;发帖ID&amp;quot;之间是1：N的关系，因此我们可以把&amp;quot;发帖&amp;quot;合并到第2项的&amp;quot;帖子信息&amp;quot;中；第5项&amp;quot;回复&amp;quot;中的&amp;quot;发帖ID&amp;quot;和&amp;quot;回复ID&amp;quot;之间也是1：N的关系，因此我们可以把&amp;quot;回复&amp;quot;合并到第3项的&amp;quot;回复信息&amp;quot;中。这样可以一定量地减少数据冗余，新的设计为： <br /><br />　　 （1） 用户信息：用户名，email，主页，电话，联系地址 <br /><br />　　 （2） 帖子信息：用户名，发帖ID，标题，内容 <br /><br />　　 （3） 回复信息：发帖ID，回复ID，标题，内容 <br /><br />　　 数据库表1显然满足所有范式的要求； <br /><br />　　 数据库表2中存在非关键字段&amp;quot;标题&amp;quot;、&amp;quot;内容&amp;quot;对关键字段&amp;quot;发帖ID&amp;quot;的部分函数依赖，即不满足第二范式的要求，但是这一设计并不会导致数据冗余和操作异常； <br /><br />　　 数据库表3中也存在非关键字段&amp;quot;标题&amp;quot;、&amp;quot;内容&amp;quot;对关键字段&amp;quot;回复ID&amp;quot;的部分函数依赖，也不满足第二范式的要求，但是与数据库表2相似，这一设计也不会导致数据冗余和操作异常。 <br /><br />　　 由此可以看出，并不一定要强行满足范式的要求，对于1：N关系，当1的一边合并到N的那边后，N的那边就不再满足第二范式了，但是这种设计反而比较好！ <br /><br />　　 对于M：N的关系，不能将M一边或N一边合并到另一边去，这样会导致不符合范式要求，同时导致操作异常和数据冗余。 <br />对于1：1的关系，我们可以将左边的1或者右边的1合并到另一边去，设计导致不符合范式要求，但是并不会导致操作异常和数据冗余。 <br /><br /><strong>　　 结论 </strong><br /><br />　　 满足范式要求的数据库设计是结构清晰的，同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的，在数据库表中存在1：1或1：N关系这种较特殊的情况下，合并导致的不符合范式要求反而是合理的。 <br /><br />　　 在我们设计数据库的时候，一定要时刻考虑范式的要求。</p></font>]]></description> 
<guid isPermaLink="false">6583835@http://linux.bokee.com/</guid> 
<dc:subject>Web开发</dc:subject> 
<dc:date>2007-12-28T23:53:16Z</dc:date> 
</item> 

</channel> 
</rss> 