﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-空谷回音</title><link>http://www.blogjava.net/cymao/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 07:54:18 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 07:54:18 GMT</pubDate><ttl>60</ttl><item><title>DBA的职责和任务(转自oracle中文技术论坛)</title><link>http://www.blogjava.net/cymao/archive/2006/03/30/38289.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Thu, 30 Mar 2006 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/03/30/38289.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/38289.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/03/30/38289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/38289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/38289.html</trackback:ping><description><![CDATA[
		<font size="2">载自oracle中文技术论坛。从整体上介绍了一个dba的职责和任务等等。　　 <br />ORACLE数据库管理员应按如下方式对ORACLE数据库系统做定期监控：  <br />(1). 每天对ORACLE数据库的运行状态,日志文件,备份情况,数据  <br /><br />库的空间使用情况,系统资源的使用情况进行检查,发现并解决  <br /><br />问题。  <br /><br />(2). 每周对数据库对象的空间扩展情况,数据的增长情况进行监控,对数据库做健康检查,对数据库对象的状态做检查。  <br /><br />(3). 每月对表和索引等进行Analyze,检查表空间碎片,寻找数据库  <br /><br />性能调整的机会,进行数据库性能调整,提出下一步空间管理  <br /><br />计划。对ORACLE数据库状态进行一次全面检查。  <br /><br />每天的工作  <br /><br />(1).确认所有的INSTANCE状态正常  <br /><br />登陆到所有数据库或例程,检测ORACLE后台进程:  <br /><br />$ps –ef|grep ora  <br /><br />(2). 检查文件系统的使用（剩余空间）。如果文件系统的剩余空间小于20%，需删除不用的文件以释放空间。  <br /><br />$df –k  <br /><br />(3). 检查日志文件和trace文件记录alert和trace文件中的错误。  <br /><br />连接到每个需管理的系统  <br /><br />? 使用’telnet’  <br /><br />? 对每个数据库,cd 到bdump目录,通常是$ORACLE_BASE/&lt;SID&gt;;/bdump  <br /><br />? 使用 Unix ‘tail’命令来查看alert_&lt;SID&gt;;.log文件  <br /><br />? 如果发现任何新的ORA- 错误,记录并解决  <br /><br />(4). 检查数据库当日备份的有效性。  <br /><br />对RMAN备份方式:  <br /><br />检查第三方备份工具的备份日志以确定备份是否成功  <br /><br />对EXPORT备份方式:  <br /><br />检查exp日志文件以确定备份是否成功  <br /><br />对其他备份方式:  <br /><br />检查相应的日志文件  <br /><br />(5). 检查数据文件的状态记录状态不是“online”的数据文件，并做恢复。  <br /><br />Select file_name from dba_data_files where status=’OFFLINE’  <br /><br />(6). 检查表空间的使用情况  <br /><br />SELECT tablespace_name, max_m, count_blocks free_blk_cnt, sum_free_m,to_char(100*sum_free_m/sum_m, '99.99') || '%' AS pct_free  <br /><br />FROM ( SELECT tablespace_name,sum(bytes)/1024/1024 AS sum_m FROM dba_data_files GROUP BY tablespace_name),  <br /><br />( SELECT tablespace_name AS fs_ts_name, max(bytes)/1024/1024 AS max_m, count(blocks) AS count_blocks, sum(bytes/1024/1024) AS sum_free_m FROM dba_free_space GROUP BY tablespace_name )  <br /><br />WHERE tablespace_name = fs_ts_name  <br /><br />(7). 检查剩余表空间  <br /><br />SELECT tablespace_name, sum ( blocks ) as free_blk ,  <br /><br />trunc ( sum ( bytes ) /(1024*1024) ) as free_m,  <br /><br />max ( bytes ) / (1024) as big_chunk_k, count (*) as num_chunks  <br /><br />FROM dba_free_space GROUP BY tablespace_name;  <br /><br />(<img src="http://bbs.chinaunix.net/images/smilies/icon_cool.gif" align="absMiddle" border="0" />. 监控数据库性能  <br /><br />运行bstat/estat生成系统报告  <br /><br />或者使用statspack收集统计数据  <br /><br />(9). 检查数据库性能，记录数据库的cpu使用、IO、buffer命中率等等  <br /><br />使用vmstat,iostat,glance,top等命令  <br /><br />(10). 日常出现问题的处理。  <br /><br />每周的工作  <br /><br />(1). 控数据库对象的空间扩展情况  <br /><br />根据本周每天的检查情况找到空间扩展很快的数据库对象,并采取相  <br /><br />应的措施  <br /><br />-- 删除历史数据  <br /><br />--- 扩表空间  <br /><br />alter tablespace &lt;name&gt;; add datafile ‘&lt;file&gt;;’ size &lt;size&gt;;  <br /><br />--- 调整数据对象的存储参数  <br /><br />next extent  <br /><br />pct_increase  <br /><br />(2). 监控数据量的增长情况  <br /><br />根据本周每天的检查情况找到记录数量增长很快的数据库对象,并采  <br /><br />取相应的措施  <br /><br />-- 删除历史数据  <br /><br />--- 扩表空间  <br /><br />alter tablespace &lt;name&gt;; add datafile ‘&lt;file&gt;;’ size &lt;size&gt;;  <br /><br />(3). 系统健康检查  <br /><br />检查以下内容:  <br /><br />init&lt;sid&gt;;.ora  <br /><br />controlfile  <br /><br />redo log file  <br /><br />archiving  <br /><br />sort area size  <br /><br />tablespace(system,temporary,tablespace fragment)  <br /><br />datafiles(autoextend,location)  <br /><br />object(number of extent,next extent,index)  <br /><br />rollback segment  <br /><br />logging &amp;tracing(alert.log,max_dump_file_size,sqlnet)  <br /><br />(4). 检查无效的数据库对象  <br /><br />SELECT owner, object_name, object_type FROM dba_objects  <br /><br />WHERE status=’INVALID’。  <br /><br />(5). 检查不起作用的约束  <br /><br />SELECT owner, constraint_name, table_name,  <br /><br />constraint_type, status  <br /><br />FROM dba_constraints  <br /><br />WHERE status = 'DISABLED’ AND constraint_type = 'P'  <br /><br />(6). 检查无效的trigger  <br /><br />SELECT owner, trigger_name, table_name, status  <br /><br />FROM dba_triggers  <br /><br />WHERE status = 'DISABLED’  <br /><br />每月的工作  <br /><br />(1). Analyze Tables/Indexes/Cluster  <br /><br />analyze table &lt;name&gt;; estimate statistics sample 50 percent;  <br /><br />(2). 检查表空间碎片  <br /><br />根据本月每周的检查分析数据库碎片情况,找到相应的解决方法  <br /><br />(3). 寻找数据库性能调整的机会  <br /><br />比较每天对数据库性能的监控报告,确定是否有必要对数据库性能进 行调整  <br /><br />(4). 数据库性能调整  <br /><br />如有必要,进行性能调整  <br /><br />(5). 提出下一步空间管理计划  <br /><br />根据每周的监控,提出空间管理的改进方法  <br /><br />Oracle DBA 日常管理  <br /><br />目的：这篇文档有很详细的资料记录着对一个甚至更多的ORACLE 数据库每天的，每月的，  <br /><br />每年的运行的状态的结果及检查的结果，在文档的附录中你将会看到所有检查，修改的SQL  <br /><br />和PL/SQL 代码。  <br /><br />目录  <br /><br />1.日常维护程序  <br /><br />A． 检查已起的所有实例  <br /><br />B． 查找一些新的警告日志  <br /><br />C． 检查DBSNMP 是否在运行  <br /><br />D． 检查数据库备份是否正确  <br /><br />E． 检查备份到磁带中的文件是否正确  <br /><br />F． 检查数据库的性能是否正常合理，是否有足够的空间和资源  <br /><br />G． 将文档日志复制到备份的数据库中  <br /><br />H． 要常看DBA 用户手册  <br /><br />2.晚间维护程序  <br /><br />A．收集VOLUMETRIC 的数据  <br /><br />3.每周维护工作  <br /><br />A． 查找那些破坏规则的OBJECT  <br /><br />B． 查找是否有违反安全策略的问题  <br /><br />C． 查看错误地方的SQL*NET 日志  <br /><br />D． 将所有的警告日志存档  <br /><br />E． 经常访问供应商的主页  <br /><br />4.月维护程序  <br /><br />A． 查看对数据库会产生危害的增长速度  <br /><br />B． 回顾以前数据库优化性能的调整  <br /><br />C． 查看I/O 的屏颈问题  <br /><br />D． 回顾FRAGMENTATION  <br /><br />E． 将来的执行计划  <br /><br />F． 查看调整点和维护  <br /><br />5.附录  <br /><br />A． 月维护过程  <br /><br />B． 晚间维护过程  <br /><br />C． 周维护过程  <br /><br />6.参考文献  <br /><br />----------------------------------------------------------------  <br /><br />一．日维护过程  <br /><br />A．查看所有的实例是否已起  <br /><br />确定数据库是可用的，把每个实例写入日志并且运行日报告或是运行测试  <br /><br />文件。当然有一些操作我们是希望它能自动运行的。  <br /><br />可选择执行：用ORACLE 管理器中的‘PROBE’事件来查看  <br /><br />B．查找新的警告日志文件  <br /><br />1. 联接每一个操作管理系统  <br /><br />2. 使用‘TELNET’或是可比较程序  <br /><br />3. 对每一个管理实例，经常的执行$ORACLE_BASE/&lt;SID&gt;;/bdump 操  <br /><br />作，并使其能回退到控制数据库的SID。  <br /><br />4. 在提示下，使用UNIX 中的‘TAIL’命令查看alert_&lt;SID&gt;;.log，或是  <br /><br />用其他方式检查文件中最近时期的警告日志  <br /><br />5. 如果以前出现过的一些ORA_ERRORS 又出现，将它记录到数据库  <br /><br />恢复日志中并且仔细的研究它们，这个数据库恢复日志在〈FILE〉中  <br /><br />C．查看DBSNMP 的运行情况  <br /><br />检查每个被管理机器的‘DBSNMP’进程并将它们记录到日志中。  <br /><br />在UNIX 中，在命令行中，键入ps –ef | grep dbsnmp,将回看到2 个  <br /><br />DBSNMP 进程在运行。如果没有，重启DBSNMP。  <br /><br />D．查数据库备份是否成功  <br /><br />E．检查备份的磁带文档是否成功  <br /><br />F．检查对合理的性能来说是否有足够的资源  <br /><br />1. 检查在表空间中有没有剩余空间。  <br /><br />对每一个实例来说，检查在表空间中是否存在有剩余空间来满足当天  <br /><br />的预期的需要。当数据库中已有的数据是稳定的，数据日增长的平均  <br /><br />数也是可以计算出来，最小的剩余空间至少要能满足每天数据的增 长。  <br /><br />A） 运行‘FREE.SQL’来检查表空间的剩余空间。  <br /><br />B） 运行‘SPACE.SQL’来检查表空间中的剩余空间百分率  <br /><br />2. 检查回滚段  <br /><br />回滚段的状态一般是在线的，除了一些为复杂工作准备的专用 段，它一般状态是离线的。  <br /><br />a) 每个数据库都有一个回滚段名字的列表。  <br /><br />b) 你可以用V$ROLLSTAT 来查询在线或是离线的回滚段的现在状 态.  <br /><br />c) 对于所有回滚段的存储参数及名字， 可用  <br /><br />DBA_ROLLBACK_SEGS 来查询。但是它不如V$ROLLSTAT 准确。  <br /><br />3. 识别出一些过分的增长  <br /><br />查看数据库中超出资源或是增长速度过大的段，这些段的存储参 数需要调整。  <br /><br />a） 收集日数据大小的信息， 可以用  <br /><br />‘ANALYZE5PCT.SQL’。如果你收集的是每晚的信息， 则可跳过这一步。  <br /><br />b） 检查当前的范围，可用‘NR.EXTENTS.SQL’。  <br /><br />c） 查询当前表的大小信息。  <br /><br />d） 查询当前索引大小的信息。  <br /><br />e） 查询增长趋势。  <br /><br />4. 确定空间的范围。  <br /><br />如果范围空间对象的NEXT_EXTENT 比表空间所能提供的最大范  <br /><br />围还要大，那么这将影响数据库的运行。如果我们找到了这个目标，可  <br /><br />以用‘ALTER TABLESPACE COALESCE’调查它的位置，或加另外 的数据文件。  <br /><br />A）运行‘SPACEBOUND.SQL’。如果都是正常的，将不返回任何行。  <br /><br />5. 回顾CPU，内存，网络，硬件资源论点的过程  <br /><br />A）检查CPU的利用情况，进到x:.htm =&gt;;system  <br /><br />metrics=&gt;;CPU 利用页，CPU 的最大限度为400，当CPU 的占用保持  <br /><br />在350 以上有一段时间的话，我们就需要查看及研究出现的问题。  <br /><br />G．将存档日志复制到备用数据库中  <br /><br />如果有一个备用数据库，将适当的存档日志复制到备用数据库的期望  <br /><br />位置，备用数据库中保存最近期的数据。  <br /><br />H. 经常查阅DBA 用户手册  <br /><br />如果有可能的话，要广泛的阅读，包括DBA 手册，行业杂志，新闻 组或是邮件列表。  <br /><br />-------------------------------------------------------------  <br /><br />二．晚间维护过程  <br /><br />大部分的数据库产品将受益于每晚确定的检查进程的运行。  <br /><br />A. 收集VOLUMETRIC 数据  <br /><br />1. 分析计划和收集数据  <br /><br />更准确的分析计算并保存结果。  <br /><br />a） 如果你现在没有作这些的话，用‘MK VOLFACT.SQL’来创建测定体积的 表。  <br /><br />b） 收集晚间数据大小的信息，用‘ANALYZE COMP.SQL’。  <br /><br />c） 收集统计结果，用‘POP VOL.SQL’。  <br /><br />d） 在空闲的时候检查数据，可能的话，每周或每个月进行。  <br /><br />我是用MS EXCEL 和ODBC 的联接来检查数据和图表的增长  <br /><br />-------------------------------------------------------------  <br /><br />三．每周维护过程  <br /><br />A． 查找被破坏的目标  <br /><br />1. 对于每个给定表空间的对象来说，NEXT_EXTENT 的大小是相同的，如  <br /><br />12/14/98，缺省的NEXT_EXTENT 的DATAHI 为1G，DATALO 为500MB，  <br /><br />INDEXES 为256MB。  <br /><br />A） 检查NEXT_EXTENT 的设置，可用‘NEXTEXT。SQL’。  <br /><br />B） 检查已有的EXTENTS，可用‘EXISTEXT。SQL’。  <br /><br />2. 所有的表都应该有唯一的主键  <br /><br />a） 查看那些表没有主键，可用‘NO_PK.SQL’。  <br /><br />b） 查找那些主键是没有发挥作用的，可用‘DIS_PK.SQL’。  <br /><br />c） 所有作索引的主键都要是唯一的，可用‘ NONUPK。SQL’来检 查。  <br /><br />3. 所有的索引都要放到索引表空间中。运行‘MKREBUILD_IDX。SQL’  <br /><br />4. 不同的环境之间的计划应该是同样的，特别是测试环境和成品环境之间的 计划应该相同。  <br /><br />a） 检查不同的2 个运行环境中的数据类型是否一致，可用  <br /><br />‘DATATYPE.SQL’。  <br /><br />b） 在2 个不同的实例中寻找对象的不同点， 可用  <br /><br />‘OBJ_COORD.SQL’。  <br /><br />c） 更好的做法是，使用一种工具，象寻求软件的计划管理器那样的 工具。  <br /><br />B． 查看是否有危害到安全策略的问题。  <br /><br />C． 查看报错的SQL*NET 日志。  <br /><br />1. 客户端的日志。  <br /><br />2. 服务器端的日志。  <br /><br />D．.将所有的警告日志存档  <br /><br />E．.供应商的主页  <br /><br />1. ORACLE 供应商  <br /><br />http://www.oracle.com  <br /><br />http://technet.oracle.com  <br /><br />http://www.oracle.com/support  <br /><br />http://www.oramag.com  <br /><br />2. Quest Software  <br /><br />http://www.quests.com  <br /><br />3. Sun Microsystems  <br /><br />http://www.sun.com  <br /><br />----------------------------------------------------------------  <br /><br />四．月维护过程  <br /><br />A．查看对数据库会产生危害的增长速度  <br /><br />1. 从以前的记录或报告中回顾段增长的变化以此来确定段增长带来危害  <br /><br />B． 回顾以前数据库优化性能的调整  <br /><br />1. 回顾一般ORACLE 数据库的调整点，比较以前的报告来确定有害的发展 趋势。  <br /><br />C． 查看I/O 的屏颈问题  <br /><br />1. 查看前期数据库文件的活动性，比较以前的输出来判断有可能导致屏颈 问题的趋势。  <br /><br />D． 回顾FRAGMENTATION  <br /><br />E． 计划数据库将来的性能  <br /><br />1. 比较ORACLE 和操作系统的CPU，内存，网络，及硬盘的利用率以此  <br /><br />来确定在近期将会有的一些资源争夺的趋势  <br /><br />2. 当系统将超出范围时要把性能趋势当作服务水平的协议来看  <br /><br />F． 完成调整和维护工作  <br /><br />1.使修改满足避免系统资源的争夺的需要，这里面包括增加新资源或使预期 的停工。  <br /><br />----------------------------------------------------------------  <br /><br />五．附录  <br /><br />A. 日常程序  <br /><br />-- free.sql  <br /><br />--To verify free space in tablespaces  <br /><br />--Minimum amount of free space  <br /><br />--document your thresholds:  <br /><br />--&lt;tablespace_name&gt;; = &lt;amount&gt;; m  <br /><br />SELECT tablespace_name, sum ( blocks ) as free_blk , trunc ( sum ( bytes ) /  <br /><br />(1024*1024) ) as free_m, max ( bytes ) / (1024) as big_chunk_k, count (*) as num_chunks  <br /><br />FROM dba_free_space GROUP BY tablespace_name  <br /><br />1. Space.sql  <br /><br />-- space.sql  <br /><br />-- To check free, pct_free, and allocated space within a tablespace  <br /><br />-- 11/24/98  <br /><br />SELECT tablespace_name, largest_free_chunk  <br /><br />, nr_free_chunks, sum_alloc_blocks, sum_free_blocks  <br /><br />, to_char(100*sum_free_blocks/sum_alloc_blocks, '09.99') || '%'  <br /><br />AS pct_free  <br /><br />FROM ( SELECT tablespace_name , sum(blocks) AS sum_alloc_blocks  <br /><br />FROM dba_data_files GROUP BY tablespace_name )  <br /><br />, ( SELECT tablespace_name AS fs_ts_name  <br /><br />, max(blocks) AS largest_free_chunk  <br /><br />, count(blocks) AS nr_free_chunks  <br /><br />, sum(blocks) AS sum_free_blocks FROM dba_free_space  <br /><br />GROUP BY tablespace_name ) WHERE tablespace_name = fs_ts_name  <br /><br />2. analyze5pct.sql  <br /><br />-- analyze5pct.sql  <br /><br />-- To analyze tables and indexes quickly, using a 5% sample size  <br /><br />-- (do not use this script if you are performing the overnight  <br /><br />-- collection of volumetric data)  <br /><br />-- 11/30/98  <br /><br />BEGIN  <br /><br />dbms_utility.analyze_schema ( '&amp;OWNER', 'ESTIMATE', NULL, 5 ) ;  <br /><br />END ;  <br /><br />/  <br /><br />3. nr_extents.sql  <br /><br />-- nr_extents.sql  <br /><br />-- To find out any object reaching &lt;threshold&gt;;  <br /><br />-- extents, and manually upgrade it to allow unlimited  <br /><br />-- max_extents (thus only objects we *expect* to be big  <br /><br />-- are allowed to become big)  <br /><br />-- 11/30/98  <br /><br />SELECT e.owner, e.segment_type , e.segment_name , count(*) as nr_extents ,  <br /><br />s.max_extents  <br /><br />, to_char ( sum ( e.bytes ) / ( 1024 * 1024 ) , '999,999.90') as MB  <br /><br />FROM dba_extents e , dba_segments s  <br /><br />WHERE e.segment_name = s.segment_name  <br /><br />GROUP BY e.owner, e.segment_type , e.segment_name , s.max_extents  <br /><br />HAVING count(*) &gt;; &amp;THRESHOLD  <br /><br />OR ( ( s.max_extents - count(*) ) &lt; &amp;&amp;THRESHOLD )  <br /><br />ORDER BY count(*) desc  <br /><br />4. spacebound.sql  <br /><br />-- spacebound.sql  <br /><br />-- To identify space-bound objects. If all is well, no rows are returned.  <br /><br />-- If any space-bound objects are found, look at value of NEXT extent  <br /><br />-- size to figure out what happened.  <br /><br />-- Then use coalesce (alter tablespace &lt;foo&gt;; coalesce .  <br /><br />-- Lastly, add another datafile to the tablespace if needed.  <br /><br />-- 11/30/98  <br /><br />SELECT a.table_name, a.next_extent, a.tablespace_name  <br /><br />FROM all_tables a,  <br /><br />( SELECT tablespace_name, max(bytes) as big_chunk  <br /><br />FROM dba_free_space  <br /><br />GROUP BY tablespace_name ) f  <br /><br />WHERE f.tablespace_name = a.tablespace_name  <br /><br />AND a.next_extent &gt;; f.big_chunk  <br /><br />B. 每晚处理程序  <br /><br />1. mk_volfact.sql  <br /><br />-- mk_volfact.sql (only run this once to set it up; do not run it nightly!)  <br /><br />-- -- Table UTL_VOL_FACTS  <br /><br />CREATE TABLE utl_vol_facts (  <br /><br />table_name VARCHAR2(30),  <br /><br />num_rows NUMBER,  <br /><br />meas_dt DATE )  <br /><br />TABLESPACE platab  <br /><br />STORAGE (  <br /><br />INITIAL 128k  <br /><br />NEXT 128k  <br /><br />PCTINCREASE 0  <br /><br />MINEXTENTS 1  <br /><br />MAXEXTENTS unlimited  <br /><br />)  <br /><br />/  <br /><br />-- Public Synonym  <br /><br />CREATE PUBLIC SYNONYM utl_vol_facts FOR &amp;OWNER..utl_vol_facts  <br /><br />/  <br /><br />-- Grants for UTL_VOL_FACTS  <br /><br />GRANT SELECT ON utl_vol_facts TO public  <br /><br />/  <br /><br />2. analyze_comp.sql  <br /><br />--  <br /><br />-- analyze_comp.sql  <br /><br />--  <br /><br />BEGIN  <br /><br />sys.dbms_utility.analyze_schema ( '&amp;OWNER','COMPUTE');  <br /><br />END ;  <br /><br />/  <br /><br />3. pop_vol.sql  <br /><br />--  <br /><br />-- pop_vol.sql  <br /><br />--  <br /><br />insert into utl_vol_facts  <br /><br />select table_name  <br /><br />, NVL ( num_rows, 0) as num_rows  <br /><br />, trunc ( last_analyzed ) as meas_dt  <br /><br />from all_tables -- or just user_tables  <br /><br />where owner in ('&amp;OWNER') -- or a comma-separated list of owners  <br /><br />/  <br /><br />commit  <br /><br />/  <br /><br />　  <br /><br />C. 每周处理程序  <br /><br />1. nextext.sql  <br /><br />--  <br /><br />-- nextext.sql  <br /><br />--  <br /><br />-- To find tables that don't match the tablespace default for NEXT extent.  <br /><br />-- The implicit rule here is that every table in a given tablespace should  <br /><br />-- use the exact same value for NEXT, which should also be the tablespace's  <br /><br />-- default value for NEXT.  <br /><br />--  <br /><br />-- This tells us what the setting for NEXT is for these objects today.  <br /><br />--  <br /><br />-- 11/30/98  <br /><br />SELECT segment_name, segment_type, ds.next_extent as Actual_Next  <br /><br />, dt.tablespace_name, dt.next_extent as Default_Next  <br /><br />FROM dba_tablespaces dt, dba_segments ds  <br /><br />WHERE dt.tablespace_name = ds.tablespace_name  <br /><br />AND dt.next_extent !=ds.next_extent  <br /><br />AND ds.owner = UPPER ( '&amp;OWNER' )  <br /><br />ORDER BY tablespace_name, segment_type, segment_name  <br /><br />2. existext.sql  <br /><br />--  <br /><br />-- existext.sql  <br /><br />--  <br /><br />-- To check existing extents  <br /><br />--  <br /><br />-- This tells us how many of each object's extents differ in size from  <br /><br />-- the tablespace's default size. If this report shows a lot of different  <br /><br />-- sized extents, your free space is likely to become fragmented. If so,  <br /><br />-- this tablespace is a candidate for reorganizing.  <br /><br />--  <br /><br />-- 12/15/98  <br /><br />SELECT segment_name, segment_type  <br /><br />, count(*) as nr_exts  <br /><br />, sum ( DECODE ( dx.bytes,dt.next_extent,0,1) ) as nr_illsized_exts  <br /><br />, dt.tablespace_name, dt.next_extent as dflt_ext_size  <br /><br />FROM dba_tablespaces dt, dba_extents dx  <br /><br />WHERE dt.tablespace_name = dx.tablespace_name  <br /><br />AND dx.owner = '&amp;OWNER'  <br /><br />GROUP BY segment_name, segment_type, dt.tablespace_name, dt.next_extent  <br /><br />3. No_pk.sql  <br /><br />--  <br /><br />-- no_pk.sql  <br /><br />--  <br /><br />-- To find tables without PK constraint  <br /><br />--  <br /><br />-- 11/2/98  <br /><br />SELECT table_name  <br /><br />FROM all_tables  <br /><br />WHERE owner = '&amp;OWNER'  <br /><br />MINUS  <br /><br />SELECT table_name  <br /><br />FROM all_constraints  <br /><br />WHERE owner = '&amp;&amp;OWNER'  <br /><br />AND constraint_type = 'P'  <br /><br />4. disPK.sql  <br /><br />--  <br /><br />-- disPK.sql  <br /><br />--  <br /><br />-- To find out which primary keys are disabled  <br /><br />--  <br /><br />-- 11/30/98  <br /><br />SELECT owner, constraint_name, table_name, status  <br /><br />FROM all_constraints  <br /><br />WHERE owner = '&amp;OWNER' AND status = 'DISABLED’ AND constraint_type = 'P'  <br /><br />5. nonuPK.sql  <br /><br />--  <br /><br />-- nonuPK.sql  <br /><br />--  <br /><br />-- To find tables with nonunique PK indexes. Requires that PK names  <br /><br />-- follow a naming convention. An alternative query follows that  <br /><br />-- does not have this requirement, but runs more slowly.  <br /><br />--  <br /><br />-- 11/2/98  <br /><br />SELECT index_name, table_name, uniqueness  <br /><br />FROM all_indexes  <br /><br />WHERE index_name like '&amp;<img src="http://bbs.chinaunix.net/images/smilies/titter.gif" align="absMiddle" border="0" />KNAME%'  <br /><br />AND owner = '&amp;OWNER' AND uniqueness = 'NONUNIQUE'  <br /><br />SELECT c.constraint_name, i.tablespace_name, i.uniqueness  <br /><br />FROM all_constraints c , all_indexes i  <br /><br />WHERE c.owner = UPPER ( '&amp;OWNER' ) AND i.uniqueness = 'NONUNIQUE'  <br /><br />AND c.constraint_type = 'P' AND i.index_name = c.constraint_name  <br /><br />6. mkrebuild_idx.sql  <br /><br />--  <br /><br />-- mkrebuild_idx.sql  <br /><br />--  <br /><br />-- Rebuild indexes to have correct storage parameters  <br /><br />--  <br /><br />-- 11/2/98  <br /><br />SELECT 'alter index ' || index_name || ' rebuild '  <br /><br />, 'tablespace INDEXES storage '  <br /><br />|| ' ( initial 256 K next 256 K pctincrease 0 ) ; '  <br /><br />FROM all_indexes  <br /><br />WHERE ( tablespace_name != 'INDEXES'  <br /><br />OR next_extent != ( 256 * 1024 )  <br /><br />)  <br /><br />AND owner = '&amp;OWNER'  <br /><br />/  <br /><br />7. datatype.sql  <br /><br />--  <br /><br />-- datatype.sql  <br /><br />--  <br /><br />-- To check datatype consistency between two environments  <br /><br />--  <br /><br />-- 11/30/98  <br /><br />SELECT  <br /><br />table_name,  <br /><br />column_name,  <br /><br />data_type,  <br /><br />data_length,  <br /><br />data_precision,  <br /><br />data_scale,  <br /><br />nullable  <br /><br />FROM all_tab_columns -- first environment  <br /><br />WHERE owner = '&amp;OWNER'  <br /><br />MINUS  <br /><br />SELECT  <br /><br />table_name,  <br /><br />column_name,  <br /><br />data_type,  <br /><br />data_length,  <br /><br />data_precision,  <br /><br />data_scale,  <br /><br />nullable  <br /><br />FROM all_tab_columns@&amp;my_db_link -- second environment  <br /><br />WHERE owner = '&amp;OWNER2'  <br /><br />order by table_name, column_name  <br /><br />8. obj_coord.sql  <br /><br />--  <br /><br />-- obj_coord.sql  <br /><br />--  <br /><br />-- To find out any difference in objects between two instances  <br /><br />--  <br /><br />-- 12/08/98  <br /><br />SELECT object_name, object_type  <br /><br />FROM user_objects  <br /><br />MINUS  <br /><br />SELECT object_name, object_type  <br /><br />FROM user_objects@&amp;my_db_link  <br /><br />六. 参考文献  <br /><br />1. Loney, Kevin Oracle8 DBA Handbook  <br /><br />2. Cook, David Database Management from Crisis to Confidence  <br /><br />[http://www.orapub.com/]  <br /><br />3. Cox, Thomas B. The Database Administration Maturity Model</font>
		<br />
