<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>开心编程网 &#187; 数据库</title>
	<atom:link href="http://www.kaixinbc.com/category/%e6%95%b0%e6%8d%ae%e5%ba%93/feed" rel="self" type="application/rss+xml" />
	<link>http://www.kaixinbc.com</link>
	<description>是一个专注于java、.net、asp、jsp、php、C语言、C++语言、Delphi、go语言、MySQL、sql server、linux、oracle、及Web 2.0等的原创IT编程网站，为国内众多的编程爱好者提供一个“平等自由协作创造”的开放式交流环境，提供编程专题文章、编程论坛、资源下载、博客和开源项目等栏目,作者方志凯（fangzhikai）。</description>
	<lastBuildDate>Thu, 15 Jul 2010 01:32:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>阿里巴巴集团旗下淘宝网技术研发部招聘LINUX工程师</title>
		<link>http://www.kaixinbc.com/2010/03/alibaba-taobao-linux.html</link>
		<comments>http://www.kaixinbc.com/2010/03/alibaba-taobao-linux.html#comments</comments>
		<pubDate>Tue, 16 Mar 2010 05:36:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=482</guid>
		<description><![CDATA[岗位要求：
1、具有良好的职业素养，工作认真、负责，良好的团队合作意识；
2、能够吃苦耐劳，接受7×24的轮班制度；
3、有较强的学习能力；
3、熟悉unix、linux操作系统的使用；
4、了解Apache,Jboss等web应用服务器的基本维护
5、大专及以上学历；有1-2年的Linux/Unix系统运维经验;学习能力和责任心强的应届毕业生亦可考虑；
6、有个人博客或者Linux、Unix社区工作经历者，请在简历中说明（博客请提供博客地址）；
工作地点：杭州  待遇面议！
有意者请将简历发送至：hbhgfzk@gmail.com,欢迎转载！有效期至2010年10月1日
]]></description>
			<content:encoded><![CDATA[<p><strong>岗位要求：</strong></p>
<p>1、具有良好的职业素养，工作认真、负责，良好的团队合作意识；<br />
2、能够吃苦耐劳，接受7×24的轮班制度；<br />
3、有较强的学习能力；<br />
3、熟悉unix、linux操作系统的使用；<br />
4、了解Apache,Jboss等web应用服务器的基本维护<br />
5、大专及以上学历；有1-2年的Linux/Unix系统运维经验;学习能力和责任心强的应届毕业生亦可考虑；<br />
6、有个人博客或者Linux、Unix社区工作经历者，请在简历中说明（博客请提供博客地址）；</p>
<p><strong>工作地点：</strong>杭州  <strong>待遇面议！</strong></p>
<p>有意者请将简历发送至：hbhgfzk@gmail.com,欢迎转载！<strong>有效期至2010年10月1日</strong></p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Falibaba-taobao-linux.html&title=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E9%9B%86%E5%9B%A2%E6%97%97%E4%B8%8B%E6%B7%98%E5%AE%9D%E7%BD%91%E6%8A%80%E6%9C%AF%E7%A0%94%E5%8F%91%E9%83%A8%E6%8B%9B%E8%81%98LINUX%E5%B7%A5%E7%A8%8B%E5%B8%88" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/alibaba-taobao-linux.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle表空间操作详解-Oracle入门基础</title>
		<link>http://www.kaixinbc.com/2010/03/oracle-rumen.html</link>
		<comments>http://www.kaixinbc.com/2010/03/oracle-rumen.html#comments</comments>
		<pubDate>Sat, 13 Mar 2010 03:47:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=480</guid>
		<description><![CDATA[建立表空间
CREATE TABLESPACE data01
DATAFILE  &#8216;/oracle/oradata/db/DATA01.dbf&#8217; SIZE 500M
UNIFORM SIZE 128k;  #指定区尺寸为128k,如不指定，区尺寸默认为64k
删除表空间
DROP TABLESPACE data01  INCLUDING CONTENTS AND DATAFILES;
修改表空间大小
alter database  datafile &#8216;/path/NADDate05.dbf&#8217; resize 100M
移动表至另一表空间
alter  table move tablespace room1;
一、建立表空间
CREATE TABLESPACE data01
DATAFILE  &#8216;/oracle/oradata/db/DATA01.dbf&#8217; SIZE 500M
UNIFORM SIZE 128k;  #指定区尺寸为128k,如不指定，区尺寸默认为64k
二、建立UNDO表空间
CREATE UNDO TABLESPACE  UNDOTBS02
DATAFILE &#8216;/oracle/oradata/db/UNDOTBS02.dbf&#8217; SIZE 50M
# 注意：在OPEN状态下某些时刻只能用一个UNDO表空间，如果要用新建的表空间，必须切换到该表空间:
ALTER SYSTEM  SET undo_tablespace=UNDOTBS02;
三、建立临时表空间
CREATE TEMPORARY  TABLESPACE temp_data
TEMPFILE [...]]]></description>
			<content:encoded><![CDATA[<p>建立表空间<br />
CREATE TABLESPACE data01<br />
DATAFILE  &#8216;/oracle/oradata/db/DATA01.dbf&#8217; SIZE 500M<br />
UNIFORM SIZE 128k;  #指定区尺寸为128k,如不指定，区尺寸默认为64k</p>
<p>删除表空间<br />
DROP TABLESPACE data01  INCLUDING CONTENTS AND DATAFILES;</p>
<p>修改表空间大小<br />
alter database  datafile &#8216;/path/NADDate05.dbf&#8217; resize 100M</p>
<p>移动表至另一表空间<br />
alter  table move tablespace room1;</p>
<p>一、建立表空间<br />
CREATE TABLESPACE data01<br />
DATAFILE  &#8216;/oracle/oradata/db/DATA01.dbf&#8217; SIZE 500M<br />
UNIFORM SIZE 128k;  #指定区尺寸为128k,如不指定，区尺寸默认为64k</p>
<p>二、建立UNDO表空间<br />
CREATE UNDO TABLESPACE  UNDOTBS02<br />
DATAFILE &#8216;/oracle/oradata/db/UNDOTBS02.dbf&#8217; SIZE 50M</p>
<p># 注意：在OPEN状态下某些时刻只能用一个UNDO表空间，如果要用新建的表空间，必须切换到该表空间:</p>
<p>ALTER SYSTEM  SET undo_tablespace=UNDOTBS02;</p>
<p>三、建立临时表空间<br />
CREATE TEMPORARY  TABLESPACE temp_data<br />
TEMPFILE &#8216;/oracle/oradata/db/TEMP_DATA.dbf&#8217; SIZE  50M</p>
<p>四、改变表空间状态</p>
<p>1.使表空间脱机<br />
ALTER TABLESPACE game OFFLINE;<br />
如 果是意外删除了数据文件，则必须带有RECOVER选项<br />
ALTER TABLESPACE game OFFLINE FOR RECOVER;</p>
<p>2.使表空间联机<br />
ALTER TABLESPACE game ONLINE;</p>
<p>3.使数据文件脱机<br />
ALTER  DATABASE DATAFILE 3 OFFLINE;</p>
<p>4.使数据文件联机<br />
ALTER DATABASE  DATAFILE 3 ONLINE;</p>
<p>5.使表空间只读<br />
ALTER TABLESPACE game READ ONLY;</p>
<p>6. 使表空间可读写<br />
ALTER TABLESPACE game READ WRITE;</p>
<p>五、删除表空间<br />
DROP  TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;</p>
<p>六、扩展表空间</p>
<p>首 先查看表空间的名字和所属文件<br />
select tablespace_name, file_id, file_name,<br />
round(bytes/(1024*1024),0)  total_space<br />
from dba_data_files<br />
order by tablespace_name;</p>
<p>1. 增加数据文件<br />
ALTER TABLESPACE game<br />
ADD DATAFILE  &#8216;/oracle/oradata/db/GAME02.dbf&#8217; SIZE 1000M;</p>
<p>2.手动增加数据文件尺寸<br />
ALTER  DATABASE DATAFILE &#8216;/oracle/oradata/db/GAME.dbf&#8217;<br />
RESIZE 4000M;</p>
<p>3. 设定数据文件自动扩展<br />
ALTER DATABASE DATAFILE &#8216;/oracle/oradata/db/GAME.dbf&#8217;<br />
AUTOEXTEND  ON NEXT 100M<br />
MAXSIZE 10000M;</p>
<p>4.设定后查看表空间信息<br />
SELECT  A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,<br />
(B.BYTES*100)/A.BYTES  &#8220;% USED&#8221;,(C.BYTES*100)/A.BYTES &#8220;% FREE&#8221;<br />
FROM SYS.SM$TS_AVAIL  A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C<br />
WHERE  A.TABLESPACE_NAME=B.TABLESPACE_NAME AND  A.TABLESPACE_NAME=C.TABLESPACE_NAME;</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Foracle-rumen.html&title=Oracle%E8%A1%A8%E7%A9%BA%E9%97%B4%E6%93%8D%E4%BD%9C%E8%AF%A6%E8%A7%A3-Oracle%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/oracle-rumen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP使用MYSQL数据库全攻略</title>
		<link>http://www.kaixinbc.com/2010/03/asp-mysql-gl.html</link>
		<comments>http://www.kaixinbc.com/2010/03/asp-mysql-gl.html#comments</comments>
		<pubDate>Wed, 10 Mar 2010 08:56:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=459</guid>
		<description><![CDATA[MYSQL数据库以它短小、方便、速度快、免费等优点成为很多网站目前首选数据库，但一般都是用PHP+MYSQL相结合来开发各种动态页面，其实ASP也可以使用MYSQL数据库开发动态页面，小弟我也是刚刚学会，不敢独享，所以特写了这篇文章供大伙参考。
我的环境是WINDOWS98+PWS4.0+mysql-3.23.32-win+PHP4
必要的软件：PWS4.0（呵呵，废话）
mysql-3.23.32-win（这个是最新版的）
myodbc-2.50.36-dll（这个是最重要的，MYSQL ODBC的驱动程序，可以到www.mysql.com下载）
第一步：安装MYSQL ODBD的驱动程序，将下载的myodbd-2.50.46-dll文件复制到windows\system目录下(windows2000
是winnt/system32)然后建立一新文件，扩展名为reg（就是注册表文件）,将以下内容复制到该文件中。
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\myodbc driver]
&#8220;UsageCount&#8221;=dword:00000002
&#8220;Driver&#8221;=&#8221;C:\\WINDOWS\\System\\myodbc.dll&#8221;
&#8220;Setup&#8221;=&#8221;C:\\WINDOWS\\System\\myodbc.dll&#8221;
&#8220;SQLLevel&#8221;=&#8221;1&#8243;
&#8220;FileUsage&#8221;=&#8221;0&#8243;
&#8220;DriverODBCVer&#8221;=&#8221;02.50&#8243;
&#8220;ConnectFunctions&#8221;=&#8221;YYY&#8221;
&#8220;APILevel&#8221;=&#8221;1&#8243;
&#8220;CpTimeout&#8221;=&#8221;120&#8243;
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]
&#8220;myodbc driver&#8221;=&#8221;installed&#8221;
保存后双击该文件，将上面代码注册到WINDOWS注册表中。
如果安装在windows2000中,则Driver和Setup主键的值要做相应改变，这里我想就不用多说了。
如果成功，在控制面板/ODBD数据源的驱动程序里将看到myodbd driver这一项！
第二步：建立ASP文件链接数据库。
这里有两种方法，一种是在ODBC数据源中建立一个系统DSN。后来我发现不建立也可以在ASP中使用MYSQL,方法在下文将讲道。
打开控制面板/ODBD数据源，选择系统DSN,然后添加一个新的DSN,驱动程序选择myodbd driver,会出现一个对话框供输入mysql    相关信息。
Windows DSN name: 所要建立DSN的名称
Mysql Host (name or ip):Mysql服务器的名称或者是IP地址，通常填localhost
Mysql database name:需要使用数据库的名称，数据库在Mysql管理程序中建立。这里我们使用一个例子。数据库名：hc188
里面有数据表：user 数据表有两个字段分别是：username和password,随便插入几个数据。
user:链接数据库的用户名，我填的是root超级用户
password:链接数据库用户密码，如果没有，可以不填
Port(if not 3306)：Mysql在服务器的端口，如果不填默认为3306
SQL command on connect:使用sql命令链接数据库，这项可以不填
填写完毕后选择OK保存。
下面链接数据库的ASP代码！
&#60;%
strConnection = &#8220;dsn=hc188;driver={myodbd driver};server=localhost;uid=root;pwd=;database=hc188&#8243;
Set adoDataConn = Server.CreateObject(&#8220;ADODB.Connection&#8221;)
adoDataConn.Open strConnection
strQuery = &#8220;SELECT * FROM user&#8221;
Set rs = adoDataConn.Execute(strQuery)
If Not rs.BOF Then
%&#62;
&#60;TABLE&#62;
&#60;TR&#62;
&#60;TD&#60;b&#62;username&#60;/b&#62;&#60;/TD&#62;
&#60;TD&#62;&#60;b&#62;password&#60;/b&#62;&#60;/TD&#62;
&#60;/TR&#62;
&#60;%
Do While Not rs.EOF
%&#62;
&#60;TR&#62;
&#60;TD&#62;&#60;%=rs(&#8220;username&#8221;)%&#62;&#60;/TD&#62;
&#60;TD&#62;&#60;%=rs(&#8220;password&#8221;)%&#62;&#60;/TD&#62;
&#60;/TR&#62;
&#60;%
rs.MoveNext
Loop
%&#62;
&#60;/TABLE&#62;
&#60;%
Else
Response.Write(&#8220;Sorry, no data found.&#8221;)
End If
rs.Close
adoDataConn.Close
Set adoDataConn = Nothing
Set rsEmailData = Nothing
%&#62;
第二种方法：我在使用中想过如果不建立系统DSN，是否也可以使用MYSQL数据库呢？结果是可以的。
方法很简单，把上面ASP代码第二行代码改为：
strconnection=&#8221;DefaultDir=;Driver={myodbc driver};database=hc188&#8243;
我奇怪的发现，这种方法连用户名和密码都不需要就可以使用。是不是MYSQL的一个BUG呢？
以上代码全部经测试通过！
]]></description>
			<content:encoded><![CDATA[<p>MYSQL数据库以它短小、方便、速度快、免费等优点成为很多网站目前首选数据库，但一般都是用PHP+MYSQL相结合来开发各种动态页面，其实ASP也可以使用MYSQL数据库开发动态页面，小弟我也是刚刚学会，不敢独享，所以特写了这篇文章供大伙参考。<br />
我的环境是WINDOWS98+PWS4.0+mysql-3.23.32-win+PHP4<br />
必要的软件：PWS4.0（呵呵，废话）<br />
mysql-3.23.32-win（这个是最新版的）<br />
myodbc-2.50.36-dll（这个是最重要的，MYSQL ODBC的驱动程序，可以到www.mysql.com下载）</p>
<p>第一步：安装MYSQL ODBD的驱动程序，将下载的myodbd-2.50.46-dll文件复制到windows\system目录下(windows2000<br />
是winnt/system32)然后建立一新文件，扩展名为reg（就是注册表文件）,将以下内容复制到该文件中。</p>
<p>REGEDIT4</p>
<p>[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\myodbc driver]<br />
&#8220;UsageCount&#8221;=dword:00000002<br />
&#8220;Driver&#8221;=&#8221;C:\\WINDOWS\\System\\myodbc.dll&#8221;<br />
&#8220;Setup&#8221;=&#8221;C:\\WINDOWS\\System\\myodbc.dll&#8221;<br />
&#8220;SQLLevel&#8221;=&#8221;1&#8243;<br />
&#8220;FileUsage&#8221;=&#8221;0&#8243;<br />
&#8220;DriverODBCVer&#8221;=&#8221;02.50&#8243;<br />
&#8220;ConnectFunctions&#8221;=&#8221;YYY&#8221;<br />
&#8220;APILevel&#8221;=&#8221;1&#8243;<br />
&#8220;CpTimeout&#8221;=&#8221;120&#8243;<br />
[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]<br />
&#8220;myodbc driver&#8221;=&#8221;installed&#8221;</p>
<p>保存后双击该文件，将上面代码注册到WINDOWS注册表中。<br />
如果安装在windows2000中,则Driver和Setup主键的值要做相应改变，这里我想就不用多说了。<br />
如果成功，在控制面板/ODBD数据源的驱动程序里将看到myodbd driver这一项！</p>
<p>第二步：建立ASP文件链接数据库。<br />
这里有两种方法，一种是在ODBC数据源中建立一个系统DSN。后来我发现不建立也可以在ASP中使用MYSQL,方法在下文将讲道。<br />
打开控制面板/ODBD数据源，选择系统DSN,然后添加一个新的DSN,驱动程序选择myodbd driver,会出现一个对话框供输入mysql    相关信息。<br />
Windows DSN name: 所要建立DSN的名称<br />
Mysql Host (name or ip):Mysql服务器的名称或者是IP地址，通常填localhost<br />
Mysql database name:需要使用数据库的名称，数据库在Mysql管理程序中建立。这里我们使用一个例子。数据库名：hc188<br />
里面有数据表：user 数据表有两个字段分别是：username和password,随便插入几个数据。<br />
user:链接数据库的用户名，我填的是root超级用户<br />
password:链接数据库用户密码，如果没有，可以不填<br />
Port(if not 3306)：Mysql在服务器的端口，如果不填默认为3306<br />
SQL command on connect:使用sql命令链接数据库，这项可以不填<br />
填写完毕后选择OK保存。</p>
<p>下面链接数据库的ASP代码！</p>
<p>&lt;%<br />
strConnection = &#8220;dsn=hc188;driver={myodbd driver};server=localhost;uid=root;pwd=;database=hc188&#8243;<br />
Set adoDataConn = Server.CreateObject(&#8220;ADODB.Connection&#8221;)<br />
adoDataConn.Open strConnection</p>
<p>strQuery = &#8220;SELECT * FROM user&#8221;<br />
Set rs = adoDataConn.Execute(strQuery)<br />
If Not rs.BOF Then<br />
%&gt;<br />
&lt;TABLE&gt;<br />
&lt;TR&gt;<br />
&lt;TD&lt;b&gt;username&lt;/b&gt;&lt;/TD&gt;<br />
&lt;TD&gt;&lt;b&gt;password&lt;/b&gt;&lt;/TD&gt;<br />
&lt;/TR&gt;<br />
&lt;%<br />
Do While Not rs.EOF<br />
%&gt;<br />
&lt;TR&gt;<br />
&lt;TD&gt;&lt;%=rs(&#8220;username&#8221;)%&gt;&lt;/TD&gt;<br />
&lt;TD&gt;&lt;%=rs(&#8220;password&#8221;)%&gt;&lt;/TD&gt;<br />
&lt;/TR&gt;<br />
&lt;%<br />
rs.MoveNext<br />
Loop<br />
%&gt;<br />
&lt;/TABLE&gt;<br />
&lt;%<br />
Else<br />
Response.Write(&#8220;Sorry, no data found.&#8221;)<br />
End If</p>
<p>rs.Close<br />
adoDataConn.Close<br />
Set adoDataConn = Nothing<br />
Set rsEmailData = Nothing<br />
%&gt;</p>
<p>第二种方法：我在使用中想过如果不建立系统DSN，是否也可以使用MYSQL数据库呢？结果是可以的。<br />
方法很简单，把上面ASP代码第二行代码改为：<br />
strconnection=&#8221;DefaultDir=;Driver={myodbc driver};database=hc188&#8243;</p>
<p>我奇怪的发现，这种方法连用户名和密码都不需要就可以使用。是不是MYSQL的一个BUG呢？</p>
<p>以上代码全部经测试通过！</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Fasp-mysql-gl.html&title=ASP%E4%BD%BF%E7%94%A8MYSQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%85%A8%E6%94%BB%E7%95%A5" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/asp-mysql-gl.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle如何改变listener的端口号 (Linux服务器)</title>
		<link>http://www.kaixinbc.com/2010/03/oracle-listener-linux.html</link>
		<comments>http://www.kaixinbc.com/2010/03/oracle-listener-linux.html#comments</comments>
		<pubDate>Thu, 04 Mar 2010 12:40:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=450</guid>
		<description><![CDATA[可以参照如下步骤改变listener的端口号：
1. 使用命令lsnrctl stop停止listener的执行
2. 用lsnrctl status命令确认listener已经停止以后，到$ORACLE_HOME/network/admin下找到listener.ora这个文件。




3. 用vi或其他编辑器打开这个文件，将里面listener的端口号修改成你想要的值，这里是由1522改成1521。
4. 保存修改好的文件
5. 启动sqlplus以SYSTEM账户登录数据库，sqlplus SYSTEM/yourpass@localhost
6. 在sqlplus里面执行如下命令：
 ALTER SYSTEM SET LOCAL_LISTENER = "(ADDRESS=(PROTOCOL=TCP)(HOST=oraclehost)(PORT=1521))";
 ALTER SYSTEM REGISTER;

7. 执行lsnrctl status验证listener状态。

如果listener状态正常，这端口号就修改成功了，也可以用netstat -an &#124; grep 15来判断一下
]]></description>
			<content:encoded><![CDATA[<p>可以参照如下步骤改变listener的端口号：</p>
<p>1. 使用命令lsnrctl stop停止listener的执行</p>
<p>2. 用lsnrctl status命令确认listener已经停止以后，到$ORACLE_HOME/network/admin下找到listener.ora这个文件。<br />
<script type="text/javascript"><!--
google_ad_client = "pub-6590413867458515";
/* adsense5 for kaixinbc wenzhang */
google_ad_slot = "9737719358";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
3. 用vi或其他编辑器打开这个文件，将里面listener的端口号修改成你想要的值，这里是由1522改成1521。</p>
<p>4. 保存修改好的文件</p>
<p>5. 启动sqlplus以SYSTEM账户登录数据库，sqlplus SYSTEM/yourpass@localhost</p>
<p>6. 在sqlplus里面执行如下命令：</p>
<pre> ALTER SYSTEM SET LOCAL_LISTENER = "(ADDRESS=(PROTOCOL=TCP)(HOST=oraclehost)(PORT=1521))";
 ALTER SYSTEM REGISTER;

7. 执行lsnrctl status验证listener状态。

如果listener状态正常，这端口号就修改成功了，也可以用netstat -an | grep 15来判断一下</pre>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Foracle-listener-linux.html&title=Oracle%E5%A6%82%E4%BD%95%E6%94%B9%E5%8F%98listener%E7%9A%84%E7%AB%AF%E5%8F%A3%E5%8F%B7+%28Linux%E6%9C%8D%E5%8A%A1%E5%99%A8%29+" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/oracle-listener-linux.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server 2008行数据和页数据压缩解密</title>
		<link>http://www.kaixinbc.com/2010/03/sql-server-2008-2.html</link>
		<comments>http://www.kaixinbc.com/2010/03/sql-server-2008-2.html#comments</comments>
		<pubDate>Thu, 04 Mar 2010 12:20:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=448</guid>
		<description><![CDATA[SQL Server的性能主要取决于磁盘I/O效率，提高I/O效率某种程序上就意味着提高性能。SQL Server 2008提供了数据压缩功能来提高磁盘I/O。
数据压缩意味着减小数据的有磁盘占用量，所以数据压缩可以用在表，聚集索引，非聚集索引，视图索引或是分区表，分区索引上。




数据压缩可以在两个级别上实现：行级别和页级别。页级别压缩包括行级别压缩。表和索引在创建的同时就可以压缩，也可以使用Alter Table Rebuild With 或是 Alter Index Rebuild With语法压缩已存在表或是索引。当堆(Heap)上的压缩状态改变时，所有的非聚集索引也会重建。
下面让我们看看压缩过程到底都做了些什么。
行压缩：
1.减少元数据头记录数据。
2.所有的数值类型(integer,decimal,float)或基于数值类型的类型都会被压缩(datetime,money)。比如，100被存在一个int型字段中，占4位，但是从0~255只需要1位，压缩后，就节省了3byte空间。
3.Char和NChar都被存放于可变长度的类型中。原因同上。比如，CSDN被存在Char(10)中，但是它只需要Char(4)空间，所以压缩后就释放了Char(6)个空间。
4.所有类型的NULL和0都不占字节了。
页压缩：
1.进行行压缩。
2.前标压缩：每一页中的所有列，在行标头下面，每行都存储着一个行定义值，压缩后，所有行的定义值都被替换成行头值的引用。
3.字典压缩：字典压缩和前标压缩类似。前标压缩中，一个与其他普通值不同的值被定义到每一列上。但是字典压缩中，每一页中所有列的普通值被存在下一行的行头前面。然后，这些值被替换成新行的引用值。
下面我们来看一个例子:
USE tempdb
GO
CREATE TABLE TestCompression (col1 INT, col2 CHAR(50))
GO
INSERT INTO TestCompression VALUES (10, &#8216;compression testing&#8217;)
GO 5000
&#8211; Original
EXEC sp_spaceused TestCompression
GO
&#8211; DATA_COMPRESSION = ROW
ALTER TABLE TestCompression
REBUILD WITH (DATA_COMPRESSION = ROW);
GO
EXEC sp_spaceused TestCompression
GO
&#8211; DATA_COMPRESSION = PAGE
ALTER TABLE TestCompression
REBUILD WITH (DATA_COMPRESSION = PAGE);
GO
EXEC sp_spaceused TestCompression
GO
&#8211; DATA_COMPRESSION = NONE
ALTER TABLE [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Server的性能主要取决于磁盘I/O效率，提高I/O效率某种程序上就意味着提高性能。SQL Server 2008提供了数据压缩功能来提高磁盘I/O。</p>
<p>数据压缩意味着减小数据的有磁盘占用量，所以数据压缩可以用在表，聚集索引，非聚集索引，视图索引或是分区表，分区索引上。<br />
<script type="text/javascript"><!--
google_ad_client = "pub-6590413867458515";
/* adsense5 for kaixinbc wenzhang */
google_ad_slot = "9737719358";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
数据压缩可以在两个级别上实现：行级别和页级别。页级别压缩包括行级别压缩。表和索引在创建的同时就可以压缩，也可以使用Alter Table Rebuild With 或是 Alter Index Rebuild With语法压缩已存在表或是索引。当堆(Heap)上的压缩状态改变时，所有的非聚集索引也会重建。</p>
<p>下面让我们看看压缩过程到底都做了些什么。</p>
<p>行压缩：</p>
<p>1.减少元数据头记录数据。<br />
2.所有的数值类型(integer,decimal,float)或基于数值类型的类型都会被压缩(datetime,money)。比如，100被存在一个int型字段中，占4位，但是从0~255只需要1位，压缩后，就节省了3byte空间。<br />
3.Char和NChar都被存放于可变长度的类型中。原因同上。比如，CSDN被存在Char(10)中，但是它只需要Char(4)空间，所以压缩后就释放了Char(6)个空间。<br />
4.所有类型的NULL和0都不占字节了。<br />
页压缩：</p>
<p>1.进行行压缩。<br />
2.前标压缩：每一页中的所有列，在行标头下面，每行都存储着一个行定义值，压缩后，所有行的定义值都被替换成行头值的引用。<br />
3.字典压缩：字典压缩和前标压缩类似。前标压缩中，一个与其他普通值不同的值被定义到每一列上。但是字典压缩中，每一页中所有列的普通值被存在下一行的行头前面。然后，这些值被替换成新行的引用值。<br />
下面我们来看一个例子:</p>
<p>USE tempdb<br />
GO<br />
CREATE TABLE TestCompression (col1 INT, col2 CHAR(50))<br />
GO<br />
INSERT INTO TestCompression VALUES (10, &#8216;compression testing&#8217;)<br />
GO 5000<br />
&#8211; Original<br />
EXEC sp_spaceused TestCompression<br />
GO<br />
&#8211; DATA_COMPRESSION = ROW<br />
ALTER TABLE TestCompression<br />
REBUILD WITH (DATA_COMPRESSION = ROW);<br />
GO<br />
EXEC sp_spaceused TestCompression<br />
GO<br />
&#8211; DATA_COMPRESSION = PAGE<br />
ALTER TABLE TestCompression<br />
REBUILD WITH (DATA_COMPRESSION = PAGE);<br />
GO<br />
EXEC sp_spaceused TestCompression<br />
GO<br />
&#8211; DATA_COMPRESSION = NONE<br />
ALTER TABLE TestCompression<br />
REBUILD WITH (DATA_COMPRESSION = NONE);<br />
GO<br />
EXEC sp_spaceused TestCompression<br />
GO</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F03%2Fsql-server-2008-2.html&title=SQL+Server+2008%E8%A1%8C%E6%95%B0%E6%8D%AE%E5%92%8C%E9%A1%B5%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9%E8%A7%A3%E5%AF%86" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/03/sql-server-2008-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql, oracle等常见数据库的分页实现方法</title>
		<link>http://www.kaixinbc.com/2010/02/mysql-oracle-fenye.html</link>
		<comments>http://www.kaixinbc.com/2010/02/mysql-oracle-fenye.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 13:19:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=439</guid>
		<description><![CDATA[



1.Oracle:
select * from ( select row_.*, rownum rownum_ from ( query_SQL )  row_ where rownum =&#60; max) where rownum_ &#62;= min
2.SQL Server:
select  top @pagesize * from tablename where id not in (select top @pagesize*(@page-1)  id from tablename order by id) order by id
3.MySQL
select * from tablename limit position, counter
4.DB2
select * from (select [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript"><!--
google_ad_client = "pub-6590413867458515";
/* 468x15, 创建于 10-2-21 */
google_ad_slot = "6389107865";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<p>1.Oracle:<br />
select * from ( select row_.*, rownum rownum_ from ( query_SQL )  row_ where rownum =&lt; max) where rownum_ &gt;= min<br />
2.SQL Server:<br />
select  top @pagesize * from tablename where id not in (select top @pagesize*(@page-1)  id from tablename order by id) order by id</p>
<p>3.MySQL<br />
select * from tablename limit position, counter</p>
<p>4.DB2<br />
select * from (select *,rownumber() as ROW_NEXT from tablename)  where ROW_NEXT between min and max<br />
<script type="text/javascript"><!--
google_ad_client = "pub-6590413867458515";
/* 336x280, 创建于 10-2-21 */
google_ad_slot = "9531781079";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
——————————————————————————————–<br />
1.分页方案一：(利用Not In和SELECT  TOP分页)效率次之<br />
语句形式：<br />
SELECT TOP 10 * FROM TestTable<br />
WHERE(ID NOT IN (SELECT  TOP 20  id FROM  TestTable  ORDERBY  id))   ORDERBYID<br />
SELECT  TOP 页大小 * FROM  TestTable<br />
WHERE( ID NOT IN　(SELECT  TOP  每页大小-1*待查询页数-1  id  FROM  表　ORDERBY   id)) ORDERBYID<br />
思路:先查询出待查询页之前的全部条数的id,查询ID不在这些ID中的指定数量条数</p>
<p>2.分页方案二：(利用ID大于多少和SELECT TOP分页)效率最高<br />
语句形式：<br />
SELECT  TOP  10 *   FROM   TestTable<br />
WHERE(ID&gt;(SELECT MAX(id) FROM(SELECT TOP20 id  FROM  TestTable  ORDERBYid)AS T))ORDERBY ID<br />
SELECT  TOP  页大小* FROM   TestTable<br />
WHERE(ID&gt;(SELECT MAX(id) FROM(SELECT TOP 每页大小*待查询页数-1  id FROM  表  ORDERBY id)AS T)) ORDERBY  ID<br />
思路:先获得待查询页的之前全部条数id,获得它们当中最大的ID号,以此最大ID号为标志,查找比这个ID号大的指定条数</p>
<p>3.分页方案三：<br />
SELECT TOP PageSize * FROM(SELECT TOP nPage*PageSize * from  YOURTABLE order by id)as a order by id desc<br />
SELECT TOP 每页条数 * FROM (SELECT  TOP 待查询页*每页条数) * from YOURTABLE order by id)as a order by id  desc<br />
思路:先正排序查询出待查询页之前(包括当前页)的全部条数,然后将其倒排序,取指定条数</p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6590413867458515";
/* 468x15, 创建于 10-2-21 */
google_ad_slot = "6389107865";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F02%2Fmysql-oracle-fenye.html&title=mysql%2C+oracle%E7%AD%89%E5%B8%B8%E8%A7%81%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%88%86%E9%A1%B5%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/02/mysql-oracle-fenye.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sql server中什么是聚集索引和非聚集索引？</title>
		<link>http://www.kaixinbc.com/2010/02/sql-server-suoyin.html</link>
		<comments>http://www.kaixinbc.com/2010/02/sql-server-suoyin.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 13:15:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=437</guid>
		<description><![CDATA[（1）非聚集索引
非聚集索引与课本中的索引类似。数据存储在一个地方，索引存储在另一个地方，索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储，而表中的信息按另一种顺序存储（这可以由聚集索引规定）。如果在表中未创建聚集索引，则无法保证这些行具有任何特定的顺序。
典型的桌面数据库使用的是非聚集索引。在这类索引中，索引键值是有序的，而每个索引节点所指向的数据行是无序的。一个SQL  Server表最多可以拥有255个非聚集索引。
非聚集索引与聚集索引一样有 B-树结构，但是有两个重大差别：
    数据行不按非聚集索引键的顺序排序和存储。
   非聚集索引的叶层不包含数据页。
相反，叶节点包含索引行。每个索引行包含非聚集键值以及一个或多个行定位器，这些行定位器指向有该键值的数据行（如果索引不唯一，则可能是多行）。非聚集索引可以在有聚集索引的表、堆集或索引视图上定义。在  SQL Server中，非聚集索引中的行定位器有两种形式：
   如果表是堆集（没有聚集索引），行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行  ID。
     如果表是堆集（没有聚集索引），行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行  ID。
由于非聚集索引将聚集索引键作为其行指针存储，因此使聚集索引键尽可能小很重要。如果表还有非聚集索引，请不要选择大的列作为聚集索引的键。
在创建非聚集索引之前，应先了解您的数据是如何被访问的。可考虑将非聚集索引用于：
     包含大量非重复值的列，如姓氏和名字的组合（如果聚集索引用于其它列）。如果只有很少的非重复值，如只有 1 和  0，则大多数查询将不使用索引，因为此时表扫描通常更有效。
    不返回大型结果集的查询。
   返回精确匹配的查询的搜索条件（WHERE 子句）中经常使用的列。
    经常需要联接和分组的决策支持系统应用程序。应在联接和分组操作中使用的列上创建多个非聚集索引，在任何外键列上创建一个聚集索引。
     在特定的查询中覆盖一个表中的所有列。这将完全消除对表或聚集索引的访问。
（2）聚集索引
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿，后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序，因此一个表只能包含一个聚集索引。但该索引可以包含多个列（组合索引），就像电话簿按姓氏和名字进行组织一样。
聚集索引在系统数据库表sysindexes 内有一行，其 indid =  1。数据链内的页和其内的行按聚集索引键值排序。所有插入都在所插入行中的键值与排序顺序相匹配时执行。
SQL  Server将索引组织为B-树。索引内的每一页包含一个页首，页首后面跟着索引行。每个索引行都包含一个键值以及一个指向较低级页或数据行的指针。索引的每个页称为索引节点。B-树的顶端节点称为根节点。索引的底层节点称为叶节点。每级索引中的页链接在双向链接列表中。在聚集索引内数据页组成叶节点。根和叶之间的任何索引级统称为中间级。
对于聚集索引，sysindexes.root 指向它的顶端。SQL Server 沿着聚集索引浏览以找到聚集索引键对应的行。为找到键的范围，SQL  Server 浏览索引以找到这个范围的起始键值，然后用向前或向后指针扫描数据页。为找到数据页链的首页，SQL Server  从索引的根节点开始沿最左边的指针进行扫描.
聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后，便可以确保包含后续索引值的行在物理相邻。例如，如果应用程序执行的一个查询经常检索某一日期范围内的记录，则使用聚集索引可以迅速找到包含开始日期的行，然后检索表中所有相邻的行，直到到达结束日期。这样有助于提高此类查询的性能。同样，如果对从表中检索的数据进行排序时经常要用到某一列，则可以将该表在该列上聚集（物理排序），避免每次查询该列时都进行排序，从而节省成本。
对于聚集索引，人们往往有一些错误的认识。其中，最常见的错误有：
    聚集索引会降低insert操作的速度，因为必须要向后移动一半的数据来为新插入的行腾出空间。这种认识是错误的，因为可以利用填充因子控制填充的百分比，从而在索引页上为新插入的数据保留空间。如果索引页填满了，SQL  Server将会进行页拆分，在这种情况下只有第一个页才会受到影响。
   在使用标识列的主键上创建聚集索引是一种好的设计方法，它可以使对表的操作达到最快速度。这种认识是错误的，它浪费了创建其它更有效的聚集索引的机会。并且，使用这种方法会把每个新插入的记录行都存储到表尾部的同一个的数据页中，这将导致数据库的热点和锁争用。笔者曾经见过采用这种方法设计的数据库，对于每一个新订单，客户服务人员都不得不等待数分钟来加以确认。
   聚集索引是具有魔力的。如果哪个查询的速度不够快，那么就在该列上创建聚集索引，对于表的操作速度一定会得到提高。这种认识也是错误的，聚集索引只是比非聚集索引稍稍快了那么一点点。因为在每个表上只能创建一个聚集索引，所以它也是一种宝贵的性能资源，只有在那些经常作为条件查询一组记录行的列上才应该建立聚集索引。
在创建聚集索引之前，应先了解数据是如何被访问的。可考虑将聚集索引用于：
     包含大量非重复值的列。
    使用下列运算符返回一个范围值的查询：BETWEEN、&#62;、&#62;=、&#60; 和 &#60;=。
    [...]]]></description>
			<content:encoded><![CDATA[<p>（1）非聚集索引</p>
<p>非聚集索引与课本中的索引类似。数据存储在一个地方，索引存储在另一个地方，索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储，而表中的信息按另一种顺序存储（这可以由聚集索引规定）。如果在表中未创建聚集索引，则无法保证这些行具有任何特定的顺序。</p>
<p>典型的桌面数据库使用的是非聚集索引。在这类索引中，索引键值是有序的，而每个索引节点所指向的数据行是无序的。一个SQL  Server表最多可以拥有255个非聚集索引。</p>
<p>非聚集索引与聚集索引一样有 B-树结构，但是有两个重大差别：</p>
<p>    数据行不按非聚集索引键的顺序排序和存储。</p>
<p>   非聚集索引的叶层不包含数据页。</p>
<p>相反，叶节点包含索引行。每个索引行包含非聚集键值以及一个或多个行定位器，这些行定位器指向有该键值的数据行（如果索引不唯一，则可能是多行）。非聚集索引可以在有聚集索引的表、堆集或索引视图上定义。在  SQL Server中，非聚集索引中的行定位器有两种形式：</p>
<p>   如果表是堆集（没有聚集索引），行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行  ID。</p>
<p>     如果表是堆集（没有聚集索引），行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行  ID。</p>
<p>由于非聚集索引将聚集索引键作为其行指针存储，因此使聚集索引键尽可能小很重要。如果表还有非聚集索引，请不要选择大的列作为聚集索引的键。</p>
<p>在创建非聚集索引之前，应先了解您的数据是如何被访问的。可考虑将非聚集索引用于：</p>
<p>     包含大量非重复值的列，如姓氏和名字的组合（如果聚集索引用于其它列）。如果只有很少的非重复值，如只有 1 和  0，则大多数查询将不使用索引，因为此时表扫描通常更有效。</p>
<p>    不返回大型结果集的查询。</p>
<p>   返回精确匹配的查询的搜索条件（WHERE 子句）中经常使用的列。</p>
<p>    经常需要联接和分组的决策支持系统应用程序。应在联接和分组操作中使用的列上创建多个非聚集索引，在任何外键列上创建一个聚集索引。</p>
<p>     在特定的查询中覆盖一个表中的所有列。这将完全消除对表或聚集索引的访问。<br />
（2）聚集索引</p>
<p>聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿，后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序，因此一个表只能包含一个聚集索引。但该索引可以包含多个列（组合索引），就像电话簿按姓氏和名字进行组织一样。</p>
<p>聚集索引在系统数据库表sysindexes 内有一行，其 indid =  1。数据链内的页和其内的行按聚集索引键值排序。所有插入都在所插入行中的键值与排序顺序相匹配时执行。</p>
<p>SQL  Server将索引组织为B-树。索引内的每一页包含一个页首，页首后面跟着索引行。每个索引行都包含一个键值以及一个指向较低级页或数据行的指针。索引的每个页称为索引节点。B-树的顶端节点称为根节点。索引的底层节点称为叶节点。每级索引中的页链接在双向链接列表中。在聚集索引内数据页组成叶节点。根和叶之间的任何索引级统称为中间级。</p>
<p>对于聚集索引，sysindexes.root 指向它的顶端。SQL Server 沿着聚集索引浏览以找到聚集索引键对应的行。为找到键的范围，SQL  Server 浏览索引以找到这个范围的起始键值，然后用向前或向后指针扫描数据页。为找到数据页链的首页，SQL Server  从索引的根节点开始沿最左边的指针进行扫描.</p>
<p>聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后，便可以确保包含后续索引值的行在物理相邻。例如，如果应用程序执行的一个查询经常检索某一日期范围内的记录，则使用聚集索引可以迅速找到包含开始日期的行，然后检索表中所有相邻的行，直到到达结束日期。这样有助于提高此类查询的性能。同样，如果对从表中检索的数据进行排序时经常要用到某一列，则可以将该表在该列上聚集（物理排序），避免每次查询该列时都进行排序，从而节省成本。</p>
<p>对于聚集索引，人们往往有一些错误的认识。其中，最常见的错误有：</p>
<p>    聚集索引会降低insert操作的速度，因为必须要向后移动一半的数据来为新插入的行腾出空间。这种认识是错误的，因为可以利用填充因子控制填充的百分比，从而在索引页上为新插入的数据保留空间。如果索引页填满了，SQL  Server将会进行页拆分，在这种情况下只有第一个页才会受到影响。</p>
<p>   在使用标识列的主键上创建聚集索引是一种好的设计方法，它可以使对表的操作达到最快速度。这种认识是错误的，它浪费了创建其它更有效的聚集索引的机会。并且，使用这种方法会把每个新插入的记录行都存储到表尾部的同一个的数据页中，这将导致数据库的热点和锁争用。笔者曾经见过采用这种方法设计的数据库，对于每一个新订单，客户服务人员都不得不等待数分钟来加以确认。</p>
<p>   聚集索引是具有魔力的。如果哪个查询的速度不够快，那么就在该列上创建聚集索引，对于表的操作速度一定会得到提高。这种认识也是错误的，聚集索引只是比非聚集索引稍稍快了那么一点点。因为在每个表上只能创建一个聚集索引，所以它也是一种宝贵的性能资源，只有在那些经常作为条件查询一组记录行的列上才应该建立聚集索引。</p>
<p>在创建聚集索引之前，应先了解数据是如何被访问的。可考虑将聚集索引用于：<br />
     包含大量非重复值的列。<br />
    使用下列运算符返回一个范围值的查询：BETWEEN、&gt;、&gt;=、&lt; 和 &lt;=。</p>
<p>    被连续访问的列。</p>
<p>    返回大型结果集的查询。</p>
<p>   经常被使用联接或 GROUP BY 子句的查询访问的列；一般来说，这些是外键列。对 ORDER BY 或 GROUP BY  子句中指定的列进行索引，可以使 SQL Server 不必对数据进行排序，因为这些行已经排序。这样可以提高查询性能。</p>
<p>    OLTP 类型的应用程序，这些程序要求进行非常快速的单行查找（一般通过主键）。应在主键上创建聚集索引。</p>
<p>注意，聚集索引不适用于：<br />
    频繁更改的列，这将导致整行移动（因为 SQL Server  必须按物理顺序保留行中的数据值）。这一点要特别注意，因为在大数据量事务处理系统中数据是易失的。</p>
<p>    宽键，来自聚集索引的键值由所有非聚集索引作为查找键使用，因此存储在每个非聚集索引的叶条目内。</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F02%2Fsql-server-suoyin.html&title=sql+server%E4%B8%AD%E4%BB%80%E4%B9%88%E6%98%AF%E8%81%9A%E9%9B%86%E7%B4%A2%E5%BC%95%E5%92%8C%E9%9D%9E%E8%81%9A%E9%9B%86%E7%B4%A2%E5%BC%95%EF%BC%9F++" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/02/sql-server-suoyin.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL创始人寻求中国帮助 开心编程网加入全球拯救MySql行动</title>
		<link>http://www.kaixinbc.com/2010/02/save-mysql-all-over-the-world.html</link>
		<comments>http://www.kaixinbc.com/2010/02/save-mysql-all-over-the-world.html#comments</comments>
		<pubDate>Thu, 04 Feb 2010 12:09:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP开源]]></category>
		<category><![CDATA[业界动态]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[insert语句，mysql]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[开源技术]]></category>
		<category><![CDATA[开源软件]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=312</guid>
		<description><![CDATA[
 MySQL创始人向中国方面求援的邮件。全文如下：
亲爱的拯救MySQL的中国签名支持者：
       欧盟可能无法拯救MySQL, 中国和俄罗斯可能是拯救MySQL的希望之所在。中国拥有强大、独立以及自信的反垄断主管机关，因此，我本人在此请求您的帮助。对于您在http://www.helpmysql.org/ru/petition的签名，我们深表感谢。如果可以的话，我们需要您的进一步帮助：
        (1)商务部反垄断局是并购反垄断审查的主管机关，包括本次对甲骨文收购太阳微电子的反垄断审查。如果您正在使用MySQL，您的意见将对于商务部反垄断局的审查非常重要。我们不能详细的指示您该如何如何对主管机关反映情况，因为这是不妥当的。但是我们认为，如果您能告诉主管机关您的公司如何使用MySQL (什么项目，什么规模、数据流量以及使用者数量等)以及您认为甲骨文收购MySQL之后会产生什么样的影响，将会非常有用。如果您知道MySQL是昂贵的甲骨文数据库的免费替代品，举例向商务部反垄断局说明将会很有帮助。特别是，您知道或使用MySQL作为筹码，或声称将使用MySQL，以此要求甲骨文数据库降低价格的情况，请一定向商务部说明。我们希望您能直接写信给商务部反垄断局。
       商务部反垄断局会保护MySQL以及您作为使用者，客户和消费者的利益。在与商务部的沟通过程中，请您简单明了地说明您具体需要什么样的帮助。
       (2)感谢许许多多像您一样支持我们的人，我们在中国已经收集到了650 个签名，请见：http://helpmysql.org/cn/stats。 这是一个很好的开始。但是像中国这样一个支持开源的大国，应该会有更多人的签名。问题可能在于很多人可能认为这是欧盟委员会审查决定的事项，中国可能无法改变什么。事实上，中国商务部反垄断局可以做出自己的决定。
       在中国，知道此事的人可能还不多，新闻报道也比较有限。如果您有兴趣，可以帮我们联系中国有影响力IT网站或杂志，告诉他们这次签名活动。
       如果有更多的网站参与进来，就会有更多的人签署请愿书，虽然这只是第一步。切记确保文章中或网站中提到helpmysql.org，或者提供一个链接http://helpmysql.org/cn/theissue/customerspaythebill
对于您所做出的任何帮助，我在此预致感谢!
Michael Widenius
Creator of MySQL
 
    广大技术技术编程爱好者，如果你见到了这篇文章，也请你加入到我们的行列，让我们一起拯救MySQL，将开源进行到底！


]]></description>
			<content:encoded><![CDATA[<div>
<p style="text-align: left;"><strong> MySQL创始人向中国方面求援的邮件。全文如下：</strong></p>
<p><strong>亲爱的拯救MySQL的中国签名支持者：</strong></p>
<p>       欧盟可能无法拯救MySQL, 中国和俄罗斯可能是拯救MySQL的希望之所在。中国拥有强大、独立以及自信的反垄断主管机关，因此，我本人在此请求您的帮助。对于您在<a href="http://www.helpmysql.org/ru/petition" target="_blank">http://www.helpmysql.org/ru/petition</a>的签名，我们深表感谢。如果可以的话，我们需要您的进一步帮助：</p>
<p>        (1)商务部反垄断局是并购反垄断审查的主管机关，包括本次对甲骨文收购太阳微电子的反垄断审查。如果您正在使用MySQL，您的意见将对于商务部反垄断局的审查非常重要。我们不能详细的指示您该如何如何对主管机关反映情况，因为这是不妥当的。但是我们认为，如果您能告诉主管机关您的公司如何使用MySQL (什么项目，什么规模、数据流量以及使用者数量等)以及您认为甲骨文收购MySQL之后会产生什么样的影响，将会非常有用。如果您知道MySQL是昂贵的甲骨文数据库的免费替代品，举例向商务部反垄断局说明将会很有帮助。特别是，您知道或使用MySQL作为筹码，或声称将使用MySQL，以此要求甲骨文数据库降低价格的情况，请一定向商务部说明。我们希望您能直接写信给商务部反垄断局。</p>
<p>       商务部反垄断局会保护MySQL以及您作为使用者，客户和消费者的利益。在与商务部的沟通过程中，请您简单明了地说明您具体需要什么样的帮助。</p>
<p>       (2)感谢许许多多像您一样支持我们的人，我们在中国已经收集到了650 个签名，请见：<a href="http://helpmysql.org/cn/stats" target="_blank">http://helpmysql.org/cn/stats</a>。 这是一个很好的开始。但是像中国这样一个支持开源的大国，应该会有更多人的签名。问题可能在于很多人可能认为这是欧盟委员会审查决定的事项，中国可能无法改变什么。事实上，中国商务部反垄断局可以做出自己的决定。</p>
<p>       在中国，知道此事的人可能还不多，新闻报道也比较有限。如果您有兴趣，可以帮我们联系中国有影响力IT网站或杂志，告诉他们这次签名活动。</p>
<p>       如果有更多的网站参与进来，就会有更多的人签署请愿书，虽然这只是第一步。切记确保文章中或网站中提到helpmysql.org，或者提供一个链接<a href="http://helpmysql.org/cn/theissue/customerspaythebill" target="_blank">http://helpmysql.org/cn/theissue/customerspaythebill</a></p>
<p><strong>对于您所做出的任何帮助，我在此预致感谢!</strong></p>
<p><strong>Michael Widenius</strong></p>
<p><strong>Creator of MySQL</strong></p>
<p><strong> </strong></p>
<p><strong>    </strong>广大技术技术编程爱好者，如果你见到了这篇文章，也请你加入到我们的行列，让我们一起拯救MySQL，将开源进行到底！</p>
<p><a href="http://helpmysql.org/cn/petition"><img class="size-medium wp-image-313 alignnone" title="petition-sign-cn" src="http://www.kaixinbc.com/wp-content/uploads/2010/02/petition-sign-cn-300x211.png" alt="" width="300" height="211" /></a></p>
</div>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F02%2Fsave-mysql-all-over-the-world.html&title=MySQL%E5%88%9B%E5%A7%8B%E4%BA%BA%E5%AF%BB%E6%B1%82%E4%B8%AD%E5%9B%BD%E5%B8%AE%E5%8A%A9+%E5%BC%80%E5%BF%83%E7%BC%96%E7%A8%8B%E7%BD%91%E5%8A%A0%E5%85%A5%E5%85%A8%E7%90%83%E6%8B%AF%E6%95%91MySql%E8%A1%8C%E5%8A%A8" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/02/save-mysql-all-over-the-world.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>java数据库设计中的14个技巧</title>
		<link>http://www.kaixinbc.com/2010/02/java-sjk-easy.html</link>
		<comments>http://www.kaixinbc.com/2010/02/java-sjk-easy.html#comments</comments>
		<pubDate>Thu, 04 Feb 2010 11:50:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=303</guid>
		<description><![CDATA[    下述十四个技巧，是许多人在大量的数据库分析与设计实践中，逐步总结出来的。对于这些经验的运用，读者不能生帮硬套，死记硬背，而要消化理解，实事求是，灵活掌握。并逐步做到：在应用中发展，在发展中应用。
      1. 原始单据与实体之间的关系
　　
      可以是一对一、一对多、多对多的关系。在一般情况下，它们是一对一的关系：即一张原始单据对应且只对应一个实体。在特殊情况下，它们可能是一对多或多对一的关系，即一张原始单证对应多个实体，或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后，对我们设计录入界面大有好处。
      〖例1〗：一份员工履历资料，在人力资源信息系统中，就对应三个基本表：员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。
      2. 主键与外键
　　
      一般而言，一个实体不能既无主键又无外键。在E?R 图中, 处于叶子部位的实体, 可以定义主键，也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。
　　
      主键与外键的设计，在全局数据库的设计中，占有重要地位。当全局数据库的设计完成以后，有个美国数据库设计专家说：“键，到处都是键，除了键之外，什么也没有”，这就是他的数据库设计经验之谈，也反映了他对信息系统核心(数据模型)的高度抽象思想。因为：主键是实体的高度抽象，主键与外键的配对，表示实体之间的连接。
      3. 基本表的性质
　　
      基本表与中间表、临时表不同，因为它具有如下四个特性：
　　
        (1) 原子性。基本表中的字段是不可再分解的。
　　    (2) 原始性。基本表中的记录是原始数据（基础数据）的记录。
　　    (3) 演绎性。由基本表与代码表中的数据，可以派生出所有的输出数据。
　　    (4) 稳定性。基本表的结构是相对稳定的，表中的记录是要长期保存的。
      理解基本表的性质后，在设计数据库时，就能将基本表与中间表、临时表区分开来。
      4. 范式标准
　
      基本表及其字段之间的关系, 应尽量满足第三范式。但是，满足第三范式的数据库设计，往往不是最好的设计。为了提高数据库的运行效率，常常需要降低范式标准：适当增加冗余，达到以空间换时间的目的。
      〖例2〗：有一张存放商品的基本表，如表1所示。“金额”这个字段的存在，表明该表的设计不满足第三范式，因为“金额”可以由“单价”乘以“数量”得到，说明“金额”是冗余字段。但是，增加“金额”这个冗余字段，可以提高查询统计的速度，这就是以空间换时间的作法。
　　
      在Rose 2002中，规定列有两种类型：数据列和计算列。“金额”这样的列被称为“计算列”，而“单价”和“数量”这样的列被称为“数据列”。
　　
      表1 商品表的表结构
　　  商品名称 商品型号 单价 数量 金额
　　  电视机 29? 2,500 40 100,000
　　
      5. 通俗地理解三个范式
　　
      通俗地理解三个范式，对于数据库设计大有好处。在数据库设计中，为了更好地应用三个范式，就必须通俗地理解三个范式(通俗地理解是够用的理解，并不是最科学最准确的理解)：
　　
          第一范式：1NF是对属性的原子性约束，要求属性具有原子性，不可再分解；
　　  第二范式：2NF是对记录的惟一性约束，要求记录有惟一标识，即实体的惟一性；
　　  第三范式：3NF是对字段冗余性的约束，即任何字段不能由其他字段派生出来，它要求字段没有冗余.
     没有冗余的数据库设计可以做到。但是，没有冗余的数据库未必是最好的数据库，有时为了提高运行效率，就必须降低范式标准，适当保留冗余数据。具体做法是：在概念数据模型设计时遵守第三范式，降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段，允许冗余。
      6. 要善于识别与正确处理多对多的关系
     
      若两个实体之间存在多对多的关系，则应消除这种关系。消除的办法是，在两者之间增加第三个实体。这样，原来一个多对多的关系，现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体，实质上是一个较复杂的关系，它对应一张基本表。一般来讲，数据库设计工具不能识别多对多的关系，但能处理多对多的关系。
      [...]]]></description>
			<content:encoded><![CDATA[<p>    下述十四个技巧，是许多人在大量的数据库分析与设计实践中，逐步总结出来的。对于这些经验的运用，读者不能生帮硬套，死记硬背，而要消化理解，实事求是，灵活掌握。并逐步做到：在应用中发展，在发展中应用。</p>
<p>      1. 原始单据与实体之间的关系<br />
　　<br />
      可以是一对一、一对多、多对多的关系。在一般情况下，它们是一对一的关系：即一张原始单据对应且只对应一个实体。在特殊情况下，它们可能是一对多或多对一的关系，即一张原始单证对应多个实体，或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后，对我们设计录入界面大有好处。</p>
<p>      〖例1〗：一份员工履历资料，在人力资源信息系统中，就对应三个基本表：员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。</p>
<p>      2. 主键与外键<br />
　　<br />
      一般而言，一个实体不能既无主键又无外键。在E?R 图中, 处于叶子部位的实体, 可以定义主键，也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。<br />
　　<br />
      主键与外键的设计，在全局数据库的设计中，占有重要地位。当全局数据库的设计完成以后，有个美国数据库设计专家说：“键，到处都是键，除了键之外，什么也没有”，这就是他的数据库设计经验之谈，也反映了他对信息系统核心(数据模型)的高度抽象思想。因为：主键是实体的高度抽象，主键与外键的配对，表示实体之间的连接。</p>
<p>      3. 基本表的性质<br />
　　<br />
      基本表与中间表、临时表不同，因为它具有如下四个特性：<br />
　　<br />
        (1) 原子性。基本表中的字段是不可再分解的。<br />
　　    (2) 原始性。基本表中的记录是原始数据（基础数据）的记录。<br />
　　    (3) 演绎性。由基本表与代码表中的数据，可以派生出所有的输出数据。<br />
　　    (4) 稳定性。基本表的结构是相对稳定的，表中的记录是要长期保存的。</p>
<p>      理解基本表的性质后，在设计数据库时，就能将基本表与中间表、临时表区分开来。</p>
<p>      4. 范式标准<br />
　<br />
      基本表及其字段之间的关系, 应尽量满足第三范式。但是，满足第三范式的数据库设计，往往不是最好的设计。为了提高数据库的运行效率，常常需要降低范式标准：适当增加冗余，达到以空间换时间的目的。</p>
<p>      〖例2〗：有一张存放商品的基本表，如表1所示。“金额”这个字段的存在，表明该表的设计不满足第三范式，因为“金额”可以由“单价”乘以“数量”得到，说明“金额”是冗余字段。但是，增加“金额”这个冗余字段，可以提高查询统计的速度，这就是以空间换时间的作法。<br />
　　<br />
      在Rose 2002中，规定列有两种类型：数据列和计算列。“金额”这样的列被称为“计算列”，而“单价”和“数量”这样的列被称为“数据列”。<br />
　　<br />
      表1 商品表的表结构<br />
　　  商品名称 商品型号 单价 数量 金额<br />
　　  电视机 29? 2,500 40 100,000<br />
　　<br />
      5. 通俗地理解三个范式<br />
　　<br />
      通俗地理解三个范式，对于数据库设计大有好处。在数据库设计中，为了更好地应用三个范式，就必须通俗地理解三个范式(通俗地理解是够用的理解，并不是最科学最准确的理解)：<br />
　　<br />
          第一范式：1NF是对属性的原子性约束，要求属性具有原子性，不可再分解；<br />
　　  第二范式：2NF是对记录的惟一性约束，要求记录有惟一标识，即实体的惟一性；<br />
　　  第三范式：3NF是对字段冗余性的约束，即任何字段不能由其他字段派生出来，它要求字段没有冗余.</p>
<p>     没有冗余的数据库设计可以做到。但是，没有冗余的数据库未必是最好的数据库，有时为了提高运行效率，就必须降低范式标准，适当保留冗余数据。具体做法是：在概念数据模型设计时遵守第三范式，降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段，允许冗余。</p>
<p>      6. 要善于识别与正确处理多对多的关系<br />
     <br />
      若两个实体之间存在多对多的关系，则应消除这种关系。消除的办法是，在两者之间增加第三个实体。这样，原来一个多对多的关系，现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体，实质上是一个较复杂的关系，它对应一张基本表。一般来讲，数据库设计工具不能识别多对多的关系，但能处理多对多的关系。</p>
<p>      〖例3〗：在“图书馆信息系统”中，“图书”是一个实体，“读者”也是一个实体。这两个实体之间的关系，是一个典型的多对多关系：一本图书在不同时间可以被多个读者借阅，一个读者又可以借多本图书。为此，要在二者之间增加第三个实体，该实体取名为“借还书”，它的属性为：借还时间、借还标志(0表示借书，1表示还书)，另外，它还应该有两个外键(“图书”的主键，“读者”的主键)，使它能与“图书”和“读者”连接。</p>
<p>      7. 主键PK的取值方法<br />
　　<br />
      PK是供程序员使用的表间连接工具，可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时，建议字段的个数不要太多，多了不但索引占用空间大，而且速度也慢。</p>
<p>      8. 正确认识数据冗余<br />
　　<br />
      主键与外键在多表中的重复出现, 不属于数据冗余，这个概念必须清楚，事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余！而且是一种低级冗余，即重复性的冗余。高级冗余不是字段的重复出现，而是字段的派生出现。</p>
<p>      〖例4〗：商品中的“单价、数量、金额”三个字段，“金额”就是由“单价”乘以“数量”派生出来的，它就是冗余，而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性，因为同一数据，可能从不同时间、地点、角色上多次录入。因此，我们提倡高级冗余(派生性冗余)，反对低级冗余(重复性冗余)。</p>
<p>      9. E&#8211;R图没有标准答案<br />
　　<br />
      信息系统的E&#8211;R图没有标准答案，因为它的设计与画法不是惟一的，只要它覆盖了系统需求的业务范围和功能内容，就是可行的。反之要修改E&#8211;R图。尽管它没有惟一的标准答案，并不意味着可以随意设计。好的E?R图的标准是：结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。</p>
<p>      10. 视图技术在数据库设计中很有用<br />
　　<br />
      与基本表、代码表、中间表不同，视图是一种虚表，它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口，是基表数据综合的一种形式, 是数据处理的一种方法，是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。 若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。</p>
<p>      对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统，视图的作用更加重要。这些系统的基本表完成物理设计之后，立即在基本表上建立第一层视图，这层视图的个数和结构，与基本表的个数和结构是完全相同。并且规定，所有的程序员，一律只准在视图上操作。只有数据库管理员，带着多个人员共同掌握的“安全钥匙”，才能直接在基本表上操作。请读者想想：这是为什么？</p>
<p>      11. 中间表、报表和临时表<br />
　　<br />
      中间表是存放统计数据的表，它是为数据仓库、输出报表或查询结果而设计的，有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的，存放临时记录，为个人所用。基表和中间表由DBA维护，临时表由程序员自己用程序自动维护。</p>
<p>      12. 完整性约束表现在三个方面<br />
　　<br />
      域的完整性：用Check来实现约束，在数据库设计工具中，对字段的取值范围进行定义时，有一个Check按钮，通过它定义字段的值城。参照完整性：用PK、FK、表级触发器来实现。用户定义完整性：它是一些业务规则，用存储过程和触发器来实现。</p>
<p>      13. 防止数据库设计打补丁的方法是“三少原则”<br />
　　<br />
      (1) 一个数据库中表的个数越少越好。只有表的个数少了，才能说明系统的E&#8211;R图少而精，去掉了重复的多余的实体，形成了对客观世界的高度抽象，进行了系统的数据集成，防止了打补丁式的设计；<br />
　　 <br />
      (2) 一个表中组合主键的字段个数越少越好。因为主键的作用，一是建主键索引，二是做为子表的外键，所以组合主键的字段个数少了，不仅节省了运行时间，而且节省了索引存储空间；<br />
　　 <br />
      (3) 一个表中的字段个数越少越好。只有字段的个数少了，才能说明在系统中不存在数据重复，且很少有数据冗余，更重要的是督促读者学会“列变行”，这样就防止了将子表中的字段拉入到主表中去，在主表中留下许多空余的字段。所谓“列变行”，就是将主表中的一部分内容拉出去，另外单独建一个子表。这个方法很简单，有的人就是不习惯、不采纳、不执行。<br />
　　<br />
      数据库设计的实用原则是：在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念，综合观点，不能孤立某一个原则。该原则是相对的，不是绝对的。“三多”原则肯定是错误的。试想：若覆盖系统同样的功能，一百个实体(共一千个属性) 的E&#8211;R图，肯定比二百个实体(共二千个属性) 的E&#8211;R图，要好得多。<br />
　　<br />
      提倡“三少”原则，是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库，将应用数据库集成为主题数据库，将主题数据库集成为全局综合数据库。集成的程度越高，数据共享性就越强，信息孤岛现象就越少，整个企业信息系统的全局E?R图中实体的个数、主键的个数、属性的个数就会越少。<br />
　　<br />
      提倡“三少”原则的目的，是防止读者利用打补丁技术，不断地对数据库进行增删改，使企业数据库变成了随意设计数据库表的“垃圾堆”，或数据库表的“大杂院”，最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章，不计其数，导致企事业单位的信息系统无法维护而瘫痪。<br />
　　<br />
      “三多”原则任何人都可以做到，该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则，它要求有较高的数据库设计技巧与艺术，不是任何人都能做到的，因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。</p>
<p>      14. 提高数据库运行效率的办法<br />
　　<br />
      在给定的系统硬件和系统软件条件下，提高数据库系统的运行效率的办法是：<br />
      (1) 在数据库物理设计时，降低范式，增加冗余, 少用触发器, 多用存储过程。<br />
     <br />
      (2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条)，复杂计算要先在数据库外面，以文件系统方式用C++语言计算处理完成之后，最后才入库追加到表中去。这是电信计费系统设计的经验。<br />
　　<br />
      (3) 发现某个表的记录太多，例如超过一千万条，则要对该表进行水平分割。水平分割的做法是，以该表主键PK的某个值为界线，将该表的记录水平分割为两个表。若发现某个表的字段太多，例如超过八十个，则垂直分割该表，将原来的一个表分解为两个表。<br />
　　<br />
      (4) 对数据库管理系统DBMS进行系统优化，即优化各种系统参数，如缓冲区个数。<br />
　　<br />
      (5) 在使用面向数据的SQL语言进行程序设计时，尽量采取优化算法。<br />
　<br />
      总之，要提高数据库的运行效率，必须从数据库系统级优化、数据库设计级优化、程序实现级优化，这三个层次上同时下功夫。</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F02%2Fjava-sjk-easy.html&title=java%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1%E4%B8%AD%E7%9A%8414%E4%B8%AA%E6%8A%80%E5%B7%A7" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/02/java-sjk-easy.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server 2008中的格式化日期</title>
		<link>http://www.kaixinbc.com/2010/01/sql-server-2008.html</link>
		<comments>http://www.kaixinbc.com/2010/01/sql-server-2008.html#comments</comments>
		<pubDate>Fri, 29 Jan 2010 06:07:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[数据库中格式化日期]]></category>
		<category><![CDATA[数据库，SQL server]]></category>
		<category><![CDATA[格式化日期]]></category>

		<guid isPermaLink="false">http://www.kaixinbc.com/?p=246</guid>
		<description><![CDATA[　　我们都知道不同的国家要求不同的日期格式。不同的应用程序要求不同的日期格式。SQL Server数据库管理员和开发人员将函数convert()和其它日期函数例如datepart()、datename()等等一起使用来操纵输出的格式。这篇文章介绍怎样创建一个普通函数来获得不同国家和应用程序所要求的大多数格式。]]></description>
			<content:encoded><![CDATA[<p>让我们来创建dbo.format_date 函数，如下所示。</p>
<p>　　</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#f3f3f3">      /****** <strong><span style="color: #bc0e07;">Object</span></strong>: UserDefinedFunction [dbo].[format_date]　　<strong><span style="color: #bc0e07;">Script</span></strong> Date: 05/12/2009 23:19:35 ******/</p>
<p>　　IF EXISTS (SELECT * FROM sys.objects</p>
<p>　　WHERE object_id = OBJECT_ID(N&#8217;[dbo].[format_date]&#8216;)</p>
<p>　　AND type in (N&#8217;FN&#8217;, N&#8217;IF&#8217;, N&#8217;TF&#8217;, N&#8217;FS&#8217;, N&#8217;FT&#8217;))</p>
<p>　　DROP FUNCTION [dbo].[format_date]</p>
<p>　　GO</p>
<p>　　/****** Object: UserDefinedFunction [dbo].[format_date]</p>
<p>　　Script Date: 05/12/2009 23:19:18 ******/</p>
<p>　　<strong><span style="color: #bc0e07;">SET</span></strong> ANSI_NULLS ON</p>
<p>　　GO</p>
<p>　　SET QUOTED_IDENTIFIER ON</p>
<p>　　GO</p>
<p>　　SET CONCAT_NULL_YIELDS_NULL OFF</p>
<p>　　go</p>
<p>　　CREATE function [dbo].[format_date]</p>
<p>　　(@inputdate datetime ,@<strong><span style="color: #bc0e07;">format</span></strong> varchar(500))</p>
<p>　　returns varchar(500)</p>
<p>　　as</p>
<p>　　begin</p>
<p>　　declare @year varchar(4) &#8211;YYYY</p>
<p>　　declare @shortyear varchar(4) &#8211;Yr</p>
<p>　　declare @quarter varchar(4) &#8211;QQ</p>
<p>　　declare @month varchar(2) &#8211;MM</p>
<p>　　declare @week varchar(2) &#8211;WW</p>
<p>　　declare @day varchar(2) &#8211;DD</p>
<p>　　declare @24hours varchar(2) &#8211;24HH</p>
<p>　　declare @12hours varchar(2) &#8211;HH</p>
<p>　　declare @minutes varchar(2) &#8211;MI</p>
<p>　　declare @seconds varchar(2) &#8211;SS</p>
<p>　　declare @milliseconds varchar(3) &#8211;MS</p>
<p>　　declare @microseconds varchar(6) &#8211;MCS</p>
<p>　　declare @nanoseconds varchar(9) &#8211;NS</p>
<p>　　declare @dayname varchar(15) &#8211;DAY</p>
<p>　　declare @monthname varchar(15) &#8211;MONTH</p>
<p>　　declare @shortmonthname varchar(15) &#8211;MON</p>
<p>　　declare @AMPM varchar(15) &#8211;AMPM</p>
<p>　　declare @TZ varchar(15) &#8211;TZ</p>
<p>　　declare @UNIXPOSIX varchar(15) &#8211;UNIXPOSIX</p>
<p>　　&#8211;UCASE</p>
<p>　　&#8211;LCASE</p>
<p>　　declare @formatteddate varchar(500)</p>
<p>　　&#8211;Assign <strong><span style="color: #bc0e07;">current</span></strong> date and <strong><span style="color: #bc0e07;">time</span></strong> to</p>
<p>　　if (@inputdate is NULL or @inputdate =&#8221;)</p>
<p>　　begin</p>
<p>　　set @inputdate = getdate()</p>
<p>　　end</p>
<p>　　if (@format is NULL or @format =&#8221;)</p>
<p>　　begin</p>
<p>　　set @format =&#8217;YYYY-MM-DD 12HH:MI:SS AMPM&#8217;</p>
<p>　　end</td>
</tr>
</tbody>
</table>
<p>     &#8211;set all values</p>
<p>　　set @year = convert(varchar(4),year(@inputdate))</p>
<p>　　set @shortyear = right(@year,2)</p>
<p>　　set @quarter = convert(varchar(1),datepart(QQ,(@inputdate)))</p>
<p>　　set @month = right(&#8216;0&#8242;+convert(varchar(2),month(@inputdate)),2)</p>
<p>　　set @week = right(&#8216;0&#8242;+convert(varchar(2),datepart(ww,(@inputdate))),2)</p>
<p>　　set @day = right(&#8216;0&#8242;+convert(varchar(2),day(@inputdate)),2)</p>
<p>　　set @24hours = right(&#8216;0&#8242;+convert(varchar(2),datepart(hh,@inputdate)),2)</p>
<p>　　set @TZ = convert(varchar(10),datename(TZ,convert(varchar(20),@inputdate)))</p>
<p>　　set @UNIXPOSIX = convert(varchar(15),datediff(ss,convert(datetime,&#8217;01/01/1970 00:00:000&#8242;),@inputdate))</p>
<p>　　if datepart(hh,@inputdate) &gt;12</p>
<p>　　begin</p>
<p>　　set @12hours = right(&#8216;0&#8242;+convert(varchar(2),datepart(hh,@inputdate)) -12,2)</p>
<p>　　end</p>
<p>　　else</p>
<p>　　begin</p>
<p>　　set @12hours = right(&#8216;0&#8242;+convert(varchar(2),datepart(hh,@inputdate)) ,2)</p>
<p>　　end</p>
<p>　　if datepart(hh,@inputdate) &gt;11</p>
<p>　　begin</p>
<p>　　set @AMPM =&#8217;PM&#8217;</p>
<p>　　end</p>
<p>　　else</p>
<p>　　begin</p>
<p>　　set @AMPM =&#8217;AM&#8217;</p>
<p>　　end</p>
<p>　　set @minutes = right(&#8216;0&#8242;+convert(varchar(2),datepart(n,@inputdate)),2)</p>
<p>　　set @seconds = right(&#8216;0&#8242;+convert(varchar(2),datepart(ss,@inputdate)),2)</p>
<p>　　set @milliseconds = convert(varchar(3),datepart(ms,@inputdate))</p>
<p>　　set @microseconds = convert(varchar(6),datepart(mcs,@inputdate))</p>
<p>　　set @nanoseconds = convert(varchar(9),datepart(ns,@inputdate))</p>
<p>　　set @dayname = datename(weekday,@inputdate)</p>
<p>　　set @monthname = datename(mm,@inputdate)</p>
<p>　　set @shortmonthname= left(datename(mm,@inputdate),3)</p>
<p>　　set @formatteddate = @format</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;MONTH&#8217;,@monthname)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;MON&#8217;,@shortmonthname)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;AMPM&#8217;,@AMPM)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;YYYY&#8217;,@year)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;Yr&#8217;,@shortyear)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;QQ&#8217;,@quarter)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;WW&#8217;,@week)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;MM&#8217;,@month)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;DD&#8217;,@Day)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;24HH&#8217;,@24hours)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;12HH&#8217;,@12hours)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;Mi&#8217;,@minutes)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;SS&#8217;,@seconds)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;MS&#8217;,@milliseconds)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;MCS&#8217;,@microseconds)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;NS&#8217;,@nanoseconds)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;DAY&#8217;,@dayname)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;TZ&#8217;,@TZ)</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;UNIXPOSIX&#8217;,@UNIXPOSIX)</p>
<p>　　if charindex(&#8216;ucase&#8217;,@formatteddate)&lt;&gt;0</p>
<p>　　begin</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;ucase&#8217;,&#8221;)</p>
<p>　　set @formatteddate=upper(@formatteddate)</p>
<p>　　end</p>
<p>      if charindex(&#8216;lcase&#8217;,@formatteddate)&lt;&gt;0</p>
<p>　　begin</p>
<p>　　set @formatteddate=replace(@formatteddate,&#8217;lcase&#8217;,&#8221;)</p>
<p>　　set @formatteddate=lower(@formatteddate)</p>
<p>　　end</p>
<p>　　return @formatteddate</p>
<p>　　end</p>
<p>　　GO</p>
<p>　现在让我们使用不同的场景来看看这个函数的使用。下面关键字中的任何一个都可以联合使用来显示不同格式的日期。</p>
<p>　　YYYY &#8211; YYYY格式的年份，包括百年</p>
<p>　　Yr &#8211; YY格式的年份</p>
<p>　　QQ &#8211; 显示季度</p>
<p>　　MM &#8211; 显示月份</p>
<p>　　WW &#8211; 显示星期</p>
<p>　　DD &#8211; 显示日子</p>
<p>　　24HH &#8211; 以24小时制的形式显示小时</p>
<p>　　12HH &#8211; 以12小时制的形式显示小时</p>
<p>　　MI &#8211; 显示分钟</p>
<p>　　SS &#8211; 显示秒</p>
<p>　　MS &#8211; 显示毫秒</p>
<p>　　MCS &#8211; 显示微秒</p>
<p>　　NS &#8211; 显示十亿分之一秒</p>
<p>　　DAY &#8211; 显示日子的名称，例如：Monday</p>
<p>　　MONTH- &#8211; 显示月份的名称，例如：August</p>
<p>　　MON &#8211; 显示短的月份名称，例如：Aug</p>
<p>　　AMPM &#8211; 显示AM/PM 用于12小时制格式</p>
<p>　　TZ &#8211; 显示时间偏移</p>
<p>　　UNIXPOSIX &#8211; 显示unix posix时间。秒数从1/1/1970开始</p>
<p>　　UCASE &#8211; 以大写显示结果</p>
<p>　　LCASE &#8211; 以小写显示结果</p>
<p>　　场景 1</p>
<p>　　如果你想以YYYY/MM/DD的形式显示日期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY/MM/DD&#8217;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　2009/01/12</p>
<p>　　场景 2</p>
<p>　　要以YYYY-MM-DD格式显示日期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY-MM-DD&#8217;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>　　2009-01-12</p>
<p>　　场景 3</p>
<p>　　要显示年份和季节，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;Year: YYYY, Quarter: QQ &#8216;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　Year: 2009, Quarter: 1</p>
<p>　　场景 4</p>
<p>　　要以24小时制格式显示时间，执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;24HH:MI:SS&#8217;) as Time</p>
<p>　　结果：</p>
<p>　　Time</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>　　23:10:07</p>
<p>　　场景 5</p>
<p>　　要以12小时制格式显示时间，执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;12HH:MI:SS AMPM&#8217;) as Time</p>
<p>　　结果：</p>
<p>　　Time</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　11:11:02 PM</p>
<p>　　场景 6</p>
<p>　　要以日期形式为YYYY/MM/DD 和时间形式为24小时制来显示，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY/MM/DD 24HH:MI:SS&#8217;) as DateTime</p>
<p>　　结果：</p>
<p>　　DateTime</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　2009/01/12 23:11:44</p>
<p>　　场景 7</p>
<p>　　要以日期形式为YYYY/MM/DD和时间形式为12小时制来显示，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY/MM/DD 12HH:MI:SS AMPM&#8217;) as DateTime</p>
<p>　　结果：</p>
<p>　　DateTime</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>　　2009/01/12 11:13:27 PM</p>
<p>　　场景 8</p>
<p>　　要以DD-MM-YY 的形式来显示日期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;DD-MM-YR&#8217;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>　　12-01-09</p>
<p>　　场景 9</p>
<p>　　要以DDMMYY的形式显示日期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;DDMMYR&#8217;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>　　120109</p>
<p>　　场景 10</p>
<p>　　要显示日期和时间以你可以使用它来作为文件名称后缀的形式，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY_MM_DD_HH_MI_SS_MS_MCS_NS&#8217;) as FileNameSuffix</p>
<p>　　结果：</p>
<p>　　FileNameSuffix</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　2009_01_12_HH_16_18_200_200000_200000000</p>
<p>　　场景 11</p>
<p>　　要显示日期、时间、月份名称和日子的名称，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;DAY, MONTH DD, YYYY 12HH:MI:SS AMPM&#8217;) as DateTime</p>
<p>　　结果：</p>
<p>　　DateTime</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>　　Monday, January 12, 2009 11:20:31 PM</p>
<p>　　场景 12</p>
<p>　　要以时间偏移量来显示日期、时间、月份名称和日子的名称，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;DAY MONTH DDth, YR 12HH:MI:SS TZ&#8217;) as DateTime</p>
<p>　　结果：</p>
<p>　　DateTime</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>　　Monday January 12th, 09 11:21:42 +00:00</p>
<p>　　场景 13</p>
<p>　　要显示unix posix时间，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;Your Unix time is: UNIXPOSIX&#8217;) as POSIX</p>
<p>　　结果：</p>
<p>　　POSIX</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>　　Your Unix time is: 1231802580</p>
<p>　　场景 14</p>
<p>　　要显示年份和星期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;Year: YYYY, Week: WW&#8217;) as YearWeek</p>
<p>　　结果：</p>
<p>　　YearWeek</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>　　Year: 2009, Week: 03</p>
<p>　　场景15</p>
<p>　　要显示带有月份名称的日期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY-MONTH-DD&#8217;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　2009-January-12</p>
<p>　　场景16</p>
<p>　　要显示带有短的月份名称的日期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY-MON-DD&#8217;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>　　2009-Jan-12</p>
<p>　　场景17</p>
<p>　　要显示带有大写的短的月份名称的日期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY-MON-DD ucase&#8217;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>　　2009-JAN-12</p>
<p>　　场景18</p>
<p>　　要显示带有小写的月份名称的日期，那么执行下面的命令。</p>
<p>　　select dbo.format_date(GETDATE(),&#8217;YYYY-MONTH-DD lcase&#8217;) as Date</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>　　2009-january-12</p>
<p>　　场景19</p>
<p>　　如果你不传递参数，那么这个函数使用默认的格式化日期和时间的方法。执行下面的命令：</p>
<p>　　select dbo.format_date(NULL,NULL)</p>
<p>　　select dbo.format_date(NULL,&#8217;YYYY&#8217;)</p>
<p>　　select dbo.format_date(getdate(),NULL)</p>
<p>　　结果：</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　2009-01-12 11:29:17 PM</p>
<p>　　Year</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　2009</p>
<p>　　Date</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>　　2009-01-12 11:29:17 PM</p>
<p>　　这篇文章介绍了怎样创建一个命令函数来获得不同国家和应用程序所要求的大多数日期格式。</p>
<p><a href="http://17fav.com/?url=http%3A%2F%2Fwww.kaixinbc.com%2F2010%2F01%2Fsql-server-2008.html&title=SQL+Server+2008%E4%B8%AD%E7%9A%84%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%97%A5%E6%9C%9F" title="用 17fav 收藏和分享本文"><img src="http://17fav.com/i/bookmark.gif" alt="17fav 收藏本文" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.kaixinbc.com/2010/01/sql-server-2008.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