<img src ="http://www.blogjava.net/cymao/aggbug/38289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-03-30 17:19 <a href="http://www.blogjava.net/cymao/archive/2006/03/30/38289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Oracle高手必读</title><link>http://www.blogjava.net/cymao/archive/2006/03/30/38280.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Thu, 30 Mar 2006 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/03/30/38280.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/38280.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/03/30/38280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/38280.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/38280.html</trackback:ping><description><![CDATA[
		<span style="FONT-SIZE: 13px">1. 删除表的注意事项  <br />在删除一个表中的全部数据时，须使用TRUNCATE TABLE 表名;因为用DROP TABLE，DELETE * FROM 表名时，TABLESPACE表空间该表的占用空间并未释放，反复几次DROP，DELETE操作后，该TABLESPACE上百兆的空间就被耗光了。  <br /><br />2.having 子句的用法  <br />　　having 子句对 group by 子句所确定的行组进行控制,having 子句条件中只允许涉及常量,聚组函数或group by 子句中的列.  <br /><br />3.外部联接"+"的用法  <br />　　外部联接"+"按其在"="的左边或右边分左联接和右联接.若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回.若二者均不带’+’,则二者中无法匹配的均被返回.利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度.例如,下面这条命令执行起来很慢  <br /><br />用外联接提高表连接的查询速度  <br />在作表连接(常用于视图)时，常使用以下方法来查询数据:  <br />SELECT PAY_NO, PROJECT_NAME  <br />FROM A  <br />WHERE A.PAY_NO NOT IN (SELECT PAY_  <br />NO FROM B WHERE VALUE &gt;;=120000);  <br />---- 但是若表A有10000条记录，表B有10000条记录，则要用掉30分钟才能查完，主要因为NOT IN要进行一条一条的比较，共需要10000*10000次比较后，才能得到结果。该用外联接后，可以缩短到1分左右的时间:  <br />SELECT PAY_NO,PROJECT_NAME  <br />FROM A,B  <br />WHERE A.PAY_NO=B.PAY_NO(+)  <br />AND B.PAY_NO IS NULL  <br />AND B.VALUE &gt;;=12000;  <br /><br /><br />4.set transaction 命令的用法  <br />在执行大事务时,有时oracle会报出如下的错误:  <br />ORA-01555:snapshot too old (rollback segment too small)  <br />　　这说明oracle给此事务随机分配的回滚段太小了,这时可以为它指定一个足够大的回滚段,以确保这个事务的成功执行.例如  <br /><br />set transaction use rollback segment roll_abc;  <br />delete from table_name where ...  <br />commit;  <br />　　回滚段roll_abc被指定给这个delete事务,commit命令则在事务结束之后取消了回滚段的指定.  <br /><br /><br />5.数据库重建应注意的问题  <br /><br />　　在利用import进行数据库重建过程中,有些视图可能会带来问题,因为结构输入的顺序可能造成视图的输入先于它低层次表的输入,这样建立视图就会失败.要解决这一问题,可采取分两步走的方法:首先输入结构,然后输入数据.命令举例如下 (uesrname:jfcl,password:hfjf,host sting<img src="http://bbs.chinaunix.net/images/smilies/icon_surprised.gif" align="absMiddle" border="0" />ra1,数据文件:expdata.dmp):  <br /><br />imp jfcl/hfjf@ora1 file=empdata.dmp rows=N  <br /><br />imp jfcl/hfjf@ora1 file=empdata.dmp full=Y buffer=64000  <br /><br />commit=Y ignore=Y  <br /><br />　　第一条命令输入所有数据库结构,但无记录.第二次输入结构和数据,64000字节提交一次.ignore=Y选项保证第二次输入既使对象存在的情况下也能成功.  <br /><br />select a.empno from emp a where a.empno not in  <br /><br />(select empno from emp1 where job=’SALE’);  <br /><br />　　倘若利用外部联接,改写命令如下:  <br /><br />select a.empno from emp a ,emp1 b  <br /><br />where a.empno=b.empno(+)  <br /><br />and b.empno is null  <br /><br />and b.job=’SALE’;  <br /><br />　　可以发现,运行速度明显提高.  <br /><br /><br />6.从已知表新建另一个表：  <br />CREATE TABLE b  <br />AS SELECT * (可以是表a中的几列)  <br />FROM a  <br />WHERE a.column = ...;  <br /><br /><br />7.查找、删除重复记录:  <br /><br />法一: 用Group by语句 此查找很快的  <br />select count(num), max(name) from student --查找表中num列重复的，列出重复的记录数，并列出他的name属性  <br />group by num  <br />having count(num) &gt;;1 --按num分组后找出表中num列重复，即出现次数大于一次  <br /><br />delete from student(上面Select的)  <br />这样的话就把所有重复的都删除了。-----慎重  <br /><br />法二:当表比较大(例如10万条以上)时,这个方法的效率之差令人无法忍受,需要另想办法:  <br />---- 执行下面SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录  <br />SELECT * FROM EM5_PIPE_PREFAB  <br />WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D --D相当于First,Second  <br />WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND  <br />EM5_PIPE_PREFAB.DSNO=D.DSNO);  <br /><br />---- 执行下面SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录  <br />DELETE FROM EM5_PIPE_PREFAB  <br />WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D  <br />WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND  <br />EM5_PIPE_PREFAB.DSNO=D.DSNO);  <br /><br />8.返回表中[N，M]条记录：  <br /><br />取得某列中第N大的行  <br />select column_name from  <br />(select table_name.*,dense_rank() over (order by column desc) rank from table_name)  <br />where rank = &amp;N；  <br /><br />　假如要返回前5条记录：  <br />　　select * from tablename where rownum&lt;6;(或是rownum &lt;= 5 或是rownum != 6)  <br />假如要返回第5-9条记录：  <br />select * from tablename  <br />where …  <br />and rownum&lt;10  <br />minus  <br />select * from tablename  <br />where …  <br />and rownum&lt;５  <br />order by name  <br />　选出结果后用name排序显示结果。(先选再排序)  <br /><br />注意：只能用以上符号(&lt;、&lt;=、!=)。  <br />select * from tablename where rownum != 10;返回的是前９条记录。  <br />不能用：&gt;;,&gt;;=,=,Between...and。由于rownum是一个总是从1开始的伪列，Oracle 认为这种条件 不成立，查不到记录.  <br /><br />另外，这个方法更快：  <br />select * from (  <br />select rownum r,a from yourtable  <br />where rownum &lt;= 20  <br />order by name )  <br />where r &gt;; 10  <br />这样取出第11-20条记录!(先选再排序再选)  <br />要先排序再选则须用select嵌套：内层排序外层选。  <br /><br />rownum是随着结果集生成的，一旦生成，就不会变化了；同时,生成的结果是依次递加的，没有1就永远不会有2!  <br />rownum 是在 查询集合产生的过程中产生的伪列，并且如果where条件中存在 rownum 条件的话，则:  <br />1： 假如 判定条件是常量，则：  <br />只能 rownum = 1, &lt;= 大于1 的自然数， = 大于1 的数是没有结果的， 大于一个数也是没有结果的  <br />即 当出现一个 rownum 不满足条件的时候则 查询结束 　　this is stop key!  <br />2: 当判定值不是常量的时候  <br />若条件是 = var , 则只有当 var 为1 的时候才满足条件，这个时候不存在 stop key ,必须进行 full scan ,对每个满足其他where条件的数据进行判定  <br />选出一行后才能去选rownum=2的行……  <br /><br /><br />9.快速编译所有视图  <br /><br />---- 当在把数据库倒入到新的服务器上后(数据库重建)，需要将视图重新编译一遍，因为该表空间视图到其它表空间的表的连接会出现问题，可以利用PL/SQL的语言特性，快速编译。  <br />SQL &gt;;SPOOL ON.SQL  <br />SQL &gt;;SELECT ‘ALTER VIEW ‘||TNAME||’  <br />COMPILE;’ FROM TAB;  <br />SQL &gt;;SPOOL OFF  <br />然后执行ON.SQL即可。  <br />SQL &gt;;@ON.SQL  <br />当然，授权和创建同义词也可以快速进行，如：  <br />SQL &gt;;SELECT ‘GRANT SELECT ON ’  <br />||TNAME||’ TO USERNAME;’ FROM TAB;  <br />SQL &gt;;SELECT ‘CREATE SYNONYM  <br />‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB;  <br /><br /><br />10.读写文本型操作系统文件  <br />---- 在PL/SQL 3.3以上的版本中，UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下：  <br /><br />DECALRE  <br />FILE_HANDLE UTL_FILE.FILE_TYPE;  <br />BEGIN  <br />FILE_HANDLE:=UTL_FILE.FOPEN(  <br />‘C:\’,’TEST.TXT’,’A’);  <br />UTL_FILE.PUT_LINE(FILE_HANDLE,’  <br />HELLO,IT’S A TEST TXT FILE’);  <br />UTL_FILE.FCLOSE(FILE_HANDLE);  <br />END;  <br /><br /><br />11.在数据库触发器中使用列的新值与旧值  <br />---- 在数据库触发器中几乎总是要使用触发器基表的列值，如果某条语句需要某列修改前的值，使用:OLD就可以了，使用某列修改后的新值，用:NEW就可以了。如:OLD.DEPT_NO,:NEW.DEPT_NO。  <br /><br /><br />12.数据库文件的移动方法  <br />当想将数据库文件移动到另外一个目录下时，可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强)：  <br />1. 使用SERVER MANAGER关闭实例.  <br />SVRMGR &gt;; connect internal;  <br />SVRMGR &gt;; shutdown;  <br />SVRMGR &gt;;exit;  <br />2. 使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6). 在UNIX中用 mv命令可以把文件移动到新的位置，  <br />#mv /ora13/orarun/document.dbf /ora12/orarun  <br />3. 装载数据库并用alter database命令来改变数据库中的文件名.  <br />SVRMGR &gt;; connect internal;  <br />SVRMGR &gt;; startup mount RUN73;  <br />SVRMGR &gt;; alter database rename file  <br />&gt;; ‘/ ora13/orarun/document.dbf’  <br />&gt;; ‘/ ora12/orarun/document.dbf’;  <br />4. 启动实例.  <br />SVRMGR &gt;; alter database open;  <br /><br /><br />13.连接查询结果：  <br />表a 列 a1 a2  <br />记录 1 a  <br />1 b  <br />2 x  <br />2 y  <br />2 z  <br />用select能选成以下结果:  <br />1 ab  <br />2 xyz  <br /><br />下面有两个例子：  <br />1.使用pl/sql代码实现，但要求你组合后的长度不能超出oracle varchar2长度的限制  <br />create or replace type strings_table is table of varchar2(20);  <br />/  <br />create or replace function merge (pv in strings_table) return varchar2  <br />is  <br />ls varchar2(4000);  <br />begin  <br />for i in 1..pv.count loop  <br />ls := ls || pv(i);  <br />end loop;  <br />return ls;  <br />end;  <br />/  <br />create table t (id number,name varchar2(10));  <br />insert into t values(1,'Joan');  <br />insert into t values(1,'Jack');  <br />insert into t values(1,'Tom');  <br />insert into t values(2,'Rose');  <br />insert into t values(2,'Jenny');  <br /><br />column names format a80;  <br />select t0.id,merge(cast(multiset(select name from t where t.id = t0.id) as strings_table)) names  <br />from (select distinct id from t) t0;  <br /><br />drop type strings_table;  <br />drop function merge;  <br />drop table t;  <br /><br /><br />2.纯粹用sql：  <br />表dept, emp  <br />要得到如下结果  <br />deptno, dname, employees  <br />---------------------------------  <br />10, accounting, clark;king;miller  <br />20, research, smith;adams;ford;scott;jones  <br />30, sales, allen;blake;martin;james;turners  <br />每个dept的employee串起来作为一条记录返回  <br /><br />This example uses a max of 6, and would need more cut n pasting to do more than that：  <br /><br />SQL&gt;; select deptno, dname, emps  <br />2 from (  <br />3 select d.deptno, d.dname, rtrim(e.ename ||', '||  <br />4 lead(e.ename,1) over (partition by d.deptno  <br />5 order by e.ename) ||', '||  <br />6 lead(e.ename,2) over (partition by d.deptno  <br />7 order by e.ename) ||', '||  <br />8 lead(e.ename,3) over (partition by d.deptno  <br />9 order by e.ename) ||', '||  <br />10 lead(e.ename,4) over (partition by d.deptno  <br />11 order by e.ename) ||', '||  <br />12 lead(e.ename,5) over (partition by d.deptno  <br />13 order by e.ename),', ') emps,  <br />14 row_number () over (partition by d.deptno  <br />15 order by e.ename) x  <br />16 from emp e, dept d  <br />17 where d.deptno = e.deptno  <br />18 )  <br />19 where x = 1  <br />20 /  <br /><br />DEPTNO DNAME EMPS  <br />------- ----------- ------------------------------------------  <br />10 ACCOUNTING CLARK, KING, MILLER  <br />20 RESEARCH ADAMS, FORD, JONES, ROONEY, SCOTT, SMITH  <br />30 SALES ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD  <br /><br /><br /><br />14.在Oracle中建一个编号会自动增加的字段,以利于查询  <br /><br />1、建立序列：  <br />CREATE SEQUENCE checkup_no_seq  <br />NOCYCLE  <br />MAXVALUE 9999999999  <br />START WITH 2;  <br /><br />2、建立触发器：  <br />CREATE OR REPLACE TRIGGER set_checkup_no  <br />BEFORE INSERT ON checkup_history  <br />FOR EACH ROW  <br />DECLARE  <br />next_checkup_no NUMBER;  <br />BEGIN  <br />--Get the next checkup number from the sequence  <br />SELECT checkup_no_seq.NEXTVAL  <br />INTO next_checkup_no  <br />FROM dual;  <br /><br />--use the sequence number as the primary key  <br />--for the record being inserted  <br />:new.checkup_no := next_checkup_no;  <br />END;  <br /><br /><br />15.查看对象的依赖关系(比如视图与表的引用)  <br /><br />查看视图：dba_dependencies 记录了相关的依赖关系  <br />查东西不知道要查看哪个视图时，可以在DBA_Objects里看，  <br />select object_name from dba_objects where object_name like '%ROLE%'(假如查看ROLE相关)  <br />然后DESC一下就大体上知道了。  <br /><br /><br />16.要找到某月中所有周五的具体日期  <br />select to_char(t.d,'YY-MM-DD') from (  <br />select trunc(sysdate, 'MM')+rownum-1 as d  <br />from dba_objects  <br />where rownum &lt; 32) t  <br />where to_char(t.d, 'MM') = to_char(sysdate, 'MM') --找出当前月份的周五的日期  <br />and trim(to_char(t.d, 'Day')) = '星期五'  </span>
<img src ="http://www.blogjava.net/cymao/aggbug/38280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-03-30 16:58 <a href="http://www.blogjava.net/cymao/archive/2006/03/30/38280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下硬盘分区的最佳方案</title><link>http://www.blogjava.net/cymao/archive/2006/01/24/29100.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Tue, 24 Jan 2006 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/01/24/29100.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/29100.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/01/24/29100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/29100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/29100.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=1 cellPadding=4 width="100%" bgColor=#cccccc border=0>
<TBODY>
<TR vAlign=top bgColor=#eeeeee>
<TD style="WORD-BREAK: break-all" width="96%">
<TABLE cellSpacing=0 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="90%"><FONT face=arial,sans-serif color=#000000 size=-1><B>Linux下硬盘分区的最佳方案</B></FONT></TD>
<TD noWrap width="10%"><FONT face=arial,sans-serif color=#000000 size=-1></FONT></TD></TR></TBODY></TABLE></TD>
<TD style="WORD-BREAK: break-all" vAlign=top noWrap align=middle width="1%">
<TABLE cellSpacing=0 cellPadding=2 border=0>
<TBODY>
<TR>
<TD><A title=回复此消息 href="http://www.g-nb.com/forums/post.jsp?forum=18&amp;thread=205&amp;message=410&amp;reply=true"></A></TD>
<TD><FONT face=arial,sans-serif size=-1></FONT></TD></TR></TBODY></TABLE></TD></TR>
<TR bgColor=#eeeeee>
<TD style="WORD-BREAK: break-all" vAlign=top width="99%" colSpan=2><FONT face=arial,sans-serif color=#000000 size=-1>在对硬盘进行分区前，应该先弄清楚计算机担负的工作及硬盘的容量有多大，还要考虑到以下几个问题。&nbsp;<BR><BR>　　第一点也是最重要的一点，要知道当前安装LILO的版本，因为LILO2.21及早期版本对硬盘大小有限制，如果安装LILO到1023磁道以外即8G的空间以外，LILO就无法启动。&nbsp;但一些BIOS较老的机器，LINUX仍然无法突破1024磁道的限制，因此这些BIOS无法认出大于1024的硬盘空间。&nbsp;<BR><BR>　　还需要考虑的问题有：&nbsp;<BR><BR>　　·&nbsp;是否限制用户可使用的磁盘空间大小？&nbsp;<BR><BR>　　·&nbsp;在系统中需要安装哪些软件？&nbsp;<BR><BR>　　·&nbsp;交换分区需要多大？&nbsp;<BR><BR>　　·&nbsp;系统是否有多个硬盘？&nbsp;<BR><BR>　　下面，我们按系统工作性质的不同对分区的划分提出了一些建议。当然，根据实际情况，在满足系统工作需求的前提下，下面的分区大小也可以灵活的变动。&nbsp;<BR><BR>基本工作站的分区方案&nbsp;<BR>　　假设系统的硬盘大小是10G。&nbsp;<BR><BR>　　/boot&nbsp;20M&nbsp;<BR><BR>　　Swap&nbsp;128M&nbsp;<BR><BR>　　/root&nbsp;9.85G&nbsp;<BR><BR>　　建立一个20M的/boot分区是为了避免将系统内核文件放到1024磁道以外，如果将/boot做为root分区的一个子目录，内核文件就会安装在root分区的任何地方，因为硬盘的大小超过了8G，所以在启动时就有可能出现问题。建议将交换分区的大小设置为内存的两倍，在这里我们假设系统的内存为64M。最后我们将硬盘的剩余空间全部分给了root分区。&nbsp;<BR><BR>Red&nbsp;Hat&nbsp;Linux&nbsp;6.2&nbsp;及其早期版本上的基本服务器硬盘分区方案&nbsp;<BR>　　这里的服务器我们假设只提供几种通用的服务，如WWW服务及FTP服务等几种服务，通过telnet登录的用户数很少。假设其硬盘大小为25G。&nbsp;<BR><BR>　　/boot&nbsp;20M&nbsp;<BR><BR>　　Swap&nbsp;128M&nbsp;<BR><BR>　　/&nbsp;10G&nbsp;<BR><BR>　　/home&nbsp;13G&nbsp;<BR><BR>　　/var&nbsp;2G&nbsp;<BR><BR>　　在硬盘的最前面创建20M大小的/boot分区，原因同上。交换分区的大小也是128M，因为内存的大小为64M。&nbsp;<BR><BR>　　/&nbsp;，即root分区设为10G这么大是因为其中有一个/usr目录，这个目录可能会占用很多硬盘空间，特别是在安装了X&nbsp;Server，运行图形界面的应用程序的时候。&nbsp;<BR><BR>　　/home分区是硬盘中最大的分区，这似乎与我们假设系统用户数不多有些矛盾。实际上在/home目录下确实没有几个用户目录，但在Red&nbsp;Hat6.2及更早的版本中，Apache服务器和wu-ftpd&nbsp;FTP服务器被放在了/home/httpd及/home/ftp目录中。所以这个分区这么大也是有原因的。&nbsp;<BR><BR>　　最后，/var目录独自占用了一个分区，因为系统的所有日志都写到了/var/log目录下，这将会占用很大的硬盘空间。如果系统日志记录得非常详细，整个目录很快会被写满，导致系统工作呆滞。当然，可以通过系统日志后台守护程序syslogd来修改日志配置，避免发生这种情况。&nbsp;<BR><BR>Red&nbsp;Hat&nbsp;7及以上版本的基本服务器分区方案&nbsp;<BR>　　这种情况同前一个方案的情况相同，不同的是LINUX版本为Red&nbsp;Hat&nbsp;7.0及其以上版本。&nbsp;<BR><BR>　　/boot&nbsp;20M&nbsp;<BR><BR>　　Swap&nbsp;128M&nbsp;<BR><BR>　　/&nbsp;10G&nbsp;<BR><BR>　　/var&nbsp;15G&nbsp;<BR><BR>　　与RedHat6不同，在RedHat7中HTTP服务和FTP服务的目录现在位于&nbsp;/var/www/&nbsp;和/var/ftp/，因此/var分区有15G之大也就不难理解了。&nbsp;<BR><BR>多用户服务器分区方案&nbsp;<BR>　　在这种服务器系统中，同时有多个用户通过telnet,&nbsp;ssh,&nbsp;rlogin或其方式在远程访问系统。系统中有三个35G的硬盘驱动器，总共有105G的磁盘空间&nbsp;。系统中用到了RAID&nbsp;5技术做数据冗余。这种情况下，管理员必须为每个用户分配磁盘空间。对RedHat&nbsp;6.2及更早的版本，分区如下：&nbsp;<BR><BR>　　Disk&nbsp;1:&nbsp;<BR><BR>　　/boot&nbsp;20M&nbsp;<BR><BR>　　/&nbsp;4G&nbsp;<BR><BR>　　/var&nbsp;3GB&nbsp;<BR><BR>　　/home&nbsp;27.98G&nbsp;<BR><BR>　　Disk&nbsp;2:&nbsp;<BR><BR>　　swap&nbsp;20MB&nbsp;<BR><BR>　　/&nbsp;4GB&nbsp;<BR><BR>　　/var&nbsp;3GB&nbsp;<BR><BR>　　/home&nbsp;27.98GB&nbsp;<BR><BR>　　Disk&nbsp;3:&nbsp;<BR><BR>　　swap&nbsp;20MB&nbsp;<BR><BR>　　/&nbsp;4GB&nbsp;<BR><BR>　　/var&nbsp;3GB&nbsp;<BR><BR>　　/home&nbsp;27.98GB&nbsp;<BR><BR>　　这样分区的原因：首先，Disk1上的20M&nbsp;/boot分区不属于任何RAID阵列，否则如果你将/boot放至RAID阵列中，以后就不能系统内核升级了。&nbsp;<BR><BR>　　为了方便管理，在其它两个硬盘中建立了20M的交换分区。这种服务器一般配有1G以上的内存，因此交换分区的大小不成问题。如果增大交换分区，就会减少RAID分区空间，所以20M是足够的。RAID分区的分组如下：&nbsp;<BR><BR>　　·&nbsp;1-A,&nbsp;2-A,&nbsp;and&nbsp;3-A&nbsp;一起组成一个8G的&nbsp;RAID&nbsp;5&nbsp;驱动器，做为/根目录打开。&nbsp;<BR><BR>　　·&nbsp;1-B,&nbsp;2-B,&nbsp;and&nbsp;3-B&nbsp;组成&nbsp;6GB的&nbsp;RAID&nbsp;5&nbsp;驱动器，做为&nbsp;/var目录。&nbsp;<BR><BR>　　·&nbsp;1-C,&nbsp;2-C,&nbsp;and&nbsp;3-C&nbsp;组成&nbsp;55.96GB&nbsp;RAID&nbsp;5&nbsp;驱动器,&nbsp;做为&nbsp;/home.目录。&nbsp;<BR><BR>　　这种分配方案总共有55.96G的空间分配给所有用户及Apache和FTP服务，在/var下用6G空间用做记录日志、邮件，这么大的空间是足够的。&nbsp;<BR><BR>　　如果安装Red&nbsp;Hat7或以上版本，应给/var分区更大的空间，因为它同时还存放着WEB和FTP服务的两个目录。&nbsp;</FONT></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/cymao/aggbug/29100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-01-24 14:37 <a href="http://www.blogjava.net/cymao/archive/2006/01/24/29100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 指令大全  </title><link>http://www.blogjava.net/cymao/archive/2006/01/24/29088.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Tue, 24 Jan 2006 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/01/24/29088.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/29088.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/01/24/29088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/29088.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/29088.html</trackback:ping><description><![CDATA[<P>Linux 指令大全&nbsp; <BR>&nbsp;<BR>cat cd <BR>chmod chown <BR>cp cut </P>
<P>名称：cat <BR>使用权限：所有使用者 <BR>使用方式：cat [-AbeEnstTuv] [--help] [--version] fileName <BR>说明：把档案串连接后传到基本输出（萤幕或加 &gt; fileName 到另一个档案） <BR>参数： <BR>-n 或 --number 由 1 开始对所有输出的行数编号 <BR>-b 或 --number-nonblank 和 -n 相似，只不过对于空白行不编号 <BR>-s 或 --squeeze-blank 当遇到有连续两行以上的空白行，就代换为一行的空白行 <BR>-v 或 --show-nonprinting </P>
<P>范例： <BR>cat -n textfile1 &gt; textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里 <BR>cat -b textfile1 textfile2 &gt;&gt; textfile3 把 textfile1 和 textfile2 的档案内容加上行号（空白行不加）之后将内容附加到 textfile3 </P>
<P>名称 : cd <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : cd [dirName] </P>
<P>说明 : 变换工作目录至 dirName。 其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略，则变换至使用者的 home directory (也就是刚 login 时所在的目录)。 </P>
<P>另外，"~" 也表示为 home directory 的意思，"." 则是表示目前所在的目录，".." 则表示目前目录位置的上一层目录。 </P>
<P>范例 : 跳到 /usr/bin/ : <BR>cd /usr/bin </P>
<P>跳到自己的 home directory : <BR>cd ~ </P>
<P>跳到目前目录的上上两层 : <BR>cd ../.. </P>
<P>&nbsp;</P>
<P>指令名称 : chmod <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : chmod [-cfvR] [--help] [--version] mode file... </P>
<P>说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。 </P>
<P>把计 : </P>
<P>mode : 权限设定字串，格式如下 : [ugoa...][[+-=][rwxX]...][,...]，其中u 表示该档案的拥有者，g 表示与该档案的拥有者属于同一个群体(group)者，o 表示其他以外的人，a 表示这三者皆是。 <BR>+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 <BR>r 表示可读取，w 表示可写入，x 表示可执行，X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 <BR>-c : 若该档案权限确实已经更改，才显示其更改动作 <BR>-f : 若该档案权限无法被更改也不要显示错误讯息 <BR>-v : 显示权限变更的详细资料 <BR>-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) <BR>--help : 显示辅助说明 <BR>--version : 显示版本 </P>
<P>范例 :将档案 file1.txt 设为所有人皆可读取 : <BR>chmod ugo+r file1.txt </P>
<P>将档案 file1.txt 设为所有人皆可读取 : <BR>chmod a+r file1.txt </P>
<P>将档案 file1.txt 与 file2.txt 设为该档案拥有者，与其所属同一个群体者可写入，但其他以外的人则不可写入 : <BR>chmod ug+w,o-w file1.txt file2.txt </P>
<P>将 ex1.py 设定为只有该档案拥有者可以执行 : <BR>chmod u+x ex1.py </P>
<P>将目前目录下的所有档案与子目录皆设为任何人可读取 : <BR>chmod -R a+r * </P>
<P>此外chmod也可以用数字来表示权限如 chmod 777 file <BR>语法为：chmod abc file </P>
<P>其中a,b,c各为一个数字，分别表示User、Group、及Other的权限。 </P>
<P>r=4，w=2，x=1 <BR>若要rwx属性则4+2+1=7； <BR>若要rw-属性则4+2=6； <BR>若要r-x属性则4+1=7。 </P>
<P>范例： <BR>chmod a=rwx file </P>
<P>和 <BR>chmod 777 file </P>
<P>效果相同 <BR>chmod ug=rwx,o=x file </P>
<P>和 <BR>chmod 771 file </P>
<P>效果相同 </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>若用chmod 4755 filename可使此程式具有root的权限 </P>
<P><BR>指令名称 : chown <BR>使用权限 : root </P>
<P>使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file... </P>
<P>说明 : Linux/Unix 是多人多工作业系统，所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说，这个指令只有是由系统管理者(root)所使用，一般使用者没有权限可以改变别人的档案拥有者，也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。 </P>
<P>把计 : </P>
<P>user : 新的档案拥有者的使用者 IDgroup : 新的档案拥有者的使用者群体(group)-c : 若该档案拥有者确实已经更改，才显示其更改动作-f : 若该档案拥有者无法被更改也不要显示错误讯息-h : 只对于连结(link)进行变更，而非该 link 真正指向的档案-v : 显示拥有者变更的详细资料-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)--help : 显示辅助说明--version : 显示版本 </P>
<P>范例 : <BR>将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie : <BR>chown jessie:users file1.txt </P>
<P>将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport : <BR>chmod -R lamport:users * </P>
<P><BR>名称：cp <BR>使用权限：所有使用者 </P>
<P>使用方式： </P>
<P>cp [options] source dest <BR>cp [options] source... directory </P>
<P>说明：将一个档案拷贝至另一档案，或将数个档案拷贝至另一目录。 </P>
<P>把计?G </P>
<P>-a 尽可能将档案状态、权限等资料都照原状予以复制。 <BR>-r 若 source 中含有目录名，则将目录下之档案亦皆依序拷贝至目的地。 <BR>-f 若目的地已经有相同档名的档案存在，则在复制前先予以删除再行复制。 <BR>范例： <BR>将档案 aaa 复制(已存在)，并命名为 bbb : <BR>cp aaa bbb </P>
<P>将所有的C语言程式拷贝至 Finished 子目录中 : <BR>cp *.c Finished </P>
<P>&nbsp;</P>
<P>名称：cut </P>
<P>使用权限：所有使用者 </P>
<P>用法：cut -cnum1-num2 filename </P>
<P>说明：显示每行从开头算起 num1 到 num2 的文字。 </P>
<P>范例： </P>
<P>shell&gt;&gt; cat example <BR>test2 <BR>this is test1 <BR>shell&gt;&gt; cut -c0-6 example ## print 开头算起前 6 个字元 <BR>test2 <BR>this i </P>
<P><BR>名称 : find <BR>用法 : find <BR>使用说明 : </P>
<P>将档案系统内符合 expression 的档案列出来。你可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合，只有完全相符的才会被列出来。 </P>
<P>find 根据下列规则判断 path 和 expression，在命令列上第一个 - (&nbsp; , ! 之前的部份为 path，之后的是 expression。如果 path 是空字串则使用目前路径，如果 expression 是空字串则使用 -print 为预设 expression?C </P>
<P>expression 中可使用的选项有二三十个之多，在此只介绍最常用的部份。 </P>
<P>-mount, -xdev : 只检查和指定目录在同一个档案系统下的档案，避免列出其它档案系统中的档案 <BR>-amin n : 在过去 n 分钟内被读取过 <BR>-anewer file : 比档案 file 更晚被读取过的档案 <BR>-atime n : 在过去 n 天过读取过的档案 <BR>-cmin n : 在过去 n 分钟内被修改过 <BR>-cnewer file :比档案 file 更新的档案 <BR>-ctime n : 在过去 n 天过修改过的档案 <BR>-empty : 空的档案-gid n or -group name : gid 是 n 或是 group 名称是 name <BR>-ipath p, -path p : 路径名称符合 p 的档案，ipath 会忽略大小写 <BR>-name name, -iname name : 档案名称符合 name 的档案。iname 会忽略大小写 <BR>-size n : 档案大小 是 n 单位，b 代表 512 位元组的区块，c 表示字元数，k 表示 kilo bytes，w 是二个位元组。-type c : 档案类型是 c 的档案。 <BR>d: 目录 <BR>c: 字型装置档案 <BR>b: 区块装置档案 <BR>p: 具名贮列 <BR>f: 一般档案 <BR>l: 符号连结 <BR>s: socket <BR>-pid n : process id 是 n 的档案 </P>
<P>你可以使用 (&nbsp; 将运算式分隔，并使用下列运算。 <BR>exp1 -and exp2 <BR>! expr <BR>-not expr <BR>exp1 -or exp2 <BR>exp1, exp2 <BR>范例: <BR>将目前目录及其子目录下所有延伸档名是 c 的档案列出来。 <BR># find . -name "*.c" </P>
<P><BR>将目前目录其其下子目录中所有一般档案列出 <BR># find . -ftype f </P>
<P><BR>将目前目录及其子目录下所有最近 20 分钟内更新过的档案列出 <BR># find . -ctime -20 </P>
<P>&nbsp;</P>
<P>名称：less </P>
<P>使用权限：所有使用者 </P>
<P>使用方式： </P>
<P>less [Option] filename </P>
<P>说明： <BR>less 的作用与 more 十分相似，都可以用来浏览文字档案的内容，不同的是 less 允许使用者往回卷动 <BR>以浏览已经看过的部份，同时因为 less 并未在一开始就读入整个档案，因此在遇上大型档案的开启时，会比一般的文书编辑器(如 vi)来的快速。 </P>
<P><BR>范例： </P>
<P><BR>指令名称 : ln <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : ln [options] source dist，其中 option 的格式为 : </P>
<P>[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] <BR>[--help] [--version] [--] <BR>说明 : Linux/Unix 档案系统中，有所谓的连结(link)，我们可以将其视为档案的别名，而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link)，硬连结的意思是一个档案可以有多个名称，而软连结的方式则是产生一个特殊的档案，该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中，而软连结却可以跨越不同的档案系统。 <BR>ln source dist 是产生一个连结(dist)到 source，至于使用硬连结或软链结则由参数决定。 </P>
<P>不论是硬连结或软链结都不会将原本的档案复制一份，只会占用非常少量的磁碟空间。 </P>
<P><BR>-f : 链结时先将与 dist 同档名的档案删除-d : 允许系统管理者硬链结自己的目录-i : 在删除与 dist 同档名的档案时先进行询问-n : 在进行软连结时，将 dist 视为一般的档案-s : 进行软链结(symbolic link)-v : 在连结之前显示其档名-b : 将在链结时会被覆写或删除的档案进行备份-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾-V METHOD : 指定备份的方式--help : 显示辅助说明--version : 显示版本 <BR>范例 : <BR>将档案 yy 产生一个 symbolic link : zz <BR>ln -s yy zz </P>
<P>将档案 yy 产生一个 hard link : zz <BR>ln yy xx </P>
<P>&nbsp;</P>
<P>名称：locate <BR>使用权限：所有使用者 <BR>使用方式： locate [-q] [-d ] [--database=] <BR>locate [-r ] [--regexp=] <BR>locate [-qv] [-o ] [--output=] <BR>locate [-e ] [-f ] &lt;[-l ] [-c] <BR>&lt;[-U ] [-u]&gt; <BR>locate [-Vh] [--version] [--help] <BR>说明： <BR>locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的资料库，之后当寻找时就只需查询这个资料库，而不必实际深入档案系统之中了。 </P>
<P>在一般的 distribution 之中，资料库的建立都被放在 contab 中自动执行。一般使用者在使用时只要用 </P>
<P># locate your_file_name </P>
<P>的型式就可以了。 参数： <BR>-u <BR>-U </P>
<P>建立资料库，-u 会由根目录开始，-U 则可以指定开始的位置。 </P>
<P>-e </P>
<P>将 <BR>排除在寻找的范围之外。 </P>
<P>-l <BR>如果 是 1．则启动安全模式。在安全模式下，使用者不会看到权限无法看到的档案。这会始速度减慢，因为 locate 必须至实际的档案系统中取得档案的权限资料。 </P>
<P>-f <BR>将特定的档案系统排除在外，例如我们没有到理要把 proc 档案系统中的档案放在资料库中。 </P>
<P>-q <BR>安静模式，不会显示任何错误讯息。 </P>
<P>-n <BR>至多显示 个输出。 </P>
<P>-r <BR>使用正规运算式 做寻找的条件。 </P>
<P>-o <BR>指定资料库存的名称。 </P>
<P>-d </P>
<P>指定资料库的路径 </P>
<P>-h <BR>显示辅助讯息 </P>
<P>-v <BR>显示更多的讯息 </P>
<P>-V <BR>显示程式的版本讯息 范例： </P>
<P>locate chdrv : 寻找所有叫 chdrv 的档案 <BR>locate -n 100 a.out : 寻找所有叫 a.out 的档案，但最多只显示 100 个 <BR>locate -u : 建立资料库 </P>
<P><BR>名称 : ls <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : ls [-alrtAFR] [name...] </P>
<P>说明 : 显示指定工作目录下之内容（列出目前工作目录所含之档案及子目录)。 </P>
<P><BR>-a 显示所有档案及目录 (ls内定将档案名或目录名称开头为"."的视为隐藏档，不会列出) <BR>-l 除档案名称外，亦将档案型态、权限、拥有者、档案大小等资讯详细列出 <BR>-r 将档案以相反次序显示(原定依英文字母次序) <BR>-t 将档案依建立时间之先后次序列出 <BR>-A 同 -a ，但不列出 "." (目前目录) 及 ".." (父目录) <BR>-F 在列出的档案名称后加一符号；例如可执行档则加 "*", 目录则加 "/" <BR>-R 若目录下有档案，则以下之档案亦皆依序列出 </P>
<P>范例： <BR>列出目前工作目录下所有名称是 s 开头的档案，愈新的排愈后面 : <BR>ls -ltr s* </P>
<P>将 /bin 目录以下所有目录及档案详细资料列出 : <BR>ls -lR /bin </P>
<P>列出目前工作目录下所有档案及目录；目录于名称后加 "/", 可执行档于名称后加 "*" : <BR>ls -AF </P>
<P>名称：more <BR>使用权限：所有使用者 <BR>使用方式：more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..] <BR>说明：类似 cat ，不过会以一页一页的显示方便使用者逐页阅读，而最基本的指令就是按空白键（space）就往下一页显示，按 b 键就会往回（back）一页显示，而且还有搜寻字串的功能（与 vi 相似），使用中的说明文件，请按 h 。 <BR>参数：-num 一次显示的行数 <BR>-d 提示使用者，在画面下方显示 [Press space to continue, q to quit.] ，如果使用者按错键，则会显示 [Press h for instructions.] 而不是 哔 声 <BR>-l 取消遇见特殊字元 ^L（送纸字元）时会暂停的功能 <BR>-f 计算行数时，以实际上的行数，而非自动换行过后的行数（有些单行字数太长的会被扩展为两行或两行以上） <BR>-p 不以卷动的方式显示每一页，而是先清除萤幕后再显示内容 <BR>-c 跟 -p 相似，不同的是先显示内容再清除其他旧资料 <BR>-s 当遇到有连续两行以上的空白行，就代换为一行的空白行 <BR>-u 不显示下引号 （根据环境变数 TERM 指定的 terminal 而有所不同） <BR>+/ 在每个档案显示前搜寻该字串（pattern），然后从该字串之后开始显示 <BR>+num 从第 num 行开始显示 <BR>fileNames 欲显示内容的档案，可为复数个数 <BR>范例： <BR>more -s testfile 逐页显示 testfile 之档案内容，如有连续两行以上空白行则以一行空白行显示。 <BR>more +20 testfile 从第 20 行开始显示 testfile 之档案内容。 </P>
<P><BR>名称：mv <BR>使用权限：所有使用者 </P>
<P>使用方式： </P>
<P>mv [options] source dest <BR>mv [options] source... directory <BR>说明：将一个档案移至另一档案，或将数个档案移至另一目录。 <BR>参数：-i 若目的地已有同名档案，则先询问是否覆盖旧档。 </P>
<P>范例： </P>
<P>将档案 aaa 更名为 bbb : <BR>mv aaa bbb </P>
<P>将所有的C语言程式移至 Finished 子目录中 : <BR>mv -i *.c </P>
<P>&nbsp;</P>
<P>名称：rm <BR>使用权限：所有使用者 </P>
<P>使用方式：rm [options] name... </P>
<P>说明：删除档案及目录。 </P>
<P>把计?G </P>
<P>-i 删除前逐一询问确认。 <BR>-f 即使原档案属性设为唯读，亦直接删除，无需逐一确认。 <BR>-r 将目录及以下之档案亦逐一删除。 <BR>范例： <BR>删除所有C语言程式档；删除前逐一询问确认 : <BR>rm -i *.c </P>
<P>将 Finished 子目录及子目录中所有档案删除 : <BR>rm -r Finished </P>
<P>&nbsp;</P>
<P>名称：rmdir <BR>使用权限：于目前目录有适当权限的所有使用者 </P>
<P>使用方式： rmdir [-p] dirName </P>
<P>说明： 删除空的目录。 </P>
<P>参数： -p 是当子目录被删除后使它也成为空目录的话，则顺便一并删除。 </P>
<P>范例： </P>
<P>将工作目录下，名为 AAA 的子目录删除 : <BR>rmdir AAA </P>
<P>在工作目录下的 BBB 目录中，删除名为 Test 的子目录。若 Test 删除后，BBB 目录成为空目录，则 BBB 亦予删除。 <BR>rmdir -p BBB/Test </P>
<P>&nbsp;</P>
<P>名称：split <BR>使用权限：所有使用者 </P>
<P>使用方式：split [OPTION] [INPUT [PREFIX]] </P>
<P>说明： </P>
<P>将一个档案分割成数个。而从 INPUT 分割输出成固定大小的档案，其档名依序为 PREFIXaa, PREFIXab...；PREFIX 预设值为 `x。若没有 INPUT 档或为 `-，则从标准输入读进资料。 </P>
<P>匡兜?G </P>
<P>-b, --bytes=SIZE </P>
<P>SIZE 值为每一输出档案的大小，单位为 byte。 <BR>-C, --line-bytes=SIZE </P>
<P>每一输出档中，单行的最大 byte 数。 <BR>-l, --lines=NUMBER </P>
<P>NUMBER 值为每一输出档的列数大小。 <BR>-NUMBER </P>
<P>与 -l NUMBER 相同。 <BR>--verbose </P>
<P>于每个输出档被开启前，列印出侦错资讯到标准错误输出。 <BR>--help </P>
<P>显示辅助资讯然后离开。 <BR>--version </P>
<P>列出版本资讯然后离开。 <BR>SIZE 可加入单位: b 代表 512， k 代表 1K， m 代表 1 Meg。 </P>
<P>范例： </P>
<P>PostgresSQL 大型资料库备份与回存： </P>
<P>因 Postgres 允许表格大过你系统档案的最大容量，所以要将表格 dump 到单一的档案可能会有问题，使用 split进行档案分割。 </P>
<P><BR>% pg_dump dbname | split -b 1m - filename.dump. </P>
<P>&nbsp;</P>
<P>重新载入 </P>
<P><BR>% createdb dbname <BR>% cat filename.dump.* | pgsql dbname </P>
<P>&nbsp;</P>
<P>名称：touch <BR>使用权限：所有使用者 </P>
<P>使用方式： <BR>touch [-acfm] <BR>[-r reference-file] [--file=reference-file] <BR>[-t MMDDhhmm[[CC]YY][.ss]] <BR>[-d time] [--date=time] [--time={atime,access,use,mtime,modify}] <BR>[--no-create] [--help] [--version] <BR>file1 [file2 ...] </P>
<P><BR>说明： <BR>touch 指令改变档案的时间记录。 ls -l 可以显示档案的时间记录。 </P>
<P><BR>参数： <BR>a 改变档案的读取时间记录。 <BR>m 改变档案的修改时间记录。 <BR>c 假如目的档案不存在，不会建立新的档案。与 --no-create 的效果一样。 <BR>f 不使用，是为了与其他 unix 系统的相容性而保留。 <BR>r 使用参考档的时间记录，与 --file 的效果一样。 <BR>d 设定时间与日期，可以使用各种不同的格式。 <BR>t 设定档案的时间记录，格式与 date 指令相同。 <BR>--no-create 不会建立新档案。 <BR>--help 列出指令格式。 <BR>--version 列出版本讯息。 </P>
<P><BR>范例： </P>
<P><BR>最简单的使用方式，将档案的时候记录改为现在的时间。若档案不存在，系统会建立一个新的档案。 </P>
<P>touch file <BR>touch file1 file2 </P>
<P>将 file 的时间记录改为 5 月 6 日 18 点 3 分，公元两千年。时间的格式可以参考 date 指令，至少需输入 MMDDHHmm ，就是月日时与分。 </P>
<P>touch -c -t 05061803 file <BR>touch -c -t 050618032000 file </P>
<P>将 file 的时间记录改变成与 referencefile 一样。 </P>
<P>touch -r referencefile file </P>
<P>将 file 的时间记录改成 5 月 6 日 18 点 3 分，公元两千年。时间可以使用 am, pm 或是 24 小时的格式，日期可以使用其他格式如 6 May 2000 。 </P>
<P>touch -d "6:03pm" file <BR>touch -d "05/06/2000" file <BR>touch -d "6:03pm 05/06/2000" file&nbsp;&nbsp; </P>
<P>名称 : at <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : at -V [-q queue] [-f file] [-mldbv] TIME </P>
<P>说明 : at 可以让使用者指定在 TIME 这个特定时刻执行某个程式或指令，TIME 的格式是 HH:MM其中的 HH 为小时，MM 为分钟，甚至你也可以指定 am, pm, midnight, noon, teatime(就是下午 4 点锺)等口语词。 </P>
<P>如果想要指定超过一天内的时间，则可以用 MMDDYY 或者 MM/DD/YY 的格式，其中 MM 是分钟，DD 是第几日，YY 是指年份。另外，使用者甚至也可以使用像是 now + 时间间隔来弹性指定时间，其中的时间间隔可以是 minutes, hours, days, weeks?C </P>
<P>另外，使用者也可指定 today 或 tomorrow 来表示今天或明天。当指定了时间并按下 enter 之后，at 会进入交谈模式并要求输入指令或程式，当你输入完后按下 ctrl+D 即可完成所有动作，至于执行的结果将会寄回你的帐号中。 </P>
<P>把计 : </P>
<P>-V : 印出版本编号 <BR>-q : 使用指定的伫列(Queue)来储存，at 的资料是存放在所谓的 queue 中，使用者可以同时使用多个 queue，而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个 <BR>-m : 即使程式/指令执行完成后没有输出结果, 也要寄封信给使用者 <BR>-f file : 读入预先写好的命令档。使用者不一定要使用交谈模式来输入，可以先将所有的指定先写入档案后再一次读入 <BR>-l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l) <BR>-d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d) <BR>-v : 列出所有已经完成但尚未删除的指定 </P>
<P>例子 : <BR>三天后的下午 5 点锺执行 /bin/ls : <BR>at 5pm + 3 days /bin/ls </P>
<P>三个星期后的下午 5 点锺执行 /bin/ls : <BR>at 5pm + 2 weeks /bin/ls </P>
<P>明天的 17:20 执行 /bin/date : <BR>at 17:20 tomorrow /bin/date </P>
<P>1999 年的最后一天的最后一分钟印出 the end of world ! <BR>at 23:59 12/31/1999 echo the end of world ! </P>
<P>&nbsp;</P>
<P><BR>名称：cal </P>
<P>使用权限：所有使用者 </P>
<P>使用方式：cal [-mjy] [month [year]] </P>
<P>说明： </P>
<P>显示日历。若只有一个参数，则代表年份(1-9999)，显示该年的年历。年份必须全部写出：``cal 89\ 将不会是显示 1989 年的年历。使用两个参数，则表示月份及年份。若没有参数则显示这个月的月历。 <BR>1752 年 9 月第 3 日起改用西洋新历，因这时大部份的国家都采用新历，有 10 天被去除，所以该月份的月历有些不同。在此之前为西洋旧历。 </P>
<P>匡兜?G </P>
<P>-m : 以星期一为每周的第一天方式显示。 <BR>-j : 以凯撒历显示，即以一月一日起的天数显示。 <BR>-y : 显示今年年历。 </P>
<P>范例： </P>
<P>cal : 显示本月的月历。 </P>
<P>&nbsp;</P>
<P>[root@mylinux /root]# date <BR>Tue Aug 15 08:00:18 CST 2000 <BR>[root@mylinux /root]# cal <BR>August 2000 <BR>Su Mo Tu We Th Fr Sa <BR>1 2 3 4 5 <BR>6 7 8 9 10 11 12 <BR>13 14 15 16 17 18 19 <BR>20 21 22 23 24 25 26 <BR>27 28 29 30 31 </P>
<P>[root@mylinux /root]# </P>
<P><BR>cal 2001 : 显示公元 2001 年年历。 </P>
<P>[root@mylinux /root]# cal 2001 <BR>2001 </P>
<P>January February March <BR>Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa <BR>1 2 3 4 5 6 1 2 3 1 2 3 <BR>7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10 <BR>14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17 <BR>21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24 <BR>28 29 30 31 25 26 27 28 25 26 27 28 29 30 31 </P>
<P>April May June <BR>Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa <BR>1 2 3 4 5 6 7 1 2 3 4 5 1 2 <BR>8 9 10 11 12 13 14 6 7 8 9 10 11 12 3 4 5 6 7 8 9 <BR>15 16 17 18 19 20 21 13 14 15 16 17 18 19 10 11 12 13 14 15 16 <BR>22 23 24 25 26 27 28 20 21 22 23 24 25 26 17 18 19 20 21 22 23 <BR>29 30 27 28 29 30 31 24 25 26 27 28 29 30 </P>
<P>July August September <BR>Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa <BR>1 2 3 4 5 6 7 1 2 3 4 1 <BR>8 9 10 11 12 13 14 5 6 7 8 9 10 11 2 3 4 5 6 7 8 <BR>15 16 17 18 19 20 21 12 13 14 15 16 17 18 9 10 11 12 13 14 15 <BR>22 23 24 25 26 27 28 19 20 21 22 23 24 25 16 17 18 19 20 21 22 <BR>29 30 31 26 27 28 29 30 31 23 24 25 26 27 28 29 <BR>30 <BR>October November December <BR>Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa <BR>1 2 3 4 5 6 1 2 3 1 <BR>7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8 <BR>14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15 <BR>21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22 <BR>28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29 <BR>30 31 </P>
<P>[root@mylinux /root]# </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>cal 5 2001 : 显示公元 2001 年 5 月月历。 </P>
<P>&nbsp;</P>
<P>[root@mylinux /root]# cal 5 2001 <BR>May 2001 <BR>Su Mo Tu We Th Fr Sa <BR>1 2 3 4 5 <BR>6 7 8 9 10 11 12 <BR>13 14 15 16 17 18 19 <BR>20 21 22 23 24 25 26 <BR>27 28 29 30 31 </P>
<P>[root@mylinux /root]# </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>cal -m : 以星期一为每周的第一天方式，显示本月的月历。 </P>
<P>&nbsp;</P>
<P>[root@mylinux /root]# cal -m <BR>August 2000 <BR>Mo Tu We Th Fr Sa Su <BR>1 2 3 4 5 6 <BR>7 8 9 10 11 12 13 <BR>14 15 16 17 18 19 20 <BR>21 22 23 24 25 26 27 <BR>28 29 30 31 </P>
<P>[root@mylinux /root]# </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>cal -jy : 以一月一日起的天数显示今年的年历。 </P>
<P>&nbsp;</P>
<P>[root@mylinux /root]# cal -jy <BR>2000 </P>
<P>January February <BR>Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <BR>1 32 33 34 35 36 <BR>2 3 4 5 6 7 8 37 38 39 40 41 42 43 <BR>9 10 11 12 13 14 15 44 45 46 47 48 49 50 <BR>16 17 18 19 20 21 22 51 52 53 54 55 56 57 <BR>23 24 25 26 27 28 29 58 59 60 <BR>30 31 <BR>March April <BR>Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <BR>61 62 63 64 92 <BR>65 66 67 68 69 70 71 93 94 95 96 97 98 99 <BR>72 73 74 75 76 77 78 100 101 102 103 104 105 106 <BR>79 80 81 82 83 84 85 107 108 109 110 111 112 113 <BR>86 87 88 89 90 91 114 115 116 117 118 119 120 <BR>121 <BR>May June <BR>Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <BR>122 123 124 125 126 127 153 154 155 <BR>128 129 130 131 132 133 134 156 157 158 159 160 161 162 <BR>135 136 137 138 139 140 141 163 164 165 166 167 168 169 <BR>142 143 144 145 146 147 148 170 171 172 173 174 175 176 <BR>149 150 151 152 177 178 179 180 181 182 </P>
<P>July August <BR>Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <BR>183 214 215 216 217 218 <BR>184 185 186 187 188 189 190 219 220 221 222 223 224 225 <BR>191 192 193 194 195 196 197 226 227 228 229 230 231 232 <BR>198 199 200 201 202 203 204 233 234 235 236 237 238 239 <BR>205 206 207 208 209 210 211 240 241 242 243 244 <BR>212 213 <BR>September October <BR>Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <BR>245 246 275 276 277 278 279 280 281 <BR>247 248 249 250 251 252 253 282 283 284 285 286 287 288 <BR>254 255 256 257 258 259 260 289 290 291 292 293 294 295 <BR>261 262 263 264 265 266 267 296 297 298 299 300 301 302 <BR>268 269 270 271 272 273 274 303 304 305 </P>
<P>November December <BR>Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat <BR>306 307 308 309 336 337 <BR>310 311 312 313 314 315 316 338 339 340 341 342 343 344 <BR>317 318 319 320 321 322 323 345 346 347 348 349 350 351 <BR>324 325 326 327 328 329 330 352 353 354 355 356 357 358 <BR>331 332 333 334 335 359 360 361 362 363 364 365 <BR>366 </P>
<P>[root@mylinux /root]# </P>
<P>&nbsp;</P>
<P><BR>名称 : crontab <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : </P>
<P>crontab [ -u user ] filecrontab [ -u user ] { -l | -r | -e } <BR>说明 : <BR>crontab 是用来让使用者在固定时间或固定间隔执行程式之用，换句话说，也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表，这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话，就是表示设定自己的时程表。 </P>
<P>餐数 : </P>
<P>-e : 执行文字编辑器来设定时程表，内定的文字编辑器是 VI，如果你想用别的文字编辑器，则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe) <BR>-r : 删除目前的时程表 <BR>-l : 列出目前的时程表 </P>
<P>时程表的格式如下 : <BR>f1 f2 f3 f4 f5 program </P>
<P>其中 f1 是表示分钟，f2 表示小时，f3 表示一个月份中的第几日，f4 表示月份，f5 表示一个星期中的第几天。program 表示要执行的程式。 <BR>当 f1 为 * 时表示每分钟都要执行 program，f2 为 * 时表示每小时都要执行程式，其余类推 <BR>当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行，f2 为 a-b 时表示从第 a 到第 b 小时都要执行，其余类推 <BR>当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次，f2 为 */n 表示每 n 小时个时间间隔执行一次，其余类推 <BR>当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行，f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行，其余类推 </P>
<P>使用者也可以将所有的设定先存放在档案 file 中，用 crontab file 的方式来设定时程表。 <BR>例子 : </P>
<P>每月每天每小时的第 0 分钟执行一次 /bin/ls : <BR>0 7 * * * /bin/ls </P>
<P>在 12 月内, 每天的早上 6 点到 12 点中，每隔 20 分钟执行一次 /usr/bin/backup : <BR>0 6-12/3 * 12 * /usr/bin/backup </P>
<P>周一到周五每天下午 5:00 寄一封信给 <A href="mailto:alex@domain.name">alex@domain.name</A> : <BR>0 17 * * 1-5 mail -s "hi" <A href="mailto:alex@domain.name">alex@domain.name</A> &lt; /tmp/maildata </P>
<P>每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha" <BR>20 0-23/2 * * * echo "haha" </P>
<P>注意 : </P>
<P>当程式在你所指定的时间执行后，系统会寄一封信给你，显示该程式执行的内容，若是你不希望收到这样的信，请在每一行空一格之后加上 &gt; /dev/null 2&gt;&amp;1 即可。 </P>
<P>名称 : date <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : </P>
<P>date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]] </P>
<P>说明 : </P>
<P>date 可以用来显示或设定系统的日期与时间，在显示方面，使用者可以设定欲显示的格式，格式设定为一个加号后接数个标记，其中可用的标记列表如下 : </P>
<P>时间方面 : </P>
<P>% : 印出 % <BR>%n : 下一行 <BR>%t : 跳格 <BR>%H : 小时(00..23) <BR>%I : 小时(01..12) <BR>%k : 小时(0..23) <BR>%l : 小时(1..12) <BR>%M : 分钟(00..59) <BR>%p : 显示本地 AM 或 PM <BR>%r : 直接显示时间 (12 小时制，格式为 hh:mm:ss [AP]M) <BR>%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 <BR>%S : 秒(00..61) <BR>%T : 直接显示时间 (24 小时制) <BR>%X : 相当于 %H:%M:%S <BR>%Z : 显示时区 </P>
<P>日期方面 : <BR>%a : 星期几 (Sun..Sat) <BR>%A : 星期几 (Sunday..Saturday) <BR>%b : 月份 (Jan..Dec) <BR>%B : 月份 (January..December) <BR>%c : 直接显示日期与时间 <BR>%d : 日 (01..31) <BR>%D : 直接显示日期 (mm/dd/yy) <BR>%h : 同 %b <BR>%j : 一年中的第几天 (001..366) <BR>%m : 月份 (01..12) <BR>%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形) <BR>%w : 一周中的第几天 (0..6) <BR>%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形) <BR>%x : 直接显示日期 (mm/dd/yy) <BR>%y : 年份的最后两位数字 (00.99) <BR>%Y : 完整年份 (0000..9999) </P>
<P>若是不以加号作为开头，则表示要设定时间，而时间格式为 MMDDhhmm[[CC]YY][.ss]，其中 MM 为月份，DD 为日，hh 为小时，mm 为分钟，CC 为年份前两位数字，YY 为年份后两位数字，ss 为秒数 <BR>把计 : </P>
<P>-d datestr : 显示 datestr 中所设定的时间 (非系统时间) <BR>--help : 显示辅助讯息 <BR>-s datestr : 将系统时间设为 datestr 中所设定的时间 <BR>-u : 显示目前的格林威治时间 <BR>--version : 显示版本编号 </P>
<P>例子 : <BR>显示时间后跳行，再显示目前日期 : <BR>date +%T%n%D </P>
<P>显示月份与日数 : <BR>date +%B %d </P>
<P>显示日期与设定时间(12:34:56) : <BR>date --date 12:34:56 </P>
<P>注意 : </P>
<P>当你不希望出现无意义的 0 时(比如说 1999/03/07)，则可以在标记中插入 - 符号，比如说 date +%-H:%-M:%-S 会把时分秒中无意义的 0 给去掉，像是原本的 08:09:04 会变为 8:9:4。另外，只有取得权限者(比如说 root)才能设定系统时间。 </P>
<P>当你以 root 身分更改了系统时间之后，请记得以 clock -w 来将系统时间写入 CMOS 中，这样下次重新开机时系统时间才会持续抱持最新的正确值。 </P>
<P><BR>名称 : sleep <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : sleep [--help] [--version] number[smhd] </P>
<P>说明 : sleep 可以用来将目前动作延迟一段时间 </P>
<P>参数说明 : </P>
<P>--help : 显示辅助讯息 <BR>--version : 显示版本编号 <BR>number : 时间长度，后面可接 s、m、h 或 d <BR>其中 s 为秒，m 为 分钟，h 为小时，d 为日数 </P>
<P>例子 : <BR>显示目前时间后延迟 1 分钟，之后再次显示时间 : <BR>date;sleep 1m;date </P>
<P>&nbsp;</P>
<P>名称： time <BR>使用权限： 所有使用者 </P>
<P>使用方式： time [options] COMMAND [arguments] </P>
<P>说明： time 指令的用途，在于量测特定指令执行时所需消耗的时间及系统资源等资讯。例如 CPU 时间、记忆体、输入输出等等。需要特别注意的是，部分资讯在 Linux 上显示不出来。这是因为在 Linux 上部分资源的分配函式与 time 指令所预设的方式并不相同，以致于 time 指令无法取得这些资料。 </P>
<P>把计?G </P>
<P>-o or --output=FILE <BR>设定结果输出档。这个选项会将 time 的输出写入 所指定的档案中。如果档案已经存在，系统将覆写其内容。 <BR>-a or --append <BR>配合 -o 使用，会将结果写到档案的末端，而不会覆盖掉原来的内容。 <BR>-f FORMAT or --format=FORMAT <BR>以 FORMAT 字串设定显示方式。当这个选项没有被设定的时候，会用系统预设的格式。不过你可以用环境变数 time 来设定这个格式，如此一来就不必每次登入系统都要设定一次。 <BR>一般设定上，你可以用 <BR>\t <BR>表示跳栏，或者是用 <BR>\n <BR>表示换行。每一项资料要用 % 做为前导。如果要在字串中使用百分比符号，就用 。（学过 C 语言的人大概会觉得很熟悉） <BR>time 指令可以显示的资源有四大项，分别是： </P>
<P>Time resources <BR>Memory resources <BR>IO resources <BR>Command info </P>
<P>详细的内容如下： </P>
<P><BR>Time Resources <BR>E 执行指令所花费的时间，格式是：[hour]:minute:second。请注意这个数字并不代表实际的 CPU 时间。 <BR>e 执行指令所花费的时间，单位是秒。请注意这个数字并不代表实际的 CPU 时间。 <BR>S 指令执行时在核心模式（kernel mode）所花费的时间，单位是秒。 <BR>U 指令执行时在使用者模式（user mode）所花费的时间，单位是秒。 <BR>P 执行指令时 CPU 的占用比例。其实这个数字就是核心模式加上使用者模式的 CPU 时间除以总时间。 </P>
<P><BR>Memory Resources <BR>M 执行时所占用的实体记忆体的最大值。单位是 KB <BR>t 执行时所占用的实体记忆体的平均值，单位是 KB <BR>K 执行程序所占用的记忆体总量（stack+data+text）的平均大小，单位是 KB <BR>D 执行程序的自有资料区（unshared data area）的平均大小，单位是 KB <BR>p 执行程序的自有堆叠（unshared stack）的平均大小，单位是 KB <BR>X 执行程序间共享内容（shared text）的平均值，单位是 KB <BR>Z 系统记忆体页的大小，单位是 byte。对同一个系统来说这是个常数 </P>
<P><BR>IO Resources <BR>F 此程序的主要记忆体页错误发生次数。所谓的主要记忆体页错误是指某一记忆体页已经置换到置换档（swap file)中，而且已经分配给其他程序。此时该页的内容必须从置换档里再读出来。 <BR>R 此程序的次要记忆体页错误发生次数。所谓的次要记忆体页错误是指某一记忆体页虽然已经置换到置换档中，但尚未分配给其他程序。此时该页的内容并未被破坏，不必从置换档里读出来 <BR>W 此程序被交换到置换档的次数 <BR>c 此程序被强迫中断（像是分配到的 CPU 时间耗尽）的次数 <BR>w 此程序自愿中断（像是在等待某一个 I/O 执行完毕，像是磁碟读取等等）的次数 <BR>I 此程序所输入的档案数 <BR>O 此程序所输出的档案数 <BR>r 此程序所收到的 Socket Message <BR>s 此程序所送出的 Socket Message <BR>k 此程序所收到的信号 ( Signal 数量 </P>
<P><BR>Command Info <BR>C 执行时的参数以及指令名称 <BR>x 指令的结束代码 ( Exit Status&nbsp; </P>
<P>&nbsp;</P>
<P><BR>-p or --portability <BR>这个选项会自动把显示格式设定成为： <BR>real %e <BR>user %U <BR>sys %S <BR>这么做的目的是为了与 POSIX 规格相容。 <BR>-v or --verbose <BR>这个选项会把所有程式中用到的资源通通列出来，不但如一般英文语句，还有说明。对不想花时间去熟习格式设定或是刚刚开始接触这个指令的人相当有用。 </P>
<P>范例： <BR>利用下面的指令 <BR>time -v ps -aux </P>
<P>我们可以获得执行 ps -aux 的结果和所花费的系统资源。如下面所列的资料： <BR>USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND <BR>root 1 0.0 0.4 1096 472 ? S Apr19 0:04 init <BR>root 2 0.0 0.0 0 0 ? SW Apr19 0:00 [kflushd] <BR>root 3 0.0 0.0 0 0 ? SW Apr19 0:00 [kpiod] <BR>...... <BR>root 24269 0.0 1.0 2692 996 pts/3 R 12:16 0:00 ps -aux </P>
<P>Command being timed: "ps -aux" <BR>User time (seconds): 0.05 <BR>System time (seconds): 0.06 <BR>Percent of CPU this job got: 68% <BR>Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.16 <BR>Average shared text size (kbytes): 0 <BR>Average unshared data size (kbytes): 0 <BR>Average stack size (kbytes): 0 <BR>Average total size (kbytes): 0 <BR>Maximum resident set size (kbytes): 0 <BR>Average resident set size (kbytes): 0 <BR>Major (requiring I/O) page faults: 238 <BR>Minor (reclaiming a frame) page faults: 46 <BR>Voluntary context switches: 0 <BR>Involuntary context switches: 0 <BR>Swaps: 0 <BR>File system inputs: 0 <BR>File system outputs: 0 <BR>Socket messages sent: 0 <BR>Socket messages received: 0 <BR>Signals delivered: 0 <BR>Page size (bytes): 4096 <BR>Exit status: 0 </P>
<P>&nbsp;</P>
<P>名称： uptime <BR>使用权限： 所有使用者 <BR>使用方式： uptime [-V] <BR>说明： uptime 提供使用者下面的资讯，不需其他参数： </P>
<P>现在的时间 <BR>系统开机运转到现在经过的时间 <BR>连线的使用者数量 <BR>最近一分钟，五分钟和十五分钟的系统负载 <BR>参数： -V 显示版本资讯。 <BR>范例： uptime <BR>其结果为： <BR>10:41am up 5 days, 10 min, 1 users, load average: 0.00, 0.00, 1.99 </P>
<P>名称：chfn </P>
<P>使用权限：所有使用者 </P>
<P>用法：shell&gt;&gt; chfn </P>
<P>说明：提供使用者更改个人资讯，用于 finger and mail username </P>
<P>范例： </P>
<P>shell&gt;&gt; chfn <BR>Changing finger information for user <BR>Password: [del] <BR>Name[]:Johnney Huang ### 提供 finger 时的资料 <BR>Office[]:NCCU <BR>Office Phone[]: [del] <BR>Home Phone[]: [del] </P>
<P><BR>名称：chsh </P>
<P>使用权限：所有使用者 </P>
<P>用法：shell&gt;&gt; chsh </P>
<P>说明：更改使用者 shell 设定 </P>
<P>范例： </P>
<P>shell&gt;&gt; chsh <BR>Changing fihanging shell for user1 <BR>Password: [del] <BR>New shell [/bin/tcsh]: ### [是目前使用的 shell] <BR>[del] </P>
<P>shell&gt;&gt; chsh -l ### 展示 /etc/shells 档案内容 <BR>/bin/bash <BR>/bin/sh <BR>/bin/ash <BR>/bin/bsh <BR>/bin/tcsh <BR>/bin/csh </P>
<P>&nbsp;</P>
<P>” finger [返回] <BR>名称： finger <BR>使用权限： 所有使用者 </P>
<P>使用方式： finger [options] user[@address] </P>
<P>说明：finger 可以让使用者查询一些其他使用者的资料。会列出来的资料有： </P>
<P>Login Name <BR>User Name <BR>Home directory <BR>Shell <BR>Login status <BR>mail status <BR>.plan <BR>.project <BR>.forward </P>
<P>其中 .plan ，.project 和 .forward 就是使用者在他的 Home Directory 里的 .plan ， .project 和 .forward 等档案里的资料。如果没有就没有。finger 指令并不限定于在同一伺服器上查询，也可以寻找某一个远端伺服器上的使用者。只要给一个像是 E-mail address 一般的地址即可。 <BR>把计?G </P>
<P>-l <BR>多行显示。 </P>
<P>-s <BR>单行显示。这个选项只显示登入名称，真实姓名，终端机名称，闲置时间，登入时间，办公室号码及电话号码。如果所查询的使用者是远端伺服器的使用者，这个选项无效。 </P>
<P>范例：下列指令可以查询本机管理员的资料： <BR>finger root </P>
<P>其结果如下： <BR>Login: root Name: root <BR>Directory: /root Shell: /bin/bash <BR>Never logged in. <BR>No mail. <BR>No Plan. </P>
<P>&nbsp;</P>
<P><BR>名称：last </P>
<P>使用权限：所有使用者 </P>
<P>使用方式：shell&gt;&gt; last [options] </P>
<P>说明：显示系统开机以来获是从每月初登入者的讯息 </P>
<P>把计?G </P>
<P>-R 省略 hostname 的栏位 <BR>-num 展示前 num 个 <BR>username 展示 username 的登入讯息 <BR>tty 限制登入讯息包含终端机代号 </P>
<P>范例： </P>
<P>shell&gt;&gt; last -R -2 <BR>johnney pts/1 Mon Aug 14 20:42 still logged in <BR>johnney pts/0 Mon Aug 14 19:59 still logged in </P>
<P>wtmp begins Tue Aug 1 09:01:10 2000 ### /var/log/wtmp </P>
<P><BR>shell&gt;&gt; last -2 minery <BR>minery pts/0 140.119.217.115 Mon Aug 14 18:37 - 18:40 (00:03) <BR>minery pts/0 140.119.217.115 Mon Aug 14 17:22 - 17:24 (00:02) </P>
<P>wtmp begins Tue Aug 1 09:01:10 2000 </P>
<P>&nbsp;</P>
<P><BR>名称:login </P>
<P>这个命令都不会就不要干算了！呵呵我也不在这里多费笔墨耽误大家美好青春了^_^ </P>
<P>&nbsp;</P>
<P>名称：passwd </P>
<P>使用权限：所有使用者 </P>
<P>使用方式：passwd [-k] [-l] [-u [-f]] [-d] [-S] [username] </P>
<P>说明：用来更改使用者的密码 </P>
<P>参数： <BR>-k </P>
<P>-l </P>
<P>-u </P>
<P>-f </P>
<P>-d 关闭使用者的密码认证功能, 使用者在登入时将可以不用输入密码, 只有具备 root 权限的使用者方可使用. </P>
<P>-S 显示指定使用者的密码认证种类, 只有具备 root 权限的使用者方可使用. </P>
<P>[username] 指定帐号名称. </P>
<P>&nbsp;</P>
<P>名称 : who <BR>使用权线 : 所有使用者都可使用 </P>
<P>使用方式 : who - [husfV] [user] </P>
<P>说明 : 显示系统中有那些使用者正在上面，显示的资料包含了使用者 ID，使用的终端机，从那边连上来的，上线时间，呆滞时间，CPU 使用量，动作等等。 </P>
<P>把计 : </P>
<P>-h : 不要显示标题列 <BR>-u : 不要显示使用者的动作/工作 <BR>-s : 使用简短的格式来显示 <BR>-f : 不要显示使用者的上线位置 <BR>-V : 显示程式版本 </P>
<P><BR>名称：/etc/aliases <BR>使用权限：系统管理者 <BR>使用方式： 请用 newaliases 更新资料库 <BR>说明： <BR>sendmail 会使用一个在 /etc/aliases 中的档案做使用者名称转换的动作。当 sendmail 收到一个要送给 xxx 的信时，它会依据 aliases档的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如 mailing list 就会用到这个功能，在 mailinglist 中，我们可能会创造一个叫 <A href="mailto:redlinux@link.ece.uci.edu">redlinux@link.ece.uci.edu</A> 的 mailinglist，但实际上并没有一个叫 redlinux 的使用者。实际 aliases 档的内容是将送给这个使用者的信都收给 mailing list 处理程式负责分送的工作。 </P>
<P>/etc/aliases 是一个文字模式的档案，sendmail 需要一个二进位格式的 /etc/aliases.db。newaliases 的功能传是将 /etc/aliases 转换成一个 sendmail 所能了解的资料库。范例： <BR># newaliases </P>
<P>下面命令会做相同的事， <BR># sendmail -bi </P>
<P>相关命令: <BR>mail, mailq, newaliases, sendmail </P>
<P>” mail [返回] <BR>名称：mail </P>
<P>使用权限：所有使用者 </P>
<P><BR>使用方式：mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] user1 [user 2 ...] </P>
<P><BR>说明： <BR>mail 不仅只是一个指令， mail 还是一个电子邮件程式，不过利用 mail 来读信的人应该很少吧！对于系统管理者来说 mail 就很有用，因为管理者可以用 mail 写成 script ，定期寄一些备忘录提醒系统的使用者。 </P>
<P><BR>参数： <BR>i 忽略 tty 的中断讯号。 (interrupt) <BR>I 强迫设成互动模式。 (Interactive) <BR>v 列印出讯息，例如送信的地点、状态等等。 (verbose) <BR>n 不读入 mail.rc 设定档。 <BR>s 邮件标题。 <BR>c cc 邮件地址。 <BR>b bcc 邮件地址。 </P>
<P><BR>范例： </P>
<P><BR>将信件送给一个或以上的电子邮件地址，由于没有加入其他的选项，使用者必须输入标题与信件的内容等。而 user2 没有主机位置，就会送给邮件伺服器的 user2 使用者。 </P>
<P>&nbsp;</P>
<P>mail <A href="mailto:user1@email.address">user1@email.address</A> <BR>mail <A href="mailto:user1@email.address">user1@email.address</A> user2 </P>
<P>&nbsp;</P>
<P>将 mail.txt 的内容寄给 user2 同时 cc 给 user1 。如果将这一行指令设成 cronjob 就可以定时将备忘录寄给系统使用者。 </P>
<P>mail -s 标题 -c user1 user2 &lt; mail.txt </P>
<P>&nbsp;</P>
<P>指令：mesg <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : mesg [y|n] </P>
<P>说明 ： 决定是否允许其他人传讯息到自己的终端机介面 </P>
<P><BR>把计 ?G </P>
<P>y : 允许讯息传到终端机介面上。 <BR>n : 不允许讯息传到终端机介面上 。 <BR>如果没有设定，则讯息传递与否则由终端机界面目前状态而定。 </P>
<P>例子 : <BR>改变目前讯息设定，改成不允许讯息传到终端机介面上 : <BR>mesg n </P>
<P><BR>与 mesg 相关的指令有： talk，write，wall。 </P>
<P><BR>名称：/etc/aliases <BR>使用权限：系统管理者 <BR>使用方式： newaliases <BR>说明： <BR>sendmail 会使用一个在 /etc/aliases 中的档案做使用者名称转换的动作。当 sendmail 收到一个要送给 xxx 的信时，它会依据 aliases档的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如 mailing list 就会用到这个功能，在 mailinglist 中，我们可能会创造一个叫 <A href="mailto:redlinux@link.ece.uci.edu">redlinux@link.ece.uci.edu</A> 的 mailinglist，但实际上并没有一个叫 redlinux 的使用者。实际 aliases 档的内容是将送给这个使用者的信都收给 mailing list 处理程式负责分送的工作。 </P>
<P>/etc/aliases 是一个文字模式的档案，sendmail 需要一个二进位格式的 /etc/aliases.db。newaliases 的功能传是将 /etc/aliases 转换成一个 sendmail 所能了解的资料库。 </P>
<P>参数：没有任何参数。 范例： <BR># newaliases </P>
<P>下面命令会做相同的事， <BR># sendmail -bi </P>
<P>相关命令: <BR>mail, mailq, newaliases, sendmail </P>
<P>&nbsp;</P>
<P>名称 : talk <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : </P>
<P>talk person [ttyname] <BR>说明 : 与其他使用者对谈 </P>
<P>把计 : </P>
<P>person : 预备对谈的使用者帐号，如果该使用者在其他机器上，则可输入 <A href="mailto:person@machine.name">person@machine.name</A> <BR>ttyname : 如果使用者同时有两个以上的 tty 连线，可以自行选择合适的 tty 传讯息 </P>
<P>例子.1 : </P>
<P>与现在机器上的使用者Rollaend对谈，此时 Rollaend 只有一个连线 : <BR>talk Rollaend </P>
<P><BR>接下来就是等Rollaend回应，若Rollaend接受，则Rollaend输入 `talk jzlee`即可开始对谈，结束请按 ctrl+c </P>
<P>例子.2 :与linuxfab.cx上的使用者Rollaend对谈，使用pts/2来对谈 : <BR>talk <A href="mailto:Rollaend@linuxfab.cx">Rollaend@linuxfab.cx</A> pts/2</P>
<P><BR>接下来就是等Rollaend回应，若Rollaend接受，则Rollaend输入 `talk <A href="mailto:jzlee@jzlee.home">jzlee@jzlee.home</A>`即可开始对谈，结束请按 ctrl+c </P>
<P>注意 : 若萤幕的字会出现不正常的字元，试着按 ctrl+l 更新萤幕画面。 </P>
<P><BR>名称 : wall <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : </P>
<P>wall [ message ] <BR>使用说明： <BR>wall 会将讯息传给每一个 mesg 设定为 yes 的上线使用者。当使用终端机介面做为标准传入时, 讯息结束时需加上 EOF (通常用 Ctrl+D)?C </P>
<P>例子 : </P>
<P>传讯息"hi" 给每一个使用者 : <BR>wall hi </P>
<P>&nbsp;</P>
<P><BR>名称 : write <BR>使用权限 : 所有使用者 </P>
<P>使用方式 : </P>
<P>write user [ttyname] <BR>说明 : 传讯息给其他使用者 </P>
<P>把计 : </P>
<P>user : 预备传讯息的使用者帐号 <BR>ttyname : 如果使用者同时有两个以上的 tty 连线，可以自行选择合适的 tty 传讯息 </P>
<P>例子.1 : </P>
<P>传讯息给 Rollaend，此时 Rollaend 只有一个连线 : <BR>write Rollaend </P>
<P><BR>接下来就是将讯息打上去，结束请按 ctrl+c </P>
<P>例子.2 :传讯息给 Rollaend，Rollaend 的连线有 pts/2，pts/3 : <BR>write Rollaend pts/2</P>
<P><BR>接下来就是将讯息打上去，结束请按 ctrl+c </P>
<P>注意 : 若对方设定 mesg n，则此时讯席将无法传给对方 </P>
<P>名称：kill <BR>使用权限：所有使用者 </P>
<P>使用方式： </P>
<P>kill [ -s signal | -p ] [ -a ] pid ... <BR>kill -l [ signal ] <BR>说明：kill 送出一个特定的信号 (signal) 给行程 id 为 pid 的行程根据该信号而做特定的动作, 若没有指定, 预设是送出终止 (TERM) 的信号 <BR>把计?G </P>
<P>-s (signal) : 其中可用的讯号有 HUP (1), KILL (9), TERM (15), 分别代表着重跑, 砍掉, 结束; 详细的信号可以用 kill -l <BR>-p : 印出 pid , 并不送出信号 <BR>-l (signal) : 列出所有可用的信号名称 <BR>范例： </P>
<P>将 pid 为 323 的行程砍掉 (kill) : <BR>kill -9 323 </P>
<P>将 pid 为 456 的行程重跑 (restart) : <BR>kill -HUP 456 </P>
<P>&nbsp;</P>
<P><BR>名称：nice <BR>使用权限：所有使用者 </P>
<P>使用方式：nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command [arg...]] </P>
<P>说明：以更改过的优先序来执行程式, 如果未指定程式, 则会印出目前的排程优先序, 内定的 adjustment 为 10, 范围为 -20 (最高优先序) 到 19 (最低优先序) </P>
<P><BR>把计?G </P>
<P>-n adjustment, -adjustment, --adjustment=adjustment 皆为将该原有优先序的增加 adjustment <BR>--help 显示求助讯息 <BR>--version 显示版本资讯 <BR>范例： <BR>将 ls 的优先序加 1 并执行 : <BR>nice -n 1 ls </P>
<P>将 ls 的优先序加 10 并执行 : <BR>nice ls将 ls 的优先序加 10 并执行 </P>
<P>注意 : 优先序 (priority) 为作业系统用来决定 CPU 分配的参数，Linux 使用『回合制(round-robin)』的演算法来做 CPU 排程，优先序越高，所可能获得的 CPU时间就越多。 </P>
<P>&nbsp;</P>
<P>名称：ps <BR>使用权限：所有使用者 <BR>使用方式：ps [options] [--help] <BR>说明：显示瞬间行程 (process) 的动态 <BR>参数： <BR>ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 <BR>-A 列出所有的行程 <BR>-w 显示加宽可以显示较多的资讯 <BR>-au 显示较详细的资讯 <BR>-aux 显示所有包含其他使用者的行程 </P>
<P>au(x) 输出格式 : </P>
<P>USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND <BR>USER: 行程拥有者 <BR>PID: pid <BR>%CPU: 占用的 CPU 使用率 <BR>%MEM: 占用的记忆体使用率 <BR>VSZ: 占用的虚拟记忆体大小 <BR>RSS: 占用的记忆体大小 <BR>TTY: 终端的次要装置号码 (minor device number of tty) <BR>STAT: 该行程的状态: <BR>D: 不可中断的静止 (通悸□□缜b进行 I/O 动作) <BR>R: 正在执行中 <BR>S: 静止状态 <BR>T: 暂停执行 <BR>Z: 不存在但暂时无法消除 <BR>W: 没有足够的记忆体分页可分配 <BR>&lt;: 高优先序的行程 <BR>N: 低优先序的行程 <BR>L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O) <BR>START: 行程开始时间 <BR>TIME: 执行的时间 <BR>COMMAND:所执行的指令 </P>
<P>范例： </P>
<P>ps <BR>PID TTY TIME CMD <BR>2791 ttyp0 00:00:00 tcsh <BR>3092 ttyp0 00:00:00 ps <BR>% ps -A <BR>PID TTY TIME CMD <BR>1 ? 00:00:03 init <BR>2 ? 00:00:00 kflushd <BR>3 ? 00:00:00 kpiod <BR>4 ? 00:00:00 kswapd <BR>5 ? 00:00:00 mdrecoveryd <BR>....... <BR>% ps -aux <BR>USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND <BR>root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3] <BR>root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd] <BR>root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod] <BR>root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd] <BR>........ </P>
<P>&nbsp;</P>
<P>名称：pstree <BR>使用权限：所有使用者 <BR>使用方式： <BR>pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user] <BR>pstree -V <BR>说明：将所有行程以树状图显示, 树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root) ,如果有指定使用者 id , 则树状图会只显示该使用者所拥有的行程 <BR>参数： <BR>-a 显示该行程的完整指令及参数, 如果是被记忆体置换出去的行程则会加上括号 <BR>-c 如果有重覆的行程名, 则分开列出 (预设值是会在前面加上 * <BR>范例： </P>
<P>pstree </P>
<P>init-+-amd <BR>|-apmd <BR>|-atd <BR>|-httpd---10*[httpd] <BR>%pstree -p <BR>init(1)-+-amd(447) <BR>|-apmd(105) <BR>|-atd(339) <BR>%pstree -c <BR>init-+-amd <BR>|-apmd <BR>|-atd <BR>|-httpd-+-httpd <BR>| |-httpd <BR>| |-httpd <BR>| |-httpd <BR>.... </P>
<P>&nbsp;</P>
<P>名称：renice <BR>使用权限：所有使用者 </P>
<P>使用方式：renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...] </P>
<P>说明：重新指定一个或多个行程(Process)的优先序(一个或多个将根据所下的参数而定) </P>
<P>把计?G </P>
<P>-p pid 重新指定行程的 id 为 pid 的行程的优先序 <BR>-g pgrp 重新指定行程群组(process group)的 id 为 pgrp 的行程 (一个或多个) 的优先序 <BR>-u user 重新指定行程拥有者为 user 的行程的优先序 <BR>范例： <BR>将行程 id 为 987 及 32 的行程与行程拥有者为 daemon 及 root 的优先序号码加 1 : <BR>renice +1 987 -u daemon root -p 32 </P>
<P>注意 : 每一个行程(Process)都有一个唯一的 (unique) id?C </P>
<P>&nbsp;</P>
<P>名称：top <BR>使用权限：所有使用者 </P>
<P>使用方式：top [-] [d delay] [q] [c] [S] [s]&nbsp; [n]&nbsp; </P>
<P>说明：即时显示 process 的动态 </P>
<P>把计?G </P>
<P>d : 改变显示的更新速度，或是在交谈式指令列( interactive command)按 s <BR>q : 没有任何延迟的显示速度，如果使用者是有 superuser 的权限，则 top 将会以最高的优先序执行 <BR>c : 切换显示模式，共有两种模式，一是只显示执行档的名称，另一种是显示完整的路径与名称S : 累积模式，会将己完成或消失的子行程 ( dead child process&nbsp; 的 CPU time 累积起来 <BR>s : 安全模式，将交谈式指令取消, 避免潜在的危机 <BR>i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程 <BR>n : 更新的次数，完成后将会退出 top <BR>b : 批次档模式，搭配 "n" 参数一起使用，可以用来将 top 的结果输出到档案内 </P>
<P>范例： <BR>显示更新十次后退出 ; <BR>top -n 10 </P>
<P>使用者将不能利用交谈式指令来对行程下命令 : <BR>top -s </P>
<P>将更新显示二次的结果输入到名称为 top.log 的档案里 : <BR>top -n 2 -b &lt; top.log </P>
<P>名称：skill </P>
<P>使用权限：所有使用者 </P>
<P>使用方式： skill [signal to send] [options] 选择程序的规则 </P>
<P>说明： </P>
<P>送个讯号给正在执行的程序,预设的讯息为 TERM (中断) , 较常使用的讯息为 HUP , INT , KILL , STOP , CONT ,和 0 </P>
<P>讯息有三种写法:分别为 -9 , -SIGKILL , -KILL , 可以使用 -l 或 -L 已列出可使用的讯息。 </P>
<P>一般参数： </P>
<P>-f 快速模式/尚未完成 </P>
<P>-i 互动模式/ 每个动作将要被确认 </P>
<P>-v 详细输出/ 列出所选择程序的资讯 </P>
<P>-w 智能警告讯息/ 尚未完成 </P>
<P>-n 没有动作/ 显示程序代号 </P>
<P>参数：选择程序的规则可以是, 终端机代号,使用者名称,程序代号,命令名称。 </P>
<P>-t 终端机代号 ( tty 或 pty&nbsp; </P>
<P>-u 使用者名称 </P>
<P>-p 程序代号 ( pid&nbsp; </P>
<P>-c 命令名称 可使用的讯号: </P>
<P>以下列出已知的讯号名称,讯号代号,功能。 </P>
<P>名称 (代号) 功能/ 描述 </P>
<P>ALRM 14 离开 </P>
<P>HUP 1 离开 </P>
<P>INT 2 离开 </P>
<P>KILL 9 离开/ 强迫关闭 </P>
<P>PIPE 13 离开 </P>
<P>POLL 离开 </P>
<P>PROF 离开 </P>
<P>TERM 15 离开 </P>
<P>USR1 离开 </P>
<P>USR2 离开 </P>
<P>VTALRM 离开 </P>
<P>STKFLT 离开/ 只适用于i386, m68k, arm 和 ppc 硬体 </P>
<P>UNUSED 离开/ 只适用于i386, m68k, arm 和 ppc 硬体 </P>
<P>TSTP 停止 /产生与内容相关的行为 </P>
<P>TTIN 停止 /产生与内容相关的行为 </P>
<P>TTOU 停止 /产生与内容相关的行为 </P>
<P>STOP 停止 /强迫关闭 </P>
<P>CONT 从新启动 /如果在停止状态则从新启动,否则忽略 </P>
<P>PWR 忽略 /在某些系统中会离开 </P>
<P>WINCH 忽略 </P>
<P>CHLD 忽略 </P>
<P>ABRT 6 核心 </P>
<P>FPE 8 核心 </P>
<P>ILL 4 核心 </P>
<P>QUIT 3 核心 </P>
<P>SEGV 11 核心 </P>
<P>TRAP 5 核心 </P>
<P>SYS 核心 /或许尚未实作 </P>
<P>EMT 核心 /或许尚未实作 </P>
<P>BUS 核心 /核心失败 </P>
<P>XCPU 核心 /核心失败 </P>
<P>XFSZ 核心 /核心失败 </P>
<P>范例： </P>
<P>停止所有在 PTY 装置上的程序 <BR>skill -KILL -v pts/* </P>
<P>停止三个使用者 user1 , user2 , user3 <BR>skill -STOP user1 user2 user3 </P>
<P>&nbsp;</P>
<P>其他相关的命令: kill </P>
<P>&nbsp;</P>
<P>名称：expr </P>
<P>使用权限：所有使用者 <BR>### 字串长度 </P>
<P>shell&gt;&gt; expr length "this is a test" <BR>14 </P>
<P>### 数字商数 </P>
<P>shell&gt;&gt; expr 14 % 9 <BR>5 </P>
<P>### 从位置处抓取字串 </P>
<P>shell&gt;&gt; expr substr "this is a test" 3 5 <BR>is is </P>
<P>### 数字串 only the first character </P>
<P>shell&gt;&gt; expr index "testforthegame" e <BR>2 </P>
<P>### 字串真实重现 </P>
<P>shell&gt;&gt; expr quote thisisatestformela <BR>thisisatestformela </P>
<P>&nbsp;</P>
<P><BR>名称: tr </P>
<P>### 1.比方说要把目录下所有的大写档名换为小写档名? </P>
<P>似乎有很多方式，"tr"是其中一种: </P>
<P>#!/bin/sh </P>
<P>dir="/tmp/testdir"; <BR>files=`find $dir -type f`; <BR>for i in $files <BR>do <BR>dir_name=`dirname $i`; <BR>ori_filename=`basename $i` <BR>new_filename=`echo $ori_filename | tr [:upper:] [:lower:]` &gt; /dev/null; <BR>#echo $new_filename; <BR>mv $dir_name/$ori_filename $dir_name/$new_filename <BR>done </P>
<P><BR>### 2.自己试验中...lowercase to uppercase </P>
<P>tr abcdef...[del] ABCDE...[del] <BR>tr a-z A-Z <BR>tr [:lower:] [:upper:] </P>
<P>shell&gt;&gt; echo "this is a test" | tr a-z A-Z &gt; www <BR>shell&gt;&gt; cat www <BR>THIS IS A TEST </P>
<P>### 3.去掉不想要的字串 </P>
<P>shell&gt;&gt; tr -d this ### 去掉有关 t.e.s.t <BR>this </P>
<P>man <BR>man <BR>test <BR>e </P>
<P>### 4.取代字串 </P>
<P>shell&gt;&gt; tr -s "this" "TEST" <BR>this <BR>TEST <BR>th <BR>TE </P>
<P>&nbsp;</P>
<P><BR>指令：clear <BR>用途：清除萤幕用。 </P>
<P>使用方法：在 console 上输入 clear。 </P>
<P><BR>名称: reset, tset <BR>使用方法: tset [-IQqrs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal] </P>
<P>使用说明: </P>
<P>reset 其实和 tset 是一同个命令，它的用途是设定终端机的状态。一般而言，这个命令会自动的从环境变数、命令列或是其它的组态档决定目前终端机的型态。如果指定型态是 ? 的话，这个程式会要求使用者输入终端机的型别。 </P>
<P>由于这个程式会将终端机设回原始的状态，除了在 login 时使用外，当系统终端机因为程式不正常执行而进入一些奇怪的状态时，你也可以用它来重设终端机o 例如不小心把二进位档用 cat 指令进到终端机，常会有终端机不再回应键盘输入，或是回应一些奇怪字元的问题。此时就可以用 reset 将终端机回复至原始状态。选项说明: </P>
<P><BR>-p <BR>将终端机类别显示在萤幕上，但不做设定的动作。这个命令可以用来取得目前终端机的类别。 <BR>-e ch <BR>将 erase 字元设成 ch <BR>-i ch <BR>将中断字元设成 ch <BR>-k ch <BR>将删除一行的字元设成 ch <BR>-I <BR>不要做设定的动作，如果没有使用选项 -Q 的话，erase、中断及删除字元的目前值依然会送到萤幕上。 <BR>-Q <BR>不要显示 erase、中断及删除字元的值到萤幕上。 <BR>-r <BR>将终端机类别印在萤幕上。 <BR>-s <BR>将设定 TERM 用的命令用字串的型式送到终端机中，通常在 .login 或 .profile 中用 <BR>范例: <BR>让使用者输入一个终端机型别并将终端机设到该型别的预设状态。 <BR># reset ? </P>
<P>&nbsp;</P>
<P>将 erase 字元设定 control-h <BR># reset -e ^B </P>
<P>&nbsp;</P>
<P>将设定用的字串显示在萤幕上 <BR># reset -s <BR>Erase is control-B (^B). <BR>Kill is control-U (^U). <BR>Interrupt is control-C (^C). <BR>TERM=xterm; </P>
<P>名称：compress </P>
<P>使用权限：所有使用者 </P>
<P><BR>使用方式：compress [-dfvcV] [-b maxbits] [file ...] </P>
<P><BR>说明： <BR>compress 是一个相当古老的 unix 档案压缩指令，压缩后的档案会加上一个 .Z 延伸档名以区别未压缩的档案，压缩后的档案可以以 uncompress 解压。若要将数个档案压成一个压缩档，必须先将档案 tar 起来再压缩。由于 gzip 可以产生更理想的压缩比例，一般人多已改用 gzip 为档案压缩工具。 </P>
<P><BR>参数： <BR>c 输出结果至标准输出设备（一般指荧幕） <BR>f 强迫写入档案，若目的档已经存在，则会被覆盖 (force) <BR>v 将程式执行的讯息印在荧幕上 (verbose) <BR>b 设定共同字串数的上限，以位元计算，可以设定的值为 9 至 16 bits 。由于值越大，能使用的共同字串就 越多，压缩比例就越大，所以一般使用预设值 16 bits (bits) <BR>d 将压缩档解压缩 <BR>V 列出版本讯息 </P>
<P><BR>范例： </P>
<P><BR>将 source.dat 压缩成 source.dat.Z ，若 source.dat.Z 已经存在，内容则会被压缩档覆盖。 </P>
<P>&nbsp;</P>
<P>compress -f source.dat </P>
<P>&nbsp;</P>
<P>将 source.dat 压缩成 source.dat.Z ，并列印出压缩比例。 <BR>-v 与 -f 可以一起使用 </P>
<P>&nbsp;</P>
<P>compress -vf source.dat </P>
<P>&nbsp;</P>
<P>将压缩后的资料输出后再导入 target.dat.Z 可以改变压缩档名。 </P>
<P>&nbsp;</P>
<P>compress -c source.dat &gt; target.dat.Z </P>
<P>&nbsp;</P>
<P>-b 的值越大，压缩比例就越大，范围是 9-16 ，预设值是 16 。 </P>
<P>&nbsp;</P>
<P>compress -b 12 source.dat </P>
<P>&nbsp;</P>
<P>将 source.dat.Z 解压成 source.dat ，若档案已经存在，使用者按 y 以确定覆盖档案，若使用 -df 程式则会自动覆盖档案。由于系统会自动加入 .Z 为延伸档名，所以 source.dat 会自动当作 source.dat.Z 处理。 </P>
<P>&nbsp;</P>
<P>compress -d source.dat <BR>compress -d source.dat.Z </P>
<P>&nbsp;</P>
<P><BR>名称： lpd </P>
<P>使用权限： 所有使用者 </P>
<P>使用方式：lpd [-l] [#port] <BR>lpd 是一个常驻的印表机管理程式，它会根据 /etc/printcap 的内容来管理本地或远端的印表机。/etc/printcap 中定义的每一个印表机必须在 /var/lpd 中有一个相对应的目录，目录中以 cf 开头的档案表示一个等待送到适当装置的印表工作。这个档案通常是由 lpr 所产生。 </P>
<P>lpr 和 lpd 组成了一个可以离线工作的系统，当你使用 lpr 时，印表机不需要能立即可用，甚至不用存在。lpd 会自动监视印表机的状况，当印表机上线后，便立即将档案送交处理。这个得所有的应用程式不必等待印表机完成前一工作。 </P>
<P>参数： </P>
<P><BR>-l: 将一些除错讯息显示在标准输出上。 <BR>#port: 一般而言，lpd 会使用 getservbyname 取得适当的 TCP/IP port，你可以使用这个参数强迫 lpd 使用指定的 port。 </P>
<P>范例： <BR>这个程式通常是由 /etc/rc.d 中的程式在系统启始阶段执行。 </P>
<P>&nbsp;</P>
<P>名称 lpq <BR>-- 显示列表机贮列中未完成的工作 用法 </P>
<P>lpq [l] [P] [user] </P>
<P>说明 <BR>lpq 会显示由 lpd 所管理的列表机贮列中未完成的项目。 </P>
<P>范例 <BR>范例 1. 显示所有在 lp 列表机贮列中的工作 </P>
<P><BR># lpq -PlpRank Owner Job Files Total Size1st root 238 (standard input) 1428646 bytes </P>
<P>&nbsp;</P>
<P><BR>相关函数 <BR>lpr,lpc,lpd </P>
<P>&nbsp;</P>
<P>名称： lpr </P>
<P>使用权限： 所有使用者 </P>
<P>使用方式：lpr [ -P printer ] <BR>将档案或是由标准输入送进来的资料送到印表机贮列之中，印表机管理程式 lpd 会在稍后将这个档案送给适当的程式或装置处理。lpr 可以用来将料资送给本地或是远端的主机来处理。 </P>
<P>参数： </P>
<P><BR>-p Printer: 将资料送至指定的印表机 Printer，预设值为 lp。 </P>
<P>范例： <BR>将 <A href="http://www.c">www.c</A> 和 kkk.c 送到印表机 lp。 <BR>lpr -Plp <A href="http://www.c">www.c</A> kkk.c </P>
<P>&nbsp;</P>
<P><BR>名称: lprm <BR>-- 将一个工作由印表机贮列中移除 用法 </P>
<P>/usr/bin/lprm [P] [file...] </P>
<P>说明 <BR>尚未完成的印表机工作会被放在印表机贮列之中，这个命令可用来将常未送到印表机的工作取消。由于每一个印表机都有一个独立的贮列，你可以用 -P 这个命令设定想要作用的印列机。如果没有设定的话，会使用系统预设的印表机。 </P>
<P>这个命令会检查使用者是否有足够的权限删除指定的档案，一般而言，只有档案的拥有者或是系统管理员才有这个权限。 </P>
<P>范例 <BR>将印表机 hpprinter 中的第 1123 号工作移除 </P>
<P><BR>lprm -Phpprinter 1123 </P>
<P><BR>将第 1011 号工作由预设印表机中移除 </P>
<P><BR>lprm 1011 </P>
<P>&nbsp;</P>
<P><BR>名称： fdformat </P>
<P>使用权限： 所有使用者 </P>
<P>使用方式：fdformat [-n] device </P>
<P>使用说明 : <BR>对指定的软碟机装置进行低阶格式化。使用这个指令对软碟格式化的时候，最好指定像是下面的装置： </P>
<P><BR>/dev/fd0d360 磁碟机 A: ，磁片为 360KB 磁碟 <BR>/dev/fd0h1440 磁碟机 A: ，磁片为 1.4MB 磁碟 <BR>/dev/fd1h1200 磁碟机 B: ，磁片为 1.2MB 磁碟 <BR>如果使用像是 /dev/fd0 之类的装置，如果里面的磁碟不是标准容量，格式化可能会失败。在这种情况之下，使用者可以用 setfdprm 指令先行指定必要参数。 </P>
<P>参数： </P>
<P><BR>-n 关闭确认功能。这个选项会关闭格式化之后的确认步骤。 </P>
<P>范例： </P>
<P>fdformat -n /dev/fd0h1440 </P>
<P>将磁碟机 A 的磁片格式化成 1.4MB 的磁片。并且省略确认的步骤。 </P>
<P>&nbsp;</P>
<P>名称： mformat </P>
<P>使用权限： 所有使用者 </P>
<P>使用方式： </P>
<P>mformat [-t cylinders] [-h heads] [-s sectors] [-l volume_label] [-F] [-I fsVer-sion] [-S sizecode] [-2 sectors_on_track_0] [-M software_sector_size] [-a] [-X] [-C] [-H hidden_sectors] [-r root_sectors] [-B boot_sector] [-0 rate_on_track_0] [-A rate_on_other_tracks] [-1] [-k] drive: </P>
<P>在已经做过低阶格式化的磁片上建立 DOS 档案系统。如果在编译 mtools 的时候把 USE_2M 的参数打开，部分与 2M 格式相关的参数就会发生作用。否则这些参数（像是 S,2,1,M）不会发生作用。 </P>
<P>参数： </P>
<P>-t 磁柱（synlider）数 <BR>-h 磁头（head）数 <BR>-s 每一磁轨的磁区数 <BR>-l 标签 <BR>-F 将磁碟格式化为 FAT32 格式，不过这个参数还在实验中。 <BR>-I 设定 FAT32 中的版本号。这当然也还在实验中。 <BR>-S 磁区大小代码，计算方式为 sector = 2^(大小代码+7) <BR>-c 磁丛（cluster）的磁区数。如果所给定的数字会导致磁丛数超过 FAT 表的限制，mformat 会自动放大磁区数。 <BR>-s <BR>-M 软体磁区大小。这个数字就是系统回报的磁区大小。通常是和实际的大小相同。 <BR>-a 如果加上这个参数，mformat 会产生一组 Atari 系统的序号给这块软碟。 <BR>-X 将软碟格式化成 XDF 格式。使用前必须先用 xdfcopy 指令对软碟作低阶格式化的动作。 <BR>-C 产生一个可以安装 MS-DOS 档案系统的磁碟影像档（disk image）。当然对一个实体磁碟机下这个参数是没有意义的。 <BR>-H 隐藏磁区的数目。这通常适用在格式化硬碟的分割区时，因为通常一个分割区的前面还有分割表。这个参数未经测试，能不用就不用。 <BR>-n 磁碟序号 <BR>-r 根目录的大小，单位是磁区数。这个参数只对 FAT12 和 FAT16 有效。 <BR>-B 使用所指定的档案或是设备的开机磁区做为这片磁片或分割区的开机磁区。当然当中的硬体参数会随之更动。 <BR>-k 尽量保持原有的开机磁区。 <BR>-0 第 0 轨的资料传输率 <BR>-A 第 0 轨以外的资料传输率 <BR>-2 使用 2m 格式 <BR>-1 不使用 2m 格式 </P>
<P>范例： <BR>mformat a: </P>
<P>这样会用预设值把 a: （就是 /dev/fd0）里的磁碟片格式化。 </P>
<P>&nbsp;</P>
<P>名称： mkdosfs </P>
<P>使用权限： 所有使用者 </P>
<P>使用方式： mkdosfs [ -c | -l filename ] <BR>[ -f number_of_FATs ] <BR>[ -F FAT_size ] <BR>[ -i volume_id ] <BR>[ -m message_file ] <BR>[ -n volume_name ] <BR>[ -r root_dir_entry ] <BR>[ -s sector_per_cluster ] <BR>[ -v ] <BR>device <BR>[ block_count ] </P>
<P>&nbsp;</P>
<P>说明： 建立 DOS 档案系统。 device 指你想要建立 DOS 档案系统的装置代号。像是 /dev/hda1 等等。 block_count 则是你希望配置的区块数。如果 block_count 没有指定则系统会自动替你计算符合该装置大小的区块数。 </P>
<P>参数： </P>
<P><BR>-c 建立档案系统之前先检查是否有坏轨。 <BR>-l 从得定的档案中读取坏轨记录。 <BR>-f 指定档案配置表（FAT , File Allocation Table)的数量。预设值为 2 。目前 Linux 的 FAT 档案系统不支援超过 2 个 FAT 表。通常这个不需要改。 <BR>-F 指定 FAT 表的大小，通常是 12 或是 16 个位元组。12 位元组通常用于磁碟片，16 位元组用于一般硬碟的分割区，也就是所谓的 FAT16 格式。这个值通常系统会自己选定适当的值。在磁碟片上用 FAT16 通常不会发生作用，反之在硬碟上用 FAT12 亦然。 <BR>-i 指定 Volume ID。一般是一个 4 个位元组的数字，像是 2e203a47 。如果不给系统会自己产生。 <BR>-m 当使用者试图用这片磁片或是分割区开机，而上面没有作业系统时，系统会给使用者一段警告讯息。这个参数就是用来变更这个讯息的。你可以先用档案编辑好，然后用这个参数指定，或是用 <BR>-m - <BR>这样系统会要求你直接输入这段文字。要特别注意的是，档案里的字串长度不要超过 418 个字，包括展开的跳栏符号（TAB）和换行符号（换行符号在 DOS 底下算两个字元！） <BR>-n 指定 Volume Name，就是磁碟标签。如同在 DOS 底下的 format 指令一样，给不给都可以。没有预设值。 <BR>-r 指定根目录底下的最大档案数。这里所谓的档案数包括目录。预设值是在软碟上是 112 或是 224 ，在硬碟上是 512。没事不要改这个数字。 <BR>-s 每一个磁丛（cluster）的磁区数。必须是 2 的次方数。不过除非你知道你在作什么，这个值不要乱给。 <BR>-v 提供额外的讯息 </P>
<P>范例： <BR>mkdosfs -n Tester /dev/fd0 将 A 槽里的磁碟片格式化为 DOS 格式，并将标签设为 Tester&nbsp; </P><img src ="http://www.blogjava.net/cymao/aggbug/29088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-01-24 12:22 <a href="http://www.blogjava.net/cymao/archive/2006/01/24/29088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式详述</title><link>http://www.blogjava.net/cymao/archive/2006/01/24/29084.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Tue, 24 Jan 2006 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/01/24/29084.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/29084.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/01/24/29084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/29084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/29084.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=1 cellPadding=4 width="100%" bgColor=#cccccc border=0>
<TBODY>
<TR vAlign=top bgColor=#eeeeee>
<TD style="WORD-BREAK: break-all" width="96%">
<TABLE cellSpacing=0 cellPadding=2 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="90%"><FONT face=arial,sans-serif color=#000000 size=-1><B>正则表达式详述</B> </FONT></TD>
<TD noWrap width="10%"><FONT face=arial,sans-serif color=#000000 size=-1></FONT></TD></TR></TBODY></TABLE></TD>
<TD style="WORD-BREAK: break-all" vAlign=top noWrap align=middle width="1%">
<TABLE cellSpacing=0 cellPadding=2 border=0>
<TBODY>
<TR>
<TD><A title=回复此消息 href="http://www.g-nb.com/forums/post.jsp?forum=13&amp;thread=162&amp;message=302&amp;reply=true"></A></TD>
<TD><FONT face=arial,sans-serif size=-1></FONT></TD></TR></TBODY></TABLE></TD></TR>
<TR bgColor=#eeeeee>
<TD style="WORD-BREAK: break-all" vAlign=top width="99%" colSpan=2><FONT face=arial,sans-serif color=#000000 size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;正则表达式是regular&nbsp;expression，看来英文比中文要好理解多了，就是检查表达式符<BR>不符合规定！！正则表达式有一个功能十分强大而又十分复杂的对象RegExp，在javascript1.2&nbsp;版本以<BR>上提供。<BR>&nbsp;&nbsp;&nbsp;&nbsp;下面我们看看有关正则表达式的介绍：<BR>正则表达式对象用来规范一个规范的表达式(也就是表达式符不符合特定的要求，比如是不是Email<BR>地址格式等)，它具有用来检查给出的字符串是否符合规则的属性和方法。<BR>除此之外，你用RegExp构造器建立的个别正则表达式对象的属性，就已经预先定义好了正则表达式<BR>对象的静态属性，你可以随时使用它们。<BR>核心对象：<BR>在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供。<BR>在javascript&nbsp;1.3以后版本增加了toSource方法。<BR>建立方法：<BR>文字格式或RegExp构造器函数。<BR>文字建立格式使用以下格式：<BR>/pattern/flags即/模式/标记<BR><BR>构造器函数方法使用方法如下：<BR>new&nbsp;RegExp("pattern"[,&nbsp;"flags"])即new&nbsp;RegExp("模式"[,"标记"])<BR><BR>参数：<BR>pattern(模式)<BR>表示正则表达式的文本<BR><BR>flags(标记)<BR>如果指定此项，flags可以是下面值之一：<BR>g:&nbsp;global&nbsp;match(全定匹配)<BR>i:&nbsp;ignore&nbsp;case(忽略大小写)<BR>gi:&nbsp;both&nbsp;global&nbsp;match&nbsp;and&nbsp;ignore&nbsp;case(匹配所有可能的值，也忽略大小写)<BR><BR>注意：文本格式中的参数不要使用引号标记，而构造器函数的参数则要使用引号标记。所以下面的<BR>表达式建立同样的正则表达式：<BR>/ab+c/i<BR>　　new&nbsp;RegExp("ab+c",&nbsp;"i")<BR><BR>描述：<BR>当使用构造函数的时候，必须使用正常的字符串避开规则(在字符串中加入前导字符\&nbsp;<IMG src="http://www.g-nb.com/forums/images/emoticons/wink.gif" border=0>是必须的。<BR>例如，下面的两条语句是等价的：<BR>re&nbsp;=&nbsp;new&nbsp;RegExp("\\w+")<BR>re&nbsp;=&nbsp;/\w+/<BR><BR>下面的提供了在正则表达式中能够使用的完整对特殊字符的一个完整的列表和描述。<BR><BR>表1.3：正则表达式中的特殊字符：<BR><BR>字符\<BR>意义：对于字符，通常表示按字面意义，指出接着的字符为特殊字符，\不作解释。<BR>例如：/b/匹配字符'b',通过在b&nbsp;前面加一个反斜杠\，也就是/\b/，则该字符变成特殊字符，表示<BR>匹配一个单词的分界线。<BR>或者：&nbsp;<BR>对于几个字符，通常说明是特殊的，指出紧接着的字符不是特殊的，而应该按字面解释。<BR>例如：*是一个特殊字符，匹配任意个字符(包括0个字符)；例如：/a*/意味匹配0个或多个a。<BR>为了匹配字面上的*，在a前面加一个反斜杠；例如：/a\*/匹配'a*'。<BR><BR>字符^<BR>意义：表示匹配的字符必须在最前边。<BR>例如：/^A/不匹配"an&nbsp;A,"中的'A'，但匹配"An&nbsp;A."中最前面的'A'。<BR><BR>字符$<BR>意义：与^类似，匹配最末的字符。<BR>例如：/t$/不匹配"eater"中的't'，但匹配"eat"中的't'。<BR><BR>字符*<BR>意义：匹配*前面的字符0次或n次。<BR>例如:/bo*/匹配"A&nbsp;ghost&nbsp;booooed"中的'boooo'或"A&nbsp;bird&nbsp;warbled"中的'b'，但不匹配"A&nbsp;goat&nbsp;g<BR>runted"中的任何字符。<BR><BR>字符+<BR>意义：匹配+号前面的字符1次或n次。等价于{1,}。<BR>例如：/a+/匹配"candy"中的'a'和"caaaaaaandy."中的所有'a'。<BR><BR>字符?<BR>意义：匹配?前面的字符0次或1次。<BR>例如：/e?le?/匹配"angel"中的'el'和"angle."中的'le'。<BR><BR>字符.<BR>意义：(小数点)匹配除换行符外的所有单个的字符。<BR>例如：/.n/匹配"nay,&nbsp;an&nbsp;apple&nbsp;is&nbsp;on&nbsp;the&nbsp;tree"中的'an'和'on'，但不匹配'nay'。<BR><BR><BR>字符(x)<BR>意义：匹配'x'并记录匹配的值。<BR>例如：/(foo)/匹配和记录"foo&nbsp;bar."中的'foo'。匹配子串能被结果数组中的素[1],&nbsp;...,&nbsp;[n]&nbsp;返<BR>回，或被RegExp对象的属性$1,&nbsp;...,&nbsp;$9返回。<BR><BR>字符x|y<BR>意义：匹配'x'或者'y'。<BR>例如：/green|red/匹配"green&nbsp;apple"中的'green'和"red&nbsp;apple."中的'red'。<BR><BR>字符{n}<BR>意义：这里的n是一个正整数。匹配前面的n个字符。<BR>例如：/a{2}/不匹配"candy,"中的'a'，但匹配"caandy,"&nbsp;中的所有'a'和"caaandy."中前面的两个<BR>'a'。<BR><BR>字符{n,}<BR>意义：这里的n是一个正整数。匹配至少n个前面的字符。<BR>例如：/a{2,}不匹配"candy"中的'a'，但匹配"caandy"中的所有'a'和"caaaaaaandy."中的所有'a'<BR><BR>字符{n,m}<BR>意义：这里的n和m都是正整数。匹配至少n个最多m个前面的字符。<BR>例如：/a{1,3}/不匹配"cndy"中的任何字符，但匹配&nbsp;"candy,"中的'a'，"caandy,"&nbsp;中的前面两个<BR>'a'和"caaaaaaandy"中前面的三个'a'，注意：即使"caaaaaaandy"&nbsp;中有很多个'a'，但只匹配前面的三<BR>个'a'即"aaa"。<BR><BR>字符[xyz]<BR>意义：一字符列表，匹配列出中的任一字符。你可以通过连字符-指出一个字符范围。<BR>例如：[abcd]跟[a-c]一样。它们匹配"brisket"中的'b'和"ache"中的'c'。<BR><BR>字符[^xyz]<BR>意义：一字符补集，也就是说，它匹配除了列出的字符外的所有东西。&nbsp;你可以使用连字符-指出一<BR>字符范围。<BR>例如：[^abc]和[^a-c]等价，它们最早匹配"brisket"中的'r'和"chop."中的'h'。<BR><BR>字符[\b]<BR>意义：匹配一个空格(不要与\b混淆)<BR><BR>字符\b<BR>意义：匹配一个单词的分界线，比如一个空格(不要与[\b]混淆)<BR>例如：/\bn\w/匹配"noonday"中的'no'，/\wy\b/匹配"possibly&nbsp;yesterday."中的'ly'。<BR><BR>字符\B<BR>意义：匹配一个单词的非分界线<BR>例如：/\w\Bn/匹配"noonday"中的'on'，/y\B\w/匹配"possibly&nbsp;yesterday."中的'ye'。<BR><BR>字符\cX<BR>意义：这里的X是一个控制字符。匹配一个字符串的控制字符。<BR>例如：/\cM/匹配一个字符串中的control-M。<BR><BR>字符\d<BR>意义：匹配一个数字，等价于[0-9]。<BR>例如：/\d/或/[0-9]/匹配"B2&nbsp;is&nbsp;the&nbsp;suite&nbsp;number."中的'2'。<BR><BR>字符\D<BR>意义：匹配任何的非数字，等价于[^0-9]。<BR>例如：/\D/或/[^0-9]/匹配"B2&nbsp;is&nbsp;the&nbsp;suite&nbsp;number."中的'B'。<BR><BR>字符\f<BR>意义：匹配一个表单符<BR><BR>字符\n<BR>意义：匹配一个换行符<BR><BR>字符\r<BR>意义：匹配一个回车符<BR><BR>字符\s<BR>意义：匹配一个单个white空格符，包括空格，tab，form&nbsp;feed，换行符，等价于[&nbsp;<IMG src="http://www.g-nb.com/forums/images/emoticons/mischief.gif" border=0>f\n\r\t\v]。<BR>例如：/\s\w*/匹配"foo&nbsp;bar."中的'&nbsp;bar'。<BR><BR>字符\S<BR>意义：匹配除white空格符以外的一个单个的字符，等价于[^&nbsp;<IMG src="http://www.g-nb.com/forums/images/emoticons/mischief.gif" border=0>f\n\r\t\v]。<BR>例如：/\S/\w*匹配"foo&nbsp;bar."中的'foo'。<BR><BR>字符\t<BR>意义：匹配一个制表符<BR><BR>字符\v<BR>意义：匹配一个顶头制表符<BR><BR>字符\w<BR>意义：匹配所有的数字和字母以及下划线，等价于[A-Za-z0-9_]。<BR>例如：/\w/匹配"apple,"中的'a'，"$5.28,"中的'5'和"3D."中的'3'。<BR><BR>字符\W&nbsp;<BR>意义：匹配除数字、字母外及下划线外的其它字符，等价于[^A-Za-z0-9_]。<BR>例如：/\W/或者/[^$A-Za-z0-9_]/匹配"50%."中的'%'。<BR><BR>字符\n<BR>意义：这里的n是一个正整数。匹配一个正则表达式的最后一个子串的n的值(计数左圆括号)。<BR><BR>例如：/apple(,)\sorange\1/匹配"apple,&nbsp;orange,&nbsp;cherry,&nbsp;peach."中的'apple,&nbsp;orange'，下面<BR>有一个更加完整的例子。<BR>注意：如果左圆括号中的数字比\n指定的数字还小，则\n取下一行的八进制escape作为描述。<BR><BR>字符\ooctal和\xhex<BR>意义：这里的\ooctal是一个八进制的escape值，而\xhex是一个十六进制的escape值，允许在一个<BR>正则表达式中嵌入ASCII码。<BR><BR><BR>当表达式被检查的时候，文字符号提供了编辑正则表达式的方法。利用文字符号可以使到正则表达<BR>式保持为常数。例如，如果你在一个循环中使用文字符号来构造一个正则表达式，正则表达式不需进行<BR>反复编译。<BR>正则表达式对象构造器，例如，new&nbsp;RegExp("ab+c")，提供正则表达式的运行时编译。当你知道正<BR>则表达式的模式会变化的时候，应该使用构造函数，或者你不知道正则表达式的模式，而它们是从另外<BR>的源获得的时候，比如由用户输入时。一旦你定义好了正则表达式，该正则表达式可在任何地方使用，<BR>并且可以改变，你可以使用编译方法来编译一个新的正则表达式以便重新使用。<BR>一个分离预先定义的RegExp对象可以在每个窗口中使用；也就是说，每个分离的javascript线程运<BR>行以获得自己的RegExp对象。因为每个脚本在一个线程中是不可中断的，这就确保了不同的脚本不会覆<BR>盖RegExp对象的值。<BR>预定义的RegExp对象包含的静态属性：input,&nbsp;multiline,&nbsp;lastMatch,lastParen,&nbsp;leftContext,&nbsp;<BR>rightContext,&nbsp;以及从$1到$9。input和multiline属性能被预设。其它静态属性的值是在执行个别正则<BR>表达式对象的exec和test方法后，且在执行字符串的match和replace方法后设置的。<BR><BR>属性<BR>注意RegExp对象的几个属性既有长名字又有短名字(象Perl)。这些名字都是指向相同的值。Perl是<BR>一种编程语言，而javascript模仿了它的正则表达式。<BR><BR>属性$1,&nbsp;...,&nbsp;$9<BR>取得匹配的子串，如果有的话<BR><BR>属性$_<BR>参考input<BR><BR>属性$*<BR>参考multiline<BR><BR>属性$&amp;<BR>参考lastMatch<BR><BR>属性$+<BR>参考lastParen<BR><BR>属性$`<BR>参考leftContext<BR><BR>属性$'<BR>参考rightContext<BR><BR>属性constructor<BR>指定用来建立对象原型函<BR><BR>属性global<BR>决定是否测试正则表达式是否不能匹配所有的字符串，或者只是与最先的冲突。<BR><BR>属性ignoreCase<BR>决定试图匹配字符串的时候是否忽略大小写<BR><BR>属性input<BR>当正则表达式被匹配的时候，为相反的字符串。<BR><BR>属性lastIndex<BR>决定下一次匹配从那里开始<BR><BR>属性lastMatch<BR>最后一个匹配的字符<BR><BR>属性lastParen<BR>子串匹配的时候，最后一个parenthesized，如果有的话。<BR><BR>属性leftContext<BR>最近一次匹配前的子串。<BR><BR>属性multiline<BR>是否在串的多行中搜索。<BR><BR>属性prototype<BR>允许附加属性到所有的对象<BR><BR>属性rightContext<BR>最近一次匹配后的的子串。<BR><BR>属性source<BR>模式文本<BR><BR><BR><BR>方法<BR>compile方法<BR>编译一个正则表达式对象<BR><BR>exec方法<BR>运行正则表达式匹配<BR><BR>test方法<BR>测试正则达式匹配<BR><BR>toSource方法<BR>返回一个对象的文字描述指定的对象；你可以使用这个值来建立一个新的对象。不考虑Object.toS<BR>ource方法。<BR><BR>toString方法<BR>返回一个字符串描述指定的对象，不考虑Object.toString对象。<BR><BR>valueOf方法<BR>返回指定对角的原始值。不考虑Object.valueOf方法。<BR><BR>　另外，这个对象继承了对象的watch和unwatch方法<BR><BR><BR>　　例子：<BR>　　例１、下述示例脚本使用replace方法来转换串中的单词。在替换的文本中，脚本使用全局&nbsp;RegExp<BR>对象的$1和$2属性的值。注意，在作为第二个参数传递给replace方法的时候，RegExp对象的$属性的名<BR>称。<BR>&lt;SCRIPT&nbsp;LANGUAGE="javascript1.2"&gt;<BR>re&nbsp;=&nbsp;/(\w+)\s(\w+)/;<BR>str&nbsp;=&nbsp;"John&nbsp;Smith";<BR>newstr=str.replace(re,"$2,&nbsp;$1");<BR>document.write(newstr)<BR>&lt;/SCRIPT&gt;<BR>显示结果："Smith,&nbsp;John".&nbsp;<BR><BR>　　例２、下述示例脚本中，RegExp.input由Change事件处理句柄设置。在getInfo函数中，exec&nbsp;方法<BR>使用RegExp.input的值作为它的参数，注意RegExp预置了$属性。<BR><BR><BR>&lt;SCRIPT&nbsp;LANGUAGE="javascript1.2"&gt;<BR>function&nbsp;getInfo(abc)<BR>{<BR>re&nbsp;=&nbsp;/(\w+)\s(\d+)/;<BR>re.exec(abc.value);<BR>window.alert(RegExp.$1&nbsp;+&nbsp;",&nbsp;your&nbsp;age&nbsp;is&nbsp;"&nbsp;+&nbsp;RegExp.$2);<BR>}<BR>&lt;/SCRIPT&gt;<BR><BR>　　请输入你的姓和年龄，输入完后按回车键。<BR>　　&lt;FORM&gt;&lt;INPUT&nbsp;TYPE="TEXT"&nbsp;NAME="NameAge"&nbsp;onChange="getInfo(this);"&gt;&lt;/FORM&gt;<BR>　　&lt;/HTML&gt;<BR><BR><BR>$1,&nbsp;...,&nbsp;$9属性<BR>用圆括号括着的匹配子串，如果有的话。<BR>是RegExp的属性<BR>静态，只读<BR><BR>在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供<BR>描述：因为input是静态属性，不是个别正则表达式对象的属性。你可以使用RegExp.input&nbsp;访问该<BR>属性。<BR><BR>能加上圆括号的子串的数量不受限制，但正则表达式对象只能保留最后9&nbsp;条。如果你要访问所有的<BR>圆括号内的匹配字串，你可以使用返回的数组。<BR><BR>这些属性能用在RegExp.replace方法替换后的字符串(输出结果)。当使用这种方式的时候，不用预<BR>先考虑RegExp对象。下面给出例子。当正则表达式中没有包含圆括号的时候，该脚本解释成$n的字面意<BR>义。(这里的n是一个正整数)。<BR><BR><BR>例如：<BR>下例脚本使用replace&nbsp;方法来交换串中单词的位置。在替换后的文本字串中，脚本使用正则表达式<BR>RegExp对象的$1和$2属性的值。注意：当它们向replace方法传递参数的时候，这里没有考虑&nbsp;$&nbsp;属性的<BR>RegExp对象的名称。<BR>&lt;SCRIPT&nbsp;LANGUAGE="javascript1.2"&gt;<BR>re&nbsp;=&nbsp;/(\w+)\s(\w+)/;<BR>str&nbsp;=&nbsp;"John&nbsp;Smith";<BR>newstr=str.replace(re,"$2,&nbsp;$1");<BR>document.write(newstr)<BR>&lt;/SCRIPT&gt;<BR>显示的输出结果为：Smith,&nbsp;John。<BR>　&nbsp;<BR>正则表达式regular&nbsp;expression详述（二）<BR><BR>以下这些不是正则表达式的新增对象请参阅对应的javascript对象的属性&nbsp;$_属性&nbsp;参考input&nbsp;$*属性<BR>参考multiline&nbsp;$&amp;属性&nbsp;参考lastMatch&nbsp;$+属性&nbsp;参考lastParen&nbsp;$`属性<BR>参考leftContext&nbsp;$'属性&nbsp;参考rightContext&nbsp;compile方法&nbsp;在脚本运行期间编译正则表达式对象<BR>属于RegExp的方法&nbsp;在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;语法：<BR>regexp.compile(pattern[,&nbsp;flags])&nbsp;以数：&nbsp;regexp&nbsp;正则表达式的名称，可以是变量名或文字串。&nbsp;<BR>pattern&nbsp;正则表达式的定义文本。&nbsp;flags&nbsp;如果指定的话，可以是下面其中的一个：&nbsp;"g":&nbsp;匹配所有可能的字串<BR>"i":&nbsp;忽略大小写&nbsp;"gi":&nbsp;匹配所有可能的字串及忽略大小写&nbsp;描述：<BR>使用compile方法来编译一个正则表达式&nbsp;created&nbsp;with&nbsp;the&nbsp;RegExp&nbsp;constructor&nbsp;function。这样<BR>就强制正则表达式只编译一次，而不是每次遇到正则表达式的时候都编译一次。当你确认正则表达式能<BR>保持不变的时候可使用compile&nbsp;方法来编译它(在获得它的匹配模式后)，这样就可以在脚本中重复多次使用它。<BR>你亦可以使用compile&nbsp;方法来改变在运行期间改变正则表达式。例如，假如正则表达式发生变化，<BR>你可以使用compile方法来重新编译该对象来提高使用效率。<BR>使用该方法将改变正则表达式的source,&nbsp;global和ignoreCasesource属性的值。&nbsp;constructor&nbsp;<BR>指出建立对象原型的function。注意这个属性的值由函数本身提供，而不是一个字串包含RegExp的name.Property提供。&nbsp;<BR>在javascript&nbsp;1.1,&nbsp;NES&nbsp;2.0以上版本提供&nbsp;ECMA版本ECMA-262&nbsp;描述：参考Object.constructor.<BR>exec方法&nbsp;在指定的字符串运行匹配搜索。返回一个结果数组。&nbsp;是RegExp的方法&nbsp;<BR>在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;语法：&nbsp;regexp.exec([str])regexp([str])<BR>参数：&nbsp;regexp，正则表达式的名称，可以是一个变量名或文字定义串。&nbsp;<BR>str，要匹配正则表达式的字符串，如果省略，将使用RegExp.input的值。&nbsp;<BR>描述：就如在语法描述中的一样，正则表达工的exec方法能够被直接调用(使用regexp.exec(str))或者间接调用(使用regexp(str))。<BR>假如你只是运行以找出是否匹配，可以使用String搜索方法。<BR>假如匹配成功，exec方法返回一个数组并且更新正则表达式对象属性的值和预先定义的正则表达式对象、RegExp。如果匹配失败，exec方法返回null。<BR>请看下例：&nbsp;&lt;SCRIPT&nbsp;LANGUAGE="javascript1.2"&gt;&nbsp;//匹配一个b接着一个或多个d，再接着一个b<BR>//忽略大小写&nbsp;myRe=/d(b+)(d)/ig;&nbsp;myArray&nbsp;=&nbsp;myRe.exec("cdbBdbsbz");<BR>&lt;/SCRIPT&gt;&nbsp;下面是该脚本的返回值：对象&nbsp;属性/Index&nbsp;描述&nbsp;例子&nbsp;<BR>myArray<BR><BR>myArray的内容&nbsp;["dbBd",&nbsp;"bB",&nbsp;"d"]&nbsp;<BR>index<BR>基于0的匹配index&nbsp;1&nbsp;<BR>input<BR>原始字符串&nbsp;cdbBdbsbz&nbsp;<BR>[0]<BR>最后匹配的字符&nbsp;dbBd&nbsp;<BR>[1],&nbsp;...[n]<BR>用圆括号括住的匹配字符串，如果有的话。不限制括号的个数。&nbsp;[1]&nbsp;=&nbsp;bB<BR>[2]&nbsp;=&nbsp;d&nbsp;<BR>myRe<BR>lastIndex<BR>开始下次匹配操作的index值&nbsp;5&nbsp;<BR>ignoreCase<BR>指出"i"是否使用以忽略大小写&nbsp;true&nbsp;<BR>global<BR>指出是否使用"g"标记来进行匹配所有可能的字串&nbsp;true&nbsp;<BR>source<BR>定义模式的文本字符串&nbsp;d(b+)(d)&nbsp;<BR>RegExp<BR>lastMatch$&amp;<BR>最后匹配的字符&nbsp;dbBd&nbsp;<BR>leftContext$\Q<BR>最新匹配前面的子串&nbsp;c&nbsp;<BR>rightContext$'<BR>最新匹配后面的子串&nbsp;bsbz&nbsp;<BR>$1,&nbsp;...$9<BR>圆括号内的匹配子串，如果有的话。圆括号的个数不受限制，但RegExp只能保留最后9个&nbsp;$1&nbsp;=&nbsp;bB&nbsp;<BR>$2&nbsp;=&nbsp;d&nbsp;<BR>lastParen&nbsp;$+<BR>最后一个加上圆括号的匹配子串，如果有的话&nbsp;d&nbsp;<BR><BR>假如你的正则表达式使用了"g"标记，你可以多次使用exec&nbsp;方法来连续匹配相同的串。当你这样做<BR>的时候，新的匹配将从由正则表达式的lastIndex&nbsp;属性值确定的子串中开始。例如，假定你使用下面的脚本：<BR>&lt;SCRIPT&nbsp;LANGUAGE="javascript1.2"&gt;&nbsp;myRe=/ab*/g;str&nbsp;=&nbsp;"abbcdefabh"<BR>myArray&nbsp;=&nbsp;myRe.exec(str);<BR>document.writeln("Found&nbsp;"+myArray[0]+".&nbsp;Next&nbsp;match&nbsp;starts&nbsp;at&nbsp;"+myRe.lastIndex)<BR>mySecondArray&nbsp;=&nbsp;myRe.exec(str);<BR>document.writeln("Found&nbsp;"+mySecondArray[0]+".&nbsp;Next&nbsp;match&nbsp;starts&nbsp;at&nbsp;"+myRe.lastIndex)<BR>&lt;/SCRIPT&gt;&nbsp;这个脚本显示如下结果：&nbsp;Found&nbsp;abb.&nbsp;Next&nbsp;match&nbsp;starts&nbsp;at&nbsp;3<BR>Found&nbsp;ab.&nbsp;Next&nbsp;match&nbsp;starts&nbsp;at&nbsp;9&nbsp;例子：<BR>在下面的例子中，用户输入一个名字，脚本根据输入执行匹配操作。接着检查数组看是否和其它用户的名字匹配。<BR>本脚本假定已注册的用户的姓已经存进了数组A中，或许从一个数据库中取得。&nbsp;&lt;HTML&gt;<BR>&lt;SCRIPT&nbsp;LANGUAGE="javascript1.2"&gt;&nbsp;A&nbsp;=&nbsp;["zhao","qian","sun","li","liang"]<BR>function&nbsp;lookup()&nbsp;{&nbsp;firstName&nbsp;=&nbsp;/\w+/i();&nbsp;if&nbsp;(!firstName)<BR>window.alert&nbsp;(RegExp.input&nbsp;+&nbsp;"非法输入");&nbsp;else&nbsp;{&nbsp;count=0;<BR>for&nbsp;(i=0;i&nbsp;输入你的姓然后按回车键。<BR>&lt;FORM&gt;&lt;INPUT&nbsp;TYPE:"TEXT"&nbsp;NAME="FirstName"&nbsp;onChange="lookup(this);"&gt;&lt;/FORM&gt;<BR>&lt;/HTML&gt;&nbsp;global属性&nbsp;正则表达式中是否使用了"g"标记。&nbsp;RegExp属性，只读<BR>在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;描述：&nbsp;global是一个个别正则表达式对象的属性<BR>如果使用了"g"标记，global的值为true；否则为&nbsp;false。"g"标记指定正则表达式测试所有可能的匹配。<BR>你不能直接改变该属性的值，但可以调用compile方法来改变它。&nbsp;ignoreCase&nbsp;检查正则表达式是否使用了"i"标记<BR>RegExp属性，只读&nbsp;在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;描述：<BR>ignoreCase是个别正则表达式对象的一个属性。<BR>如果使用了"i"标记，则返回true，否则返回false。"i"标记指示在进行匹配的时候忽略大小写。<BR>你不能直接改变该属性的值，但可以通过调用compile方法来改变它&nbsp;input&nbsp;指出正则表达式要测试那个字串。$_是这个属性的另一个名字。<BR>RegExp的属性，静态&nbsp;在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;<BR>描述：因为input是静态的，不是某个个别的正则表达式对象的属性。你也可以使用&nbsp;RegExp.input来表示。<BR>如果没有给正则表达式的exec或test方法提供字符串，并且RegExp.input中有值，则使用它的值来调用该方法。<BR>脚本或浏览器能够预置input属性。如果被预置了值且调用exec或&nbsp;test方法的时候没有提供字符串<BR>则调用exec或test的时候使用input的值。input可以被浏览器以下面的方式设置：<BR>当text表单域处理句柄被调用的时候，input被设置为该text输入的字串。<BR>当textarea表单域处理句柄被调用的时候，input被设置为textarea域内输入的字串。注意multili<BR>ne亦被设置成true从而能匹配多行文本。&nbsp;当select表单域处理句柄被调用的时候，input被设置成selected&nbsp;text的值。<BR>当链接对象的处理句柄被调用的时候，input被设置成&lt;A&nbsp;HREF=...&gt;和&lt;/A&gt;之间的字符串。<BR>事件理现句柄处理完毕后，input属性的值被清除。&nbsp;lastIndex&nbsp;可读/可写的一个整数属性，指出下一次匹配从哪里开始。<BR>RegExp的属性&nbsp;在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;<BR>描述：lastIndex&nbsp;是个别的正则表达式对象的属性。&nbsp;这个属性只有当正则表达式的"g"标记被使用以进行全串匹配的时候才被设置。实行以下规则：<BR>如果lastIndex大小字符串的长度，regexp.test和regexp.exec失败，且lastIndex被设为0。<BR>如果lastIndex等于字串的长度且正则表达式匹配空字符串，则正则表达式从lastIndex的位置开始匹配。<BR>如果lastIndex等于字符串的长度且正则表达式不匹配空字符串，则正则表达式不匹配input，且lastIndex被置为0。<BR>否则，lastIndex被设置成最近一次匹配的下一点。&nbsp;例如，按下面的顺序执行脚本：&nbsp;re&nbsp;=&nbsp;/(hi)?/g&nbsp;匹配空字符串&nbsp;<BR>re("hi")&nbsp;返回["hi",&nbsp;"hi"]，lastIndex置为2&nbsp;<BR>re("hi")&nbsp;返回[""]，一个空数组，它的下标为0的元素就是匹配字符串。在这种情况下，返回空<BR>串是因为lastIndex等于2(且仍然是2)，并且"hi"的长度也是2。&nbsp;lastMatch&nbsp;最后一次匹配字符串，$&amp;是同样的意思。<BR>RegExp的属性，静态，只读&nbsp;在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;<BR>描述：因为lastMatch是静态的，所以它不是个别指定正则表达式的属性。你也可以使用RegExp.lastMatch。&nbsp;lastParen<BR>最后一次加上括号的匹配字符串，如果有的话。$+是同样的意思。&nbsp;RegExp属性，静态，只读<BR>在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;<BR>描述：因为lastParen是静态的，它不是某个个别正则式的属性，你可以使用RegExp.lastParen&nbsp;表达同样的意思。<BR>leftContext&nbsp;最近一次匹配前面的子串，$`具有相同的意思。&nbsp;RegExp的属性，静态，只读<BR>在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;<BR>描述：因为leftContext是静态的，不是某一个正则表达式的属性，所以可以使用RegExp.leftContext来表达想同的意思。<BR>multiline&nbsp;反映是否匹配多行文本，$*是相同的意思。&nbsp;RegExp的属性，静态<BR>在javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本提供&nbsp;<BR>描述：因为multiline是静态的，而不是某个个别正则表达式的属性，所以能够用RegExp.multiline表达相同的意思。<BR>如果允许匹配多行文本，则multiline为true，如果搜索必须在换行时停止，则为false。<BR>脚本或浏览器能够设置multiline属性。当一个textarea的事件处理句柄被调用的时候，multiline<BR>被置为true。在事件处理句柄处理完毕后，multiline属性值被清除。也就是说，如果你设置了multili<BR>ne为true，则执行任何的事件处理句柄后，multiline被置为false。&nbsp;prototype&nbsp;<BR>描绘类的原型。你可以根据要求使用prototype来增加类的属性或方法。为了获得prototypes&nbsp;的资<BR>料，请参阅RegExp的Function.prototype.Property属性。&nbsp;从javascript&nbsp;1.1,&nbsp;NES&nbsp;2.0版本开始提供<BR>ECMA版本ECMA-262&nbsp;rightContext&nbsp;最后一次匹配的右边的字符串，$'是同样的效果。<BR>RegExp的属性，静态，只读&nbsp;从&nbsp;javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本开始提供&nbsp;<BR>描述：因为rightContext是静态的，不是某个个别正则表达工的属性，可以使用RegExp.rightContext来达到相同的效果。<BR>source&nbsp;一个只读属性，包含正则表达式定义的模式，不包侨forward&nbsp;slashes和"g"或"i"标记。&nbsp;RegExp的属性，只读<BR>从javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本开始提供&nbsp;<BR>描述：source是个别正则表达式对象的属性，你不能直接改变它的值，但可以通过调用compile&nbsp;方法来改变它。&nbsp;test<BR>执行指定字符串的正则表达式匹配搜索，返回true或false。&nbsp;RegExp的方法<BR>从javascript&nbsp;1.2,&nbsp;NES&nbsp;3.0以上版本开始提供&nbsp;语法：regexp.test([str])<BR>参数：regexp，正则表达式的名称，可以是变量名或正则表达式定义文字串<BR>str，要匹配的字符串，如果省略，将使用RegExp.input的值为作参数<BR>描述：当你需要知道一个字符串能否匹配某个正则表达工，可以使用test方法(与String.search方<BR>法类似)；&nbsp;为了获得更多的信息(但速度将变慢)，可以使用exec方法(与String.match方法类似)。&nbsp;例子：下面的例子显示test是否成功的提示：<BR>function&nbsp;testinput(re,&nbsp;str){<BR>if&nbsp;(re.test(str))&nbsp;midstring&nbsp;=&nbsp;"&nbsp;contains&nbsp;";<BR>else&nbsp;midstring&nbsp;=&nbsp;"&nbsp;does&nbsp;not&nbsp;contain&nbsp;";<BR>document.write&nbsp;(str&nbsp;+&nbsp;midstring&nbsp;+&nbsp;re.source);&nbsp;}&nbsp;toSource&nbsp;<BR>返回一个字符串象征对象的源码&nbsp;RegExp的方法&nbsp;从javascript&nbsp;1.3以上版本开始提供&nbsp;语法：toSource()<BR>参数：没有&nbsp;描述：toSource方法返回下述的值：&nbsp;对于内置的RegExp对象，toSource返回下面的字符象征源码不可用：<BR>function&nbsp;Boolean(){&nbsp;[native&nbsp;code]&nbsp;}<BR>在RegExp场合中,&nbsp;toSource返回象征源码的字符串，通常这个方法是由javascript内部自动调用而不是不代码中显式调用。<BR>更多请看Object.toSource&nbsp;toString&nbsp;返回描绘指定对象的字符串。&nbsp;RegExp的方法<BR>从javascript&nbsp;1.1,&nbsp;NES&nbsp;2.0开始提供&nbsp;ECMA版本ECMA-262&nbsp;语法：toString()&nbsp;参数：无<BR>描述：RegExp对象不考虑Object对象的toString方法；它不继承Object.toString，对于RegExp&nbsp;对<BR>象，toString方法返回一个代表该对象的字符串。&nbsp;例如：下面的例子显示象征RegExp对象的字符串<BR>myExp&nbsp;=&nbsp;new&nbsp;RegExp("a+b+c");&nbsp;alert(myExp.toString())<BR>displays&nbsp;"/a+b+c/"&nbsp;更多请看：Object.toString&nbsp;valueOf&nbsp;返回一个RegExp对象的原始值<BR>RegExp的方法&nbsp;从javascript&nbsp;1.1版本开始提供&nbsp;ECMA版本：ECMA-262&nbsp;语法：valueOf()<BR>参数：无&nbsp;描述：RegExp的valueOf方法以字符串形式返回RegExp对象的原始值，这个值与RegExp.toString相等。<BR>该方法通常由javascript内部自动调用而不是显式调用&nbsp;例子：&nbsp;myExp&nbsp;=&nbsp;new&nbsp;RegExp("a+b+c");<BR>alert(myExp.valueOf())&nbsp;displays&nbsp;"/a+b+c/"</FONT></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/cymao/aggbug/29084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-01-24 11:50 <a href="http://www.blogjava.net/cymao/archive/2006/01/24/29084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 的入门心得(转)</title><link>http://www.blogjava.net/cymao/archive/2006/01/23/29008.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Mon, 23 Jan 2006 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/01/23/29008.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/29008.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/01/23/29008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/29008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/29008.html</trackback:ping><description><![CDATA[<P>Oracle 的入门心得</P>
<P>oracle的体系太庞大了，对于初学者来说，难免会有些无从下手的感觉，什么都想学，结果什么都学不好，所以把学习经验共享一下，希望让刚刚入门的人对oracle有一个总体的认识，少走一些弯路。 <BR>&nbsp; <BR>一、定位 <BR>oracle分两大块，一块是开发，一块是管理。开发主要是写写存储过程、触发器什么的，还有就是用Oracle的Develop工具做form。有点类似于程序员，需要有较强的逻辑思维和创造能力，个人觉得会比较辛苦，是青春饭J；管理则需要对oracle数据库的原理有深刻的认识，有全局操纵的能力和紧密的思维，责任较大，因为一个小的失误就会down掉整个数据库，相对前者来说，后者更看重经验。 <BR>&nbsp; <BR>因为数据库管理的责任重大，很少公司愿意请一个刚刚接触oracle的人去管理数据库。对于刚刚毕业的年轻人来说，可以先选择做开发，有一定经验后转型，去做数据库的管理。当然，这个还是要看人个的实际情况来定。</P>
<P>二、学习方法&nbsp; <BR>我的方法很简单，就是：看书、思考、写笔记、做实验、再思考、再写笔记 <BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 看完理论的东西，自己静下心来想想，多问自己几个为什么，然后把所学和所想的知识点做个笔记；在想不通或有疑问的时候，就做做实验，想想怎么会这样，同样的，把实验的结果记下来。思考和做实验是为了深入的了解这个知识点。而做笔记的过程，也是理清自己思路的过程。 <BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 学习的过程是使一个问题由模糊到清晰，再由清晰到模糊的过程。而每次的改变都代表着你又学到了一个新的知识点。 <BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 学习的过程也是从点到线，从线到网，从网到面的过程。当点变成线的时候，你会有总豁然开朗的感觉。当网到面的时候，你就是高手了 <BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 很多网友，特别是初学的人，一碰到问题就拿到论坛上来问，在问前，你有没有查过书，自己有没有研究过，有没有搜索一下论坛？这就叫思维惰性。由别人来回答你的问题，会让你在短时间内不费劲地弄懂这个知识点，然而通过自己的努力去研究它，不但会更深入的了解这个知识点，更重要的是在研究的过程会提高你解决问题和分析问题的能力。总的来说，没有钻研的学习态度，不管学什么东西，都不会成功的。 <BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 当然，初学的人很多时候是因为遇到问题时，无从下手，也不知道去哪里找资料，才会到论坛上提问题的。但我认为，在提问的时候，是不是可以问别人是如何分析这个问题？从哪里可以找到相关的资料？而不是这个问题的答案是什么？授人以鱼不如授人以渔。</P>
<P>&nbsp;&nbsp; 下面我讲下我处理问题的过程</P>
<P>&nbsp;&nbsp; 首先要知道oracle的官方网站：<A href="http://www.oracle.com">www.oracle.com</A> 这里有oracle的各种版本的数据库、应用工具和权威的官方文档。其次，还要知道<A href="http://metalink.oracle.com/">http://metalink.oracle.com/</A>这里是买了oracle服务或是oracle的合作伙伴才可以进去的，里面有很多权威的解决方案和补丁。然后就是一些著名网站：asktom.oracle.com <A href="http://www.orafaq.net">www.orafaq.net</A>, <A href="http://www.dbazine.com">www.dbazine.com</A>。这里有很多经验之谈。</P>
<P>&nbsp;&nbsp;&nbsp; 遇到问题了。如果是概念上的问题，第一时间可以找tahiti.oracle.com，这里会给你最详细的解释。如果在运行的过程中出了什么错误。可以去metalink看看。如果是想知道事务的处理的经验之谈。可以去asktom。当然。这里只是相对而言。</P>
<P>三、oracle的体系 <BR>oracle的体系很庞大，要学习它，首先要了解oracle的框架。在这里，简要的讲一下oracle的架构，让初学者对oracle有一个整体的认识。 <BR>&nbsp; <BR>1、物理结构（由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成） <BR>控制文件：包含维护和验证数据库完整性的必要信息、例如，控制文件用于识别数据文件和重做日志文件，一个数据库至少需要一个控制文件 <BR>数据文件：存储数据的文件 <BR>重做日志文件：含对数据库所做的更改记录，这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件 <BR>参数文件：定义Oracle 例程的特性，例如它包含调整SGA 中一些内存结构大小的参数 <BR>归档文件：是重做日志文件的脱机副本，这些副本可能对于从介质失败中进行恢复很必要。 <BR>密码文件：认证哪些用户有权限启动和关闭Oracle例程 <BR>&nbsp; <BR>2、逻辑结构（表空间、段、区、块） <BR>表空间：是数据库中的基本逻辑结构，一系列数据文件的集合。 <BR>段：是对象在数据库中占用的空间 <BR>区：是为数据一次性预留的一个较大的存储空间 <BR>块：ORACLE最基本的存储单位，在建立数据库的时候指定 <BR>&nbsp; <BR>3、内存分配（SGA和PGA） <BR>SGA：是用于存储数据库信息的内存区，该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际内存中得以分配，如果实际内存不够再往虚拟内存中写。 <BR>PGA：包含单个服务器进程或单个后台进程的数据和控制信息，与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域，PGA 在创建进程时分配在终止进程时回收 <BR>&nbsp; <BR>4、后台进程（数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程） <BR>数据写进程：负责将更改的数据从数据库缓冲区高速缓存写入数据文件 <BR>日志写进程：将重做日志缓冲区中的更改写入在线重做日志文件 <BR>系统监控：检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复 <BR>进程监控：负责在一个Oracle 进程失败时清理资源 <BR>检查点进程：负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。 <BR>归档进程：在每次日志切换时把已满的日志组进行备份或归档 <BR>服务进程：用户进程服务。 <BR>用户进程：在客户端，负责将用户的SQL 语句传递给服务进程，并从服务器段拿回查询数据。 <BR>&nbsp; <BR>5、oracle例程：Oracle 例程由SGA 内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。 <BR>&nbsp; <BR>6、SCN(System Change Number)：系统改变号，一个由系统内部维护的序列号。当系统需要更新的时候自动增加，他是系统中维持数据的一致性和顺序恢复的重要标志。</P>
<P><BR>四、深入学习&nbsp; <BR>管理：可以考OCP证书，对oracle先有一个系统的学习，然后看Oracle Concepts、oracle online document,对oracle的原理会有更深入的了解，同时可以开始进行一些专题的研究如：RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&amp;RECOVER等等。 <BR>&nbsp; <BR>开发：对于想做Oracle开发的，在了解完Oracle基本的体系结构之后，可以重点关注PL/SQL及Oracle的开发工具这一部分。 PL/SQL主要是包括怎么写SQL语句，怎么使用Oracle本身的函数，怎么写存储过程、存储函数、触发器等。 Oracle的开发工具主要就是Oracle自己的Developer Suite（Oracle Forms Developer and Reports Developer这些），学会如何熟练使用这些工具。</P>
<P>介绍几本oracle入门的好书</P>
<P>oracle官方文档：《concept》上面讲了oracle的体系和概念，很适合初学者看。</P>
<P>OCP的教学用书，也就是STUDY GUIDE(SG)。<BR>Oracle8i 备份恢复手册<BR>Oracle8高级管理与优化<BR>Oracle8i PLSQL程序设计<BR>Oracle8数据库管理员手册<BR>以上书本都是机械工业出版社出版。<BR>&nbsp; <BR>介绍几个网站 <BR><A href="http://tahiti.oracle.com">http://tahiti.oracle.com</A> oracle的官方文档 <BR>现在<A href="http://www.oracle.com.cn/onlinedoc/index.htm">http://www.oracle.com.cn/onlinedoc/index.htm</A>也有官方文档，速度奇快<BR><A href="http://metalink.oracle.com/">http://metalink.oracle.com/</A> oracle的技术支持网站。需要购买Oracle服务才能有一个帐号，才能登陆，有大量的Knowledge Base，大量问题解决经验。 <BR><A href="http://www.oracle.com">http://www.oracle.com</A> oracle的官方网站，可以在这里down oracle的软件、官方文档和获得最新的消息 <BR><A href="http://www.dbazine.com/">http://www.dbazine.com/</A> Oracle的杂志 <BR><A href="http://asktom.oracle.com">http://asktom.oracle.com</A>&nbsp; <BR><A href="http://www.orafaq.net/">http://www.orafaq.net/</A>&nbsp; <BR><A href="http://www.ixora.com.au/">http://www.ixora.com.au/</A> <BR><A href="http://www.oracle-base.com">http://www.oracle-base.com</A> <BR><A href="http://www.dba-oracle.com/oracle_links.htm">http://www.dba-oracle.com/oracle_links.htm</A></P>
<P>&nbsp;</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/cymao/aggbug/29008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-01-23 13:53 <a href="http://www.blogjava.net/cymao/archive/2006/01/23/29008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 基本知识 </title><link>http://www.blogjava.net/cymao/archive/2006/01/23/28999.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Mon, 23 Jan 2006 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/01/23/28999.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/28999.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/01/23/28999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/28999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/28999.html</trackback:ping><description><![CDATA[<TABLE borderColor=#000000 cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="97%" align=center borderColorLight=#000000 border=0>
<TBODY>
<TR align=middle bgColor=#e0efff>
<TD>Oracle 基本知识</TD></TR>
<TR>
<TD>
<P>　　一个表空间只能属于一个数据库 
<P>　　每个数据库最少有一个控制文件（建议3个，分别放在不同的磁盘上） 
<P>　　每个数据库最少有一个表空间（SYSTEM表空间） 
<P>　　建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起，以提高使用效率，只应存放数据字典 
<P>　　每个数据库最少有两个联机日志组，每组最少一个联机日志文件 
<P>　　一个数据文件只能属于一个表空间 
<P>　　一个数据文件一旦被加入到一个表空间中，就不能再从这个表空间中移走，也不能再加入到其他表空间中 
<P>　　建立新的表空间需要建立新的数据文件 
<P>　　数据文件被ORACLE格式化为ORACLE块，Oracle9i以前版本中，ORACLE块的大小是在第一次创建数据库时设定的， 
<P>　　并且以后不能改变，要想改变，只能重建数据库 
<P>　　一个段segment只能属于一个表空间，但可以属于多个数据文件 
<P>　　一个区extent只能属于一个数据文件，即区间（extent）不能跨越数据文件 
<P>　　PCTFREE和PCTUSED总和不能大于等于100 
<P>　　单独一个事务不能跨越多个回滚段 
<P>　　索引表不含ROWID值 
<P>　　拥有不同大小的回滚段没有任何益处 
<P>　　COMMIT后，数据不一定立即写盘（数据文件） 
<P>　　一个事务即使不被提交，也会被写入到重做日志中。 
<P>　　Oracle 8.0.4中，在初始安装时建立的缺省数据库，实例名为ORCL 
<P>　　一个块的最大长度为16KB(有2K、4K、8K、16K)<BR>　　每个数据库最大文件数（按块大小）<BR>　　2K块　　　　　　　　20000个文件<BR>　　4K块　　　　　　　　40000个文件<BR>　　8K块或以上　　　　　65536个文件<BR>
<P>　　oracle server可以同时启动多个数据库 
<P>　　一套操作系统上可以安装多个版本的ORACLE数据库系统（UNIX可以，NT不可以） 
<P>　　一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例 
<P>　　每个ORACLE数据库拥有一个数据库实例（INSTANCE）（OPS除外） 
<P>　　所以，一套操作系统上同时可以有多个oracle数据库实例启动 </P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/cymao/aggbug/28999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-01-23 12:21 <a href="http://www.blogjava.net/cymao/archive/2006/01/23/28999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装Oracle后，经常使用的修改表空间的SQL代码(转)</title><link>http://www.blogjava.net/cymao/archive/2006/01/23/28998.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Mon, 23 Jan 2006 04:19:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/01/23/28998.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/28998.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/01/23/28998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/28998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/28998.html</trackback:ping><description><![CDATA[<CENTER>
<H2>安装Oracle后，经常使用的修改表空间的SQL代码</H2></CENTER>
<TABLE width="90%" align=center>
<TBODY>
<TR align=right>
<TD>【点击：<FONT color=blue>
<SCRIPT src="view_count.asp?hitpath=newuser&amp;hitfilename=cg_sys_count"></SCRIPT>
 </FONT>】 <A href="mailto:oradb@126.com">阿木伯 著</A> </TD></TR>
<TR>
<TD width="100%"><PRE>配置：
Windows NT 4.0 中文版
5块10.2GB SCSI硬盘
分：C:盘、D:盘、E:盘、F:盘、G:盘
Oracle 8.0.4 for Windows NT
NT安装在C:\WINNT，Oracle安装在C:\ORANT

目标：
因系统的回滚段太小，现打算生成新的回滚段，
建立大的、新的表空间（数据表空间、索引表空间、回滚表空间、临时表空间、）
建两个数据表空间、两个索引表空间，这样建的目的是根据实际应用，
如：现有10个应用用户，每个用户是一个独立子系统（如：商业进销存MIS系统中的财务、收款、库存、人事、总经理等）
尤其大型商场中收款机众多，同时访问进程很多，经常达到50-100个进程同时访问，
这样，通过建立多个用户表空间、索引表空间，把各个用户分别建在不同的表空间里（多个用户表空间放在不同的物理磁盘上），
减少了用户之间的I/O竞争、读写数据与写读索引的竞争（用户表空间、索引表空间也分别放在不同的物理磁盘上）

规划：
C:盘、NT系统，Oracle系统
D:盘、数据表空间1（3GB、自动扩展）、回滚表空间1（1GB、自动扩展）
E:盘、数据表空间2（3GB、自动扩展）、回滚表空间2（1GB、自动扩展）
F:盘、索引表空间1（2GB、自动扩展）、临时表空间1（0.5GB、不自动扩展）
G:盘、索引表空间2（2GB、自动扩展）、临时表空间2（0.5GB、不自动扩展）

注：这只是一个简单的规划，实际规划要依系统需求来定，尽量减少I/O竞争

实现：
1、首先查看系统有哪些回滚段及其状态。

SQL&gt; col owner format a20
SQL&gt; col status format a10
SQL&gt; col segment_name format a20
SQL&gt; col tablespace_name format a20

SQL&gt; SELECT OWNER,SEGMENT_NAME,TABLESPACE_NAME,SUM(BYTES)/1024/1024 M 
  2  FROM DBA_SEGMENTS 
  3  WHERE SEGMENT_TYPE='ROLLBACK' 
  4  GROUP BY OWNER,SEGMENT_NAME,TABLESPACE_NAME
  5  /

OWNER                SEGMENT_NAME         TABLESPACE_NAME              M
-------------------- -------------------- -------------------- ---------
SYS                  RB1                  ROLLBACK_DATA        .09765625
SYS                  RB10                 ROLLBACK_DATA        .09765625
SYS                  RB11                 ROLLBACK_DATA        .09765625
SYS                  RB12                 ROLLBACK_DATA        .09765625
SYS                  RB13                 ROLLBACK_DATA        .09765625
SYS                  RB14                 ROLLBACK_DATA        .09765625
SYS                  RB15                 ROLLBACK_DATA        .09765625
SYS                  RB16                 ROLLBACK_DATA        .09765625
SYS                  RB2                  ROLLBACK_DATA        .09765625
SYS                  RB3                  ROLLBACK_DATA        .09765625
SYS                  RB4                  ROLLBACK_DATA        .09765625
SYS                  RB5                  ROLLBACK_DATA        .09765625
SYS                  RB6                  ROLLBACK_DATA        .09765625
SYS                  RB7                  ROLLBACK_DATA        .09765625
SYS                  RB8                  ROLLBACK_DATA        .09765625
SYS                  RB9                  ROLLBACK_DATA        .09765625
SYS                  RB_TEMP              SYSTEM               .24414063
SYS                  SYSTEM               SYSTEM                .1953125

查询到18记录.

SQL&gt; SELECT SEGMENT_NAME,OWNER,
  2         TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS 
  3         FROM DBA_ROLLBACK_SEGS
  4  /

SEGMENT_NAME         OWNER                TABLESPACE_NAME      SEGMENT_ID   FILE_ID STATUS
-------------------- -------------------- -------------------- ---------- --------- ----------
SYSTEM               SYS                  SYSTEM                        0         1 ONLINE
RB_TEMP              SYS                  SYSTEM                        1         1 OFFLINE
RB1                  PUBLIC               ROLLBACK_DATA                 2         3 ONLINE
RB2                  PUBLIC               ROLLBACK_DATA                 3         3 ONLINE
RB3                  PUBLIC               ROLLBACK_DATA                 4         3 ONLINE
RB4                  PUBLIC               ROLLBACK_DATA                 5         3 ONLINE
RB5                  PUBLIC               ROLLBACK_DATA                 6         3 ONLINE
RB6                  PUBLIC               ROLLBACK_DATA                 7         3 OFFLINE
RB7                  PUBLIC               ROLLBACK_DATA                 8         3 OFFLINE
RB8                  PUBLIC               ROLLBACK_DATA                 9         3 OFFLINE
RB9                  PUBLIC               ROLLBACK_DATA                10         3 OFFLINE
RB10                 PUBLIC               ROLLBACK_DATA                11         3 OFFLINE
RB11                 PUBLIC               ROLLBACK_DATA                12         3 OFFLINE
RB12                 PUBLIC               ROLLBACK_DATA                13         3 OFFLINE
RB13                 PUBLIC               ROLLBACK_DATA                14         3 OFFLINE
RB14                 PUBLIC               ROLLBACK_DATA                15         3 OFFLINE
RB15                 PUBLIC               ROLLBACK_DATA                16         3 OFFLINE
RB16                 PUBLIC               ROLLBACK_DATA                17         3 OFFLINE

查询到18记录.

2、修改代码如下，可把以下代码存入一.sql文件，如cg_sys.sql，然后以SQL&gt; @cg_sys.sql调用执行。

--注意：各个硬盘上要事先建好oradata目录

--修改现有回滚段，使之失效，下线
alter rollback segment rb1 offline;
alter rollback segment rb2 offline;
alter rollback segment rb3 offline;
alter rollback segment rb4 offline;
alter rollback segment rb5 offline;
alter rollback segment rb6 offline;
alter rollback segment rb7 offline;
alter rollback segment rb8 offline;
alter rollback segment rb9 offline;
alter rollback segment rb10 offline;
alter rollback segment rb11 offline;
alter rollback segment rb12 offline;
alter rollback segment rb13 offline;
alter rollback segment rb14 offline;
alter rollback segment rb15 offline;
alter rollback segment rb16 offline;

--删除原有回滚段
drop rollback segment rb1;
drop rollback segment rb2;
drop rollback segment rb3;
drop rollback segment rb4;
drop rollback segment rb5;
drop rollback segment rb6;
drop rollback segment rb7;
drop rollback segment rb8;
drop rollback segment rb9;
drop rollback segment rb10;
drop rollback segment rb11;
drop rollback segment rb12;
drop rollback segment rb13;
drop rollback segment rb14;
drop rollback segment rb15;
drop rollback segment rb16;

--建数据表空间1
--收款、库存、订货、远程通信
create tablespace USER_DATA1 datafile 
'd:\oradata\user1_1.ora' size 512M, 
'd:\oradata\user1_2.ora' size 512M, 
'd:\oradata\user1_3.ora' size 512M, 
'd:\oradata\user1_4.ora' size 512M, 
'd:\oradata\user1_5.ora' size 512M, 
'd:\oradata\user1_6.ora' size 512M 
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);
--initial 128K，因为，用户建在表空间上，而表建在用户里，为用户所拥有，
--用户继承数据表空间的存储参数，表继承用户的存储参数
--如果initial设的过大，如：5M，则每建一个空表就要占用5M的空间，即使一条记录也没有
--AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED，设置数据文件自动扩展，每一次扩展增加5M，最大空间不受限

--建数据表空间2
--物价、人事、结算、财务、总经理、合同、统计
create tablespace USER_DATA2 datafile 
'e:\oradata\user2_1.ora' size 512M,
'e:\oradata\user2_2.ora' size 512M,
'e:\oradata\user2_3.ora' size 512M,
'e:\oradata\user2_4.ora' size 512M,
'e:\oradata\user2_5.ora' size 512M,
'e:\oradata\user2_6.ora' size 512M 
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);

--建索引表空间1
create tablespace INDEX_DATA1 datafile 
'f:\oradata\index1_1.ora' size 512M,
'f:\oradata\index1_2.ora' size 512M,
'f:\oradata\index1_3.ora' size 512M,
'f:\oradata\index1_4.ora' size 512M 
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);

--建索引表空间2
create tablespace INDEX_DATA2 datafile 
'g:\oradata\index2_1.ora' size 512M,
'g:\oradata\index2_2.ora' size 512M,
'g:\oradata\index2_3.ora' size 512M,
'g:\oradata\index2_4.ora' size 512M 
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 128K next 2M pctincrease 0);

--建回滚表空间1
--设置初始值40M（initial 40M），则每在这个表空间中建一个回滚段，
--此回滚段自动继承此回滚表空间的存储参数，也即默认文件为40M
create tablespace ROLLBACK_DATA1 datafile 
'd:\oradata\roll1_1.ora' size 512M，
'd:\oradata\roll1_2.ora' size 512M 
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 40M next 5M pctincrease 0);

--建回滚表空间2
create tablespace ROLLBACK_DATA2 datafile 
'e:\oradata\roll2_1.ora' size 512M,
'e:\oradata\roll2_2.ora' size 512M 
AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
default storage (initial 40M next 5M pctincrease 0);

--建临时表空间1
create tablespace TEMPORARY_DATA1 datafile 
'f:\oradata\temp1_1.ora' size 512M 
default storage (initial 10M next 3M pctincrease 0);

--建临时表空间2
create tablespace TEMPORARY_DATA2 datafile 
'g:\oradata\temp2_1.ora' size 512M 
default storage (initial 10M next 3M pctincrease 0);

--使其真正成为临时的
alter tablespace TEMPORARY_DATA1 temporary;
alter tablespace TEMPORARY_DATA2 temporary;

--建立新的回滚段，每个都一样大，不同大小的回滚段没有什么意义，系统是随机选择的。
--建多少个，根据并发访问用户的多少，
--如果你们公司每天有50-100个人员使用Oracle系统开发的管理软件，应该20个以上

create public rollback segment rb01 tablespace rollback_data1;
create public rollback segment rb02 tablespace rollback_data1;
create public rollback segment rb03 tablespace rollback_data1;
create public rollback segment rb04 tablespace rollback_data1;
create public rollback segment rb05 tablespace rollback_data1;
create public rollback segment rb06 tablespace rollback_data1;
create public rollback segment rb07 tablespace rollback_data1;
create public rollback segment rb08 tablespace rollback_data1;
create public rollback segment rb09 tablespace rollback_data2;
create public rollback segment rb10 tablespace rollback_data2;
--前8个建在回滚表空间1中，后8个在回滚表空间2
create public rollback segment rb11 tablespace rollback_data2;
create public rollback segment rb12 tablespace rollback_data2;
create public rollback segment rb13 tablespace rollback_data2;
create public rollback segment rb14 tablespace rollback_data2;
create public rollback segment rb15 tablespace rollback_data2;
create public rollback segment rb16 tablespace rollback_data2;
create public rollback segment rb17 tablespace rollback_data2;
create public rollback segment rb18 tablespace rollback_data2;
create public rollback segment rb19 tablespace rollback_data2;
create public rollback segment rb20 tablespace rollback_data2;

--使回滚段online，即有效
alter rollback segment rb01 online;
alter rollback segment rb02 online;
alter rollback segment rb03 online;
alter rollback segment rb04 online;
alter rollback segment rb05 online;
alter rollback segment rb06 online;
alter rollback segment rb07 online;
alter rollback segment rb08 online;
alter rollback segment rb09 online;
alter rollback segment rb10 online;
alter rollback segment rb11 online;
alter rollback segment rb12 online;
alter rollback segment rb13 online;
alter rollback segment rb14 online;
alter rollback segment rb15 online;
alter rollback segment rb16 online;
alter rollback segment rb17 online;
alter rollback segment rb18 online;
alter rollback segment rb19 online;
alter rollback segment rb20 online;

--查看现有回滚段及其状态
col segment format a30
SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS;

--查看数据文件及其所在表空间、大小、状态
col file_name format a40
col tablespace_name format a20
select file_name,file_id,tablespace_name,bytes,status from dba_data_files;


至此，表空间重新规划完毕，这里讲的比较通俗，还有好多参数值得设置，能够把Oracle设置到最优的境界，
表空间设置完了，下面，就该好好的整理一下Oracle的内存区了，
Oracle很有意思，内存越大，效果越明显，所以有必要好好调整一下SGA区，也就是主要配置ininorcl.ora参数文件。
</PRE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/cymao/aggbug/28998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-01-23 12:19 <a href="http://www.blogjava.net/cymao/archive/2006/01/23/28998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 8.1.6 for Win2000 系统文件解释 </title><link>http://www.blogjava.net/cymao/archive/2006/01/23/28996.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Mon, 23 Jan 2006 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/01/23/28996.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/28996.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/01/23/28996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/28996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/28996.html</trackback:ping><description><![CDATA[<TABLE borderColor=#000000 cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="100%" align=center borderColorLight=#000000 border=0>
<TBODY>
<TR align=middle>
<TD bgColor=#efffe0>Oracle 8.1.6 for Win2000 系统文件解释</TD></TR>
<TR>
<TD><BR></TD></TR>
<TR>
<TD>
<UL>
<LI>系统环境： 
<UL>1、操作系统：Windows 2000<BR>2、数据库：　Oracle 8i R2 (8.1.6) for NT 企业版<BR>3、安装路径：C:\ORACLE<BR></UL></LI></UL>
<UL>
<LI>解释： <PRE><UL>
Oracle 8i R2 (8.1.6) for NT 企业版默认安装完毕后会在所在盘符创建以下三个目录

admin：  记录Oracle实例的配置、运行日志等文件，每个实例一个目录
Ora81：  Oracle系统文件
oradata：Oracle实例运行所需的所有具体文件（数据文件、日志文件、控制文件），每个实例一个目录



一般来讲，Oracle文件分以下几个类型：

数据文件：　　　　　　真实数据
重做日志文件：　　　　联机日志、归档日志
控制文件：　　　　　　包含物理文件到数据字典中的逻辑表空间之间的映射
初始化参数文件：　　　控制内存
警告和追踪日志文件：
备份文件：



C:\Oracle\admin\oradb\pfile\init.ora　　　　　　　　　--初始化参数文件
C:\Oracle\admin\oradb\bdump\oradbALRT.LOG　　　　　　 --警告日志文件
C:\Oracle\admin\oradb\udump\ORA00960.TRC

C:\Oracle\oradata\oradb\SYSTEM01.DBF　　　　　　　　　--表空间数据文件
C:\Oracle\oradata\oradb\USERS01.DBF
C:\Oracle\oradata\oradb\INDX01.DBF
C:\Oracle\oradata\oradb\RBS01.DBF
C:\Oracle\oradata\oradb\TEMP01.DBF
C:\Oracle\oradata\oradb\TOOLS01.DBF
C:\Oracle\oradata\oradb\DR01.DBF
C:\Oracle\oradata\oradb\OEM_REPOSITORY.ORA


C:\Oracle\oradata\oradb\CONTROL01.CTL　　　　　　　　 --控制文件
C:\Oracle\oradata\oradb\CONTROL02.CTL
C:\Oracle\oradata\oradb\CONTROL03.CTL

C:\Oracle\oradata\oradb\REDO01.LOG　　　　　　　　　　--联机日志文件
C:\Oracle\oradata\oradb\REDO02.LOG
C:\Oracle\oradata\oradb\REDO03.LOG

C:\Oracle\oradata\oradb\archive\ORADB2T001S01100.ARC　--归档日志文件
...
C:\Oracle\oradata\oradb\archive\ORADB2T001S01199.ARC


C:\Oracle\Ora81\BIN\afiedt.buf　　　　　　　　　--SQL*Plus默认编辑文件
C:\Oracle\Ora81\BIN\oradc.ocx　　　　　　　　　 --Oracle ActiveX控件（可用于VB中）

C:\Oracle\Ora81\DATABASE\PWDoradb.ora　　　　　 --internal密码文件
C:\Oracle\Ora81\DATABASE\initoradb.ora　　　　　--启动参数文件
C:\Oracle\Ora81\DATABASE\oradim.log　　　　　　 --SVRMGRL管理器出错日志

C:\Oracle\Ora81\network\log\listener.log　　　　--监听器日志文件
C:\Oracle\Ora81\network\log\sqlnet.log　　　　　--Sql*Net 日志文件
C:\Oracle\Ora81\network\ADMIN\tnsnames.ora　　　--TNS 连接文件（数据库别名）
C:\Oracle\Ora81\network\ADMIN\sqlnet.ora　　　　--Sql*Net 环境文件
C:\Oracle\Ora81\network\ADMIN\listener.ora　　　--监听器参数文件

C:\Oracle\Ora81\sqlplus\admin\glogin.sql　　　　--Sql*Plus登录自动执行脚本
C:\Oracle\Ora81\sqlplus\admin\sqlplus.ini　　　 --Sql*Plus环境初始化文件

C:\Oracle\Ora81\precomp\demo\proc　　　　　　　 --Pro*C目录

C:\Oracle\Ora81\RDBMS\ADMIN\BUILDALL.SQL　　　　--生成所有对象脚本
C:\Oracle\Ora81\RDBMS\ADMIN\standard.sql　　　　--建立数据库基本结构的包
C:\Oracle\Ora81\RDBMS\ADMIN\catalog.sql　　　　 --建立数据字典视图脚本，以SYS、INTERNAL连接
C:\Oracle\Ora81\RDBMS\ADMIN\catexp.sql　　　　　--建立EXP/IMP用数据字典视图
C:\Oracle\Ora81\RDBMS\ADMIN\catexp7.sql　　　　 --使v7版本的EXP文件可以导入到v8中
C:\Oracle\Ora81\RDBMS\ADMIN\catdbsyn.sql　　　　--建立DBA私有数据字典视图
C:\Oracle\Ora81\RDBMS\ADMIN\cataudit.sql　　　　--建立审计用数据字典视图
C:\Oracle\Ora81\RDBMS\ADMIN\catsnap.sql　　　　 --建立快照数据字典视图，以SYS、INTERNAL连接
C:\Oracle\Ora81\RDBMS\ADMIN\SCOTT.SQL　　　　　 --生成SCOTT用户及其用户数据

C:\Oracle\Ora81\dbs\pupbld.sql　　　　　　　　　--新建一个数据库之后需要执行的脚本
</UL></PRE></LI></UL></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/cymao/aggbug/28996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-01-23 11:45 <a href="http://www.blogjava.net/cymao/archive/2006/01/23/28996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql的字符串函数(转)</title><link>http://www.blogjava.net/cymao/archive/2006/01/16/28203.html</link><dc:creator>茂</dc:creator><author>茂</author><pubDate>Mon, 16 Jan 2006 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/cymao/archive/2006/01/16/28203.html</guid><wfw:comment>http://www.blogjava.net/cymao/comments/28203.html</wfw:comment><comments>http://www.blogjava.net/cymao/archive/2006/01/16/28203.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/cymao/comments/commentRss/28203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cymao/services/trackbacks/28203.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=4 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top align=middle colSpan=2><FONT class=bigfont face=Tahoma><B>mysql的字符串函数</B></FONT></TD></TR>
<TR>
<TD vAlign=top align=middle colSpan=2></TD></TR>
<TR>
<TD vAlign=top bgColor=#eeeeee colSpan=2 height=1><FONT face=Tahoma></FONT></TD></TR>
<TR>
<TD vAlign=top colSpan=2>
<TABLE cellSpacing=1 cellPadding=4 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>
<DIV class=subhead><B>注意:如果结果的长度大于服务器参数max_allowed_packet，字符串值函数返回NULL</B></DIV><!-- google 的广告条 2005年09月20日换位置 唉,22号被停了.郁闷,没作弊呀 
      11.27日重开了
<div style="text-align:center; padding:10px">
<script type="text/javascript"><!--
google_ad_client = "pub-7642651200842030";
google_alternate_ad_url = "http://down.phpv.net/mygoogle2.html";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel ="6054299365";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "7071A2";
google_color_url = "999999";
google_color_text = "999999";
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

 /google 的广告条--></TD></TR>
<TR>
<TD vAlign=top>
<DIV class=content>
<P>&nbsp;</P>
<P>对于针对字符串位置的操作，第一个位置被标记为1。 </P>
<DL compact>
<DT><STRONG><CODE><FONT face=新宋体>ASCII(str)</FONT></CODE> </STRONG>
<DD><A name=IDX378></A><STRONG>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>的最左面字符的ASCII代码值。</STRONG>如果<CODE><FONT face=新宋体>str</FONT></CODE>是空字符串，返回<CODE><FONT face=新宋体>0</FONT></CODE>。如果<CODE><FONT face=新宋体>str</FONT></CODE>是<CODE><FONT face=新宋体>NULL</FONT></CODE>，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。 <PRE>mysql&gt; select ASCII('2');
        -&gt; 50
mysql&gt; select ASCII(2);
        -&gt; 50
mysql&gt; select ASCII('dx');
        -&gt; 100</PRE>
<P>也可参见ORD()函数。 <A name=IDX379></A></P>
<DT><CODE><FONT face=新宋体><STRONG>ORD(str)</STRONG></FONT></CODE> 
<DD>如果字符串str最左面字符是一个多字节字符，通过以格式<CODE><FONT face=新宋体>((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]</FONT></CODE>返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与<CODE><FONT face=新宋体>ASCII()</FONT></CODE>函数返回的相同值。<PRE>mysql&gt; select ORD('2');
        -&gt; 50
 </PRE>
<DT><CODE><FONT face=新宋体><STRONG>CONV(N,from_base,to_base)</STRONG></FONT></CODE> 
<DD>在不同的数字基之间变换数字。返回数字<CODE><FONT face=新宋体>N</FONT></CODE>的字符串数字，从<CODE><FONT face=新宋体>from_base</FONT></CODE>基变换为<CODE><FONT face=新宋体>to_base</FONT></CODE>基，如果任何参数是<CODE><FONT face=新宋体>NULL</FONT></CODE>，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。参数<CODE><FONT face=新宋体>N</FONT></CODE>解释为一个整数，但是可以指定为一个整数或一个字符串。最小基是<CODE><FONT face=新宋体>2</FONT></CODE>且最大的基是<CODE><FONT face=新宋体>36</FONT></CODE>。如果<CODE><FONT face=新宋体>to_base</FONT></CODE>是一个负数，<CODE><FONT face=新宋体>N</FONT></CODE>被认为是一个有符号数，否则，<CODE><FONT face=新宋体>N</FONT></CODE>被当作无符号数。 <CODE><FONT face=新宋体>CONV</FONT></CODE>以64位点精度工作。 <PRE>mysql&gt; select CONV("a",16,2);
        -&gt; '1010'
mysql&gt; select CONV("6E",18,8);
        -&gt; '172'
mysql&gt; select CONV(-17,10,-18);
        -&gt; '-H'
mysql&gt; select CONV(10+"10"+'10'+0xa,10,10);
        -&gt; '40'
<A name=IDX381></A> </PRE>
<DT><CODE><FONT face=新宋体><STRONG>BIN(N)</STRONG></FONT></CODE> 
<DD>返回二进制值<CODE><FONT face=新宋体>N</FONT></CODE>的一个字符串表示，在此<CODE><FONT face=新宋体>N</FONT></CODE>是一个长整数(<CODE><FONT face=新宋体>BIGINT</FONT></CODE>)数字，这等价于<CODE><FONT face=新宋体>CONV(N,10,2)</FONT></CODE>。如果<CODE><FONT face=新宋体>N</FONT></CODE>是<CODE><FONT face=新宋体>NULL</FONT></CODE>，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。 <PRE>mysql&gt; select BIN(12);
        -&gt; '1100'
</PRE>
<DT><STRONG><CODE><FONT face=新宋体>OCT(N)</FONT></CODE> </STRONG>
<DD>返回八进制值<CODE><FONT face=新宋体>N</FONT></CODE>的一个字符串的表示，在此<CODE><FONT face=新宋体>N</FONT></CODE>是一个长整型数字，这等价于<CODE><FONT face=新宋体>CONV(N,10,8)</FONT></CODE>。如果<CODE><FONT face=新宋体>N</FONT></CODE>是NULL，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。 <PRE>mysql&gt; select OCT(12);
        -&gt; '14'
 </PRE>
<DT><STRONG><CODE><FONT face=新宋体>HEX(N)</FONT></CODE> </STRONG>
<DD>返回十六进制值<CODE><FONT face=新宋体>N</FONT></CODE>一个字符串的表示，在此<CODE><FONT face=新宋体>N</FONT></CODE>是一个长整型(<CODE><FONT face=新宋体>BIGINT</FONT></CODE>)数字，这等价于<CODE><FONT face=新宋体>CONV(N,10,16)</FONT></CODE>。如果<CODE><FONT face=新宋体>N</FONT></CODE>是<CODE><FONT face=新宋体>NULL</FONT></CODE>，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。 <PRE>mysql&gt; select HEX(255);
        -&gt; 'FF'
<A name=IDX384></A> </PRE>
<DT><STRONG><CODE><FONT face=新宋体>CHAR(N,...)</FONT></CODE> </STRONG>
<DD><STRONG><CODE><FONT face=新宋体>CHAR()</FONT></CODE>将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。</STRONG><CODE><FONT face=新宋体>NULL</FONT></CODE>值被跳过。 <PRE>mysql&gt; select CHAR(77,121,83,81,'76');
        -&gt; 'MySQL'
mysql&gt; select CHAR(77,77.3,'77.3');
        -&gt; 'MMM'
 </PRE>
<DT><STRONG><CODE><FONT face=新宋体>CONCAT(str1,str2,...)</FONT></CODE> </STRONG>
<DD><STRONG>返回来自于参数连结的字符串</STRONG>。如果任何参数是<CODE><FONT face=新宋体>NULL</FONT></CODE>，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。 <PRE>mysql&gt; select CONCAT('My', 'S', 'QL');
        -&gt; 'MySQL'
mysql&gt; select CONCAT('My', NULL, 'QL');
        -&gt; NULL
mysql&gt; select CONCAT(14.3);
        -&gt; '14.3'
</PRE>
<DT><STRONG><CODE><FONT face=新宋体>LENGTH(str)</FONT></CODE> </STRONG>
<DD><STRONG>　 </STRONG>
<DT><STRONG><CODE><FONT face=新宋体>OCTET_LENGTH(str)</FONT></CODE> </STRONG>
<DD><STRONG>　 </STRONG>
<DT><STRONG><CODE><FONT face=新宋体>CHAR_LENGTH(str)</FONT></CODE> </STRONG>
<DD><STRONG>　 </STRONG>
<DT><CODE><FONT face=新宋体><STRONG>CHARACTER_LENGTH(str)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>的长度。 <PRE>mysql&gt; select LENGTH('text');
        -&gt; 4
mysql&gt; select OCTET_LENGTH('text');
        -&gt; 4
</PRE>
<P>注意，对于多字节字符，其CHAR_LENGTH()仅计算一次。 <A name=IDX390></A><A name=IDX391></A></P>
<DT><CODE><FONT face=新宋体><STRONG>LOCATE(substr,str)</STRONG></FONT></CODE> 
<DD>　 
<DT><CODE><FONT face=新宋体><STRONG>POSITION(substr IN str)</STRONG></FONT></CODE> 
<DD>返回子串<CODE><FONT face=新宋体>substr</FONT></CODE>在字符串<CODE><FONT face=新宋体>str</FONT></CODE>第一个出现的位置，如果<CODE><FONT face=新宋体>substr</FONT></CODE>不是在<CODE><FONT face=新宋体>str</FONT></CODE>里面，返回<CODE><FONT face=新宋体>0</FONT></CODE>. <PRE>mysql&gt; select LOCATE('bar', 'foobarbar');
        -&gt; 4
mysql&gt; select LOCATE('xbar', 'foobar');
        -&gt; 0
</PRE><PRE>该函数是多字节可靠的。 <A name=IDX392></A> </PRE>
<DT><CODE><FONT face=新宋体><STRONG>LOCATE(substr,str,pos)</STRONG></FONT></CODE> 
<DD>返回子串<CODE><FONT face=新宋体>substr</FONT></CODE>在字符串<CODE><FONT face=新宋体>str</FONT></CODE>第一个出现的位置，从位置<CODE><FONT face=新宋体>pos</FONT></CODE>开始。如果<CODE><FONT face=新宋体>substr</FONT></CODE>不是在<CODE><FONT face=新宋体>str</FONT></CODE>里面，返回<CODE><FONT face=新宋体>0</FONT></CODE>。<PRE>mysql&gt; select LOCATE('bar', 'foobarbar',5);
        -&gt; 7
</PRE>
<P>这函数是多字节可靠的。 <A name=IDX393></A></P>
<DT><CODE><FONT face=新宋体><STRONG>INSTR(str,substr)</STRONG></FONT></CODE> 
<DD>返回子串<CODE><FONT face=新宋体>substr</FONT></CODE>在字符串<CODE><FONT face=新宋体>str</FONT></CODE>中的第一个出现的位置。这与有2个参数形式的<CODE><FONT face=新宋体>LOCATE()</FONT></CODE>相同，除了参数被颠倒。 <PRE>mysql&gt; select INSTR('foobarbar', 'bar');
        -&gt; 4
mysql&gt; select INSTR('xbar', 'foobar');
        -&gt; 0
</PRE>
<P>这函数是多字节可靠的。 <A name=IDX394></A></P>
<DT><CODE><FONT face=新宋体><STRONG>LPAD(str,len,padstr)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>，左面用字符串<CODE><FONT face=新宋体>padstr</FONT></CODE>填补直到<CODE><FONT face=新宋体>str</FONT></CODE>是<CODE><FONT face=新宋体>len</FONT></CODE>个字符长。 <PRE>mysql&gt; select LPAD('hi',4,'??');
        -&gt; '??hi'
<A name=IDX395></A> </PRE>
<DT><CODE><FONT face=新宋体><STRONG>RPAD(str,len,padstr)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>，右面用字符串<CODE><FONT face=新宋体>padstr</FONT></CODE>填补直到<CODE><FONT face=新宋体>str</FONT></CODE>是<CODE><FONT face=新宋体>len</FONT></CODE>个字符长。 &nbsp; <PRE>mysql&gt; select RPAD('hi',5,'?');
        -&gt; 'hi???'
</PRE>
<DT><CODE><FONT face=新宋体><STRONG>LEFT(str,len)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>的最左面<CODE><FONT face=新宋体>len</FONT></CODE>个字符。<PRE>mysql&gt; select LEFT('foobarbar', 5);
        -&gt; 'fooba'
</PRE>
<P>该函数是多字节可靠的。 <A name=IDX397></A></P>
<DT><CODE><FONT face=新宋体><STRONG>RIGHT(str,len)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>的最右面<CODE><FONT face=新宋体>len</FONT></CODE>个字符<CODE><FONT face=新宋体>。</FONT></CODE> <PRE>mysql&gt; select RIGHT('foobarbar', 4);
        -&gt; 'rbar'
</PRE>
<P>该函数是多字节可靠的。 <A name=IDX398></A><A name=IDX399></A></P>
<DT><CODE><FONT face=新宋体><STRONG>SUBSTRING(str,pos,len)</STRONG></FONT></CODE> 
<DD>　 
<DT><CODE><FONT face=新宋体><STRONG>SUBSTRING(str FROM pos FOR len)</STRONG></FONT></CODE> 
<DD>　 
<DT><CODE><FONT face=新宋体><STRONG>MID(str,pos,len)</STRONG></FONT></CODE> 
<DD>从字符串<CODE><FONT face=新宋体>str</FONT></CODE>返回一个<CODE><FONT face=新宋体>len</FONT></CODE>个字符的子串，从位置<CODE><FONT face=新宋体>pos</FONT></CODE>开始。使用<CODE><FONT face=新宋体>FROM</FONT></CODE>的变种形式是ANSI SQL92语法。 <PRE>mysql&gt; select SUBSTRING('Quadratically',5,6);
        -&gt; 'ratica'
</PRE>
<P>该函数是多字节可靠的。 <A name=IDX400></A></P>
<DT><CODE><FONT face=新宋体><STRONG>SUBSTRING(str,pos)</STRONG></FONT></CODE> 
<DD>　 
<DT><CODE><FONT face=新宋体><STRONG>SUBSTRING(str FROM pos)</STRONG></FONT></CODE> 
<DD>从字符串<CODE><FONT face=新宋体>str</FONT></CODE>的起始位置<CODE><FONT face=新宋体>pos</FONT></CODE>返回一个子串。 <PRE>mysql&gt; select SUBSTRING('Quadratically',5);
        -&gt; 'ratically'
mysql&gt; select SUBSTRING('foobarbar' FROM 4);
        -&gt; 'barbar'
</PRE>
<P>该函数是多字节可靠的。 <A name=IDX401></A></P>
<DT><CODE><FONT face=新宋体><STRONG>SUBSTRING_INDEX(str,delim,count)</STRONG></FONT></CODE> 
<DD>返回从字符串<CODE><FONT face=新宋体>str</FONT></CODE>的第<CODE><FONT face=新宋体>count</FONT></CODE>个出现<CODE><FONT face=新宋体>的</FONT></CODE>分隔符<CODE><FONT face=新宋体>delim</FONT></CODE>之后的子串。如果<CODE><FONT face=新宋体>count</FONT></CODE>是正数，返回最后的分隔符到左边(从左边数) 的所有字符。如果<CODE><FONT face=新宋体>count</FONT></CODE>是负数，返回最后的分隔符到右边的所有字符(从右边数)。 <PRE>mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.', 2);
        -&gt; 'www.mysql'
mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.', -2);
        -&gt; 'mysql.com'
</PRE>
<P>该函数对多字节是可靠的。 <A name=IDX402></A></P>
<DT><CODE><FONT face=新宋体><STRONG>LTRIM(str)</STRONG></FONT></CODE> 
<DD>返回删除了其前置空格字符的字符串<CODE><FONT face=新宋体>str</FONT></CODE>。 <PRE>mysql&gt; select LTRIM('  barbar');
        -&gt; 'barbar'
</PRE>
<DT><CODE><FONT face=新宋体><STRONG>RTRIM(str)</STRONG></FONT></CODE> 
<DD>返回删除了其拖后空格字符的字符串<CODE><FONT face=新宋体>str</FONT></CODE>。 <PRE>mysql&gt; select RTRIM('barbar   ');
        -&gt; 'barbar'
</PRE><PRE>该函数对多字节是可靠的。 <A name=IDX404></A> </PRE>
<DT><CODE><FONT face=新宋体><STRONG>TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>，其所有<CODE><FONT face=新宋体>remstr</FONT></CODE>前缀或后缀被删除了。如果没有修饰符<CODE><FONT face=新宋体>BOTH</FONT></CODE>、<CODE><FONT face=新宋体>LEADING</FONT></CODE>或<CODE><FONT face=新宋体>TRAILING</FONT></CODE>给出，<CODE><FONT face=新宋体>BOTH</FONT></CODE>被假定。如果<CODE><FONT face=新宋体>remstr</FONT></CODE>没被指定，空格被删除。 <PRE>mysql&gt; select TRIM('  bar   ');
        -&gt; 'bar'
mysql&gt; select TRIM(LEADING 'x' FROM 'xxxbarxxx');
        -&gt; 'barxxx'
mysql&gt; select TRIM(BOTH 'x' FROM 'xxxbarxxx');
        -&gt; 'bar'
mysql&gt; select TRIM(TRAILING 'xyz' FROM 'barxxyz');
        -&gt; 'barx'
</PRE>
<P>该函数对多字节是可靠的。 <A name=IDX405></A></P>
<DT><CODE><FONT face=新宋体><STRONG>SOUNDEX(str)</STRONG></FONT></CODE> 
<DD>返回<CODE><FONT face=新宋体>str</FONT></CODE>的一个同音字符串。听起来“大致相同”的2个字符串应该有相同的同音字符串。一个“标准”的同音字符串长是4个字符，但是<CODE><FONT face=新宋体>SOUNDEX()</FONT></CODE>函数返回一个任意长的字符串。你可以在结果上使用<CODE><FONT face=新宋体>SUBSTRING()</FONT></CODE>得到一个“标准”的 同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。 <PRE>mysql&gt; select SOUNDEX('Hello');
        -&gt; 'H400'
mysql&gt; select SOUNDEX('Quadratically');
        -&gt; 'Q36324'
<A name=IDX406></A> </PRE>
<DT><CODE><FONT face=新宋体><STRONG>SPACE(N)</STRONG></FONT></CODE> 
<DD>返回由<CODE><FONT face=新宋体>N</FONT></CODE>个空格字符组成的一个字符串。 <PRE>mysql&gt; select SPACE(6);
        -&gt; '      '
<A name=IDX407></A> </PRE>
<DT><CODE><FONT face=新宋体><STRONG>REPLACE(str,from_str,to_str)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>，其字符串<CODE><FONT face=新宋体>from_str</FONT></CODE>的所有出现由字符串<CODE><FONT face=新宋体>to_str</FONT></CODE>代替。 <PRE>mysql&gt; select REPLACE('www.mysql.com', 'w', 'Ww');
        -&gt; 'WwWwWw.mysql.com'
</PRE>
<P>该函数对多字节是可靠的。 <A name=IDX408></A></P>
<DT><CODE><FONT face=新宋体><STRONG>REPEAT(str,count)</STRONG></FONT></CODE> 
<DD>返回由重复<CODE><FONT face=新宋体>count</FONT></CODE>Times次的字符串<CODE><FONT face=新宋体>str</FONT></CODE>组成的一个字符串。如果<CODE><FONT face=新宋体>count &lt;= 0</FONT></CODE>，返回一个空字符串。如果<CODE><FONT face=新宋体>str</FONT></CODE>或<CODE><FONT face=新宋体>count</FONT></CODE>是<CODE><FONT face=新宋体>NULL</FONT></CODE>，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。 <PRE>mysql&gt; select REPEAT('MySQL', 3);
        -&gt; 'MySQLMySQLMySQL'
<A name=IDX409></A> </PRE>
<DT><CODE><FONT face=新宋体><STRONG>REVERSE(str)</STRONG></FONT></CODE> 
<DD>返回颠倒字符顺序的字符串<CODE><FONT face=新宋体>str</FONT></CODE>。 <PRE>mysql&gt; select REVERSE('abc');
        -&gt; 'cba'
</PRE>
<P>该函数对多字节可靠的。 <A name=IDX410></A></P>
<DT><CODE><FONT face=新宋体><STRONG>INSERT(str,pos,len,newstr)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>，在位置<CODE><FONT face=新宋体>pos</FONT></CODE>起始的子串且<CODE><FONT face=新宋体>len</FONT></CODE>个字符长得子串由字符串<CODE><FONT face=新宋体>newstr</FONT></CODE>代替。 <PRE>mysql&gt; select INSERT('Quadratic', 3, 4, 'What');
        -&gt; 'QuWhattic'
</PRE>
<P>该函数对多字节是可靠的。 <A name=IDX411></A></P>
<DT><CODE><FONT face=新宋体><STRONG>ELT(N,str1,str2,str3,...)</STRONG></FONT></CODE> 
<DD>如果<CODE><FONT face=新宋体>N</FONT></CODE>= <CODE><FONT face=新宋体>1</FONT></CODE>，返回<CODE><FONT face=新宋体>str1</FONT></CODE>，如果<CODE><FONT face=新宋体>N</FONT></CODE>= <CODE><FONT face=新宋体>2</FONT></CODE>，返回<CODE><FONT face=新宋体>str2</FONT></CODE>，等等。如果<CODE><FONT face=新宋体>N</FONT></CODE>小于<CODE><FONT face=新宋体>1</FONT></CODE>或大于参数个数，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。<CODE><FONT face=新宋体>ELT()</FONT></CODE>是<CODE><FONT face=新宋体>FIELD()</FONT></CODE>反运算。 <PRE>mysql&gt; select ELT(1, 'ej', 'Heja', 'hej', 'foo');
        -&gt; 'ej'
mysql&gt; select ELT(4, 'ej', 'Heja', 'hej', 'foo');
        -&gt; 'foo'
</PRE>
<DT><CODE><FONT face=新宋体><STRONG>FIELD(str,str1,str2,str3,...)</STRONG></FONT></CODE> 
<DD>返回<CODE><FONT face=新宋体>str</FONT></CODE>在<CODE><FONT face=新宋体>str1</FONT></CODE>, <CODE><FONT face=新宋体>str2</FONT></CODE>, <CODE><FONT face=新宋体>str3</FONT></CODE>, <CODE><FONT face=新宋体>...</FONT></CODE>清单的索引。如果<CODE><FONT face=新宋体>str</FONT></CODE>没找到，返回<CODE><FONT face=新宋体>0</FONT></CODE>。<CODE><FONT face=新宋体>FIELD()</FONT></CODE>是<CODE><FONT face=新宋体>ELT()</FONT></CODE>反运算。 <PRE>mysql&gt; select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -&gt; 2
mysql&gt; select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -&gt; 0
</PRE>
<DT><CODE><FONT face=新宋体><STRONG>FIND_IN_SET(str,strlist)</STRONG></FONT></CODE> 
<DD>如果字符串<CODE><FONT face=新宋体>str</FONT></CODE>在由<CODE><FONT face=新宋体>N</FONT></CODE>子串组成的表<CODE><FONT face=新宋体>strlist</FONT></CODE>之中，返回一个<CODE><FONT face=新宋体>1</FONT></CODE>到<CODE><FONT face=新宋体>N</FONT></CODE>的值。一个字符串表是被<SAMP><FONT face=新宋体>“,”</FONT></SAMP>分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为<CODE><FONT face=新宋体>SET</FONT></CODE>的列，<CODE><FONT face=新宋体>FIND_IN_SET()</FONT></CODE>函数被优化而使用位运算！如果<CODE><FONT face=新宋体>str</FONT></CODE>不是在<CODE><FONT face=新宋体>strlist</FONT></CODE>里面或如果<CODE><FONT face=新宋体>strlist</FONT></CODE>是空字符串，返回<CODE><FONT face=新宋体>0</FONT></CODE>。如果任何一个参数是<CODE><FONT face=新宋体>NULL</FONT></CODE>，返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。如果第一个参数包含一个<SAMP><FONT face=新宋体>“,”</FONT></SAMP>，该函数将工作不正常。 <PRE>mysql&gt; SELECT FIND_IN_SET('b','a,b,c,d');
        -&gt; 2
<A name=IDX414></A> </PRE>
<DT><CODE><FONT face=新宋体><STRONG>MAKE_SET(bits,str1,str2,...)</STRONG></FONT></CODE> 
<DD>返回一个集合 (包含由<SAMP><FONT face=新宋体>“,”</FONT></SAMP>字符分隔的子串组成的一个字符串)，由相应的位在<CODE><FONT face=新宋体>bits</FONT></CODE>集合中的的字符串组成。<CODE><FONT face=新宋体>str1</FONT></CODE>对应于位0，<CODE><FONT face=新宋体>str2</FONT></CODE>对应位1，等等。在<CODE><FONT face=新宋体>str1</FONT></CODE>, <CODE><FONT face=新宋体>str2</FONT></CODE>, <CODE><FONT face=新宋体>...</FONT></CODE>中的<CODE><FONT face=新宋体>NULL</FONT></CODE>串不添加到结果中。 <PRE>mysql&gt; SELECT MAKE_SET(1,'a','b','c');
        -&gt; 'a'
mysql&gt; SELECT MAKE_SET(1 | 4,'hello','nice','world');
        -&gt; 'hello,world'
mysql&gt; SELECT MAKE_SET(0,'a','b','c');
        -&gt; ''
</PRE>
<DT><CODE><FONT face=新宋体><STRONG>EXPORT_SET(bits,on,off,[separator,[number_of_bits]])</STRONG></FONT></CODE> 
<DD>返回一个字符串，在这里对于在“bits”中设定每一位，你得到一个“on”字符串，并且对于每个复位(reset)的位，你得到一个“off”字符串。每个字符串用“separator”分隔(缺省“,”)，并且只有“bits”的“number_of_bits” (缺省64)位被使用。 <PRE>mysql&gt; select EXPORT_SET(5,'Y','N',',',4)
        -&gt; Y,N,Y,N 
</PRE>
<DT><STRONG><CODE><FONT face=新宋体>LCASE(str)</FONT></CODE> </STRONG>
<DD><STRONG>　 </STRONG>
<DT><CODE><FONT face=新宋体><STRONG>LOWER(str)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>，根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。 <PRE>mysql&gt; select LCASE('QUADRATICALLY');
        -&gt; 'quadratically'
<A name=IDX419></A> </PRE>
<DT><STRONG><CODE><FONT face=新宋体>UCASE(str)</FONT></CODE> </STRONG>
<DD><STRONG>　 </STRONG>
<DT><CODE><FONT face=新宋体><STRONG>UPPER(str)</STRONG></FONT></CODE> 
<DD>返回字符串<CODE><FONT face=新宋体>str</FONT></CODE>，根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。 <PRE>mysql&gt; select UCASE('Hej');
        -&gt; 'HEJ'
</PRE>
<P>该函数对多字节是可靠的。 <A name=IDX420></A></P>
<DT><CODE><FONT face=新宋体><STRONG>LOAD_FILE(file_name)</STRONG></FONT></CODE> 
<DD>读入文件并且作为一个字符串返回文件内容。文件必须在服务器上，你必须指定到文件的完整路径名，而且你必须有<STRONG>file</STRONG>权限。文件必须所有内容都是可读的并且小于<CODE><FONT face=新宋体>max_allowed_packet</FONT></CODE>。如果文件不存在或由于上面原因之一不能被读出，函数返回<CODE><FONT face=新宋体>NULL</FONT></CODE>。 <PRE>mysql&gt; UPDATE table_name
           SET blob_column=LOAD_FILE("/tmp/picture")
           WHERE id=1;

</PRE></DD></DL>
<P><STRONG>MySQL</STRONG>必要时自动变换数字为字符串，并且反过来也如此： </P><PRE>mysql&gt; SELECT 1+"1";
        -&gt; 2
mysql&gt; SELECT CONCAT(2,' test');
        -&gt; '2 test'
</PRE>
<P>如果你想要明确地变换一个数字到一个字符串，把它作为参数传递到<CODE><FONT face=新宋体>CONCAT()</FONT></CODE>。 </P>
<P>如果字符串函数提供一个二进制字符串作为参数，结果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较。 </P></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/cymao/aggbug/28203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cymao/" target="_blank">茂</a> 2006-01-16 15:46 <a href="http://www.blogjava.net/cymao/archive/2006/01/16/28203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>