<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Sammy知识库</title><subtitle type="text">栖宇惊鸿的天下</subtitle><id>http://feed.cnblogs.com/blog/u/23743/rss</id><updated>2011-10-13T17:27:59Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/23743/rss"/><entry><id>http://www.cnblogs.com/songsh96/archive/2011/10/14/2211079.html</id><title type="text">sqlite3 常用操作</title><summary type="text">一.建立数据库sqlite3.exe test.db二.双击sqlite-3_6_16目录下的程序sqlite3.exe，即可运行三.退出.exit或者.quit四.SQLite支持如下5种数据类型1.NULL：空值。2.INTEGER：带符号的整型，具体取决有存入数字的范围大小。3.REAL：浮点数字，存储为8-byte IEEE浮点数。4.TEXT：字符串文本。5.BLOB：二进制对象。五.联系人表格结构如下create table contact(id integerprimary keyautoincrement,lastname varchar(20),firstname varch</summary><published>2011-10-13T17:28:00Z</published><updated>2011-10-13T17:28:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/10/14/2211079.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/10/14/2211079.html"/><content type="html">&lt;h1 style="padding: 0px; margin: 0px;"&gt;一.建立数据库&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/SQLite"  style="color: #ff9900; text-decoration: none; padding: 0px; margin: 0px;"&gt;sqlite3&lt;/a&gt;.exe test.db&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;二.双击sqlite-3_6_16目录下的程序sqlite3.exe，即可运行&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;三.退出&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.exit&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;或者&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.quit&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;四.SQLite支持如下5种数据类型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;1.NULL：空值。&lt;br style="padding: 0px; margin: 0px;" /&gt;2.INTEGER：带符号的整型，具体取决有存入数字的范围大小。&lt;br style="padding: 0px; margin: 0px;" /&gt;3.REAL：浮点数字，存储为8-byte IEEE浮点数。&lt;br style="padding: 0px; margin: 0px;" /&gt;4.TEXT：字符串文本。&lt;br style="padding: 0px; margin: 0px;" /&gt;5.BLOB：二进制对象。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;五.联系人表格结构如下&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;create table contact(id integer&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Unique_key"  style="color: #ff9900; text-decoration: none; padding: 0px; margin: 0px;"&gt;primary key&lt;/a&gt;&amp;nbsp;autoincrement,&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;lastname varchar(20),firstname varchar(20),&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;mobile varchar(30), telephone varchar(20),&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;email&amp;nbsp;&amp;nbsp;varchar(30), company varchar(50),&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;department varchar(16),address varchar(80),&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;id1 interger,id2 integer, updatetime datetime);&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;六.查看数据库有哪些数据表&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;命令是：.tables&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;七.如何插入一条记录&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;insert into contact(lastname,firstname,mobile,telephone,updatetime) values('刘','畅','13910128132','010-81749136','2009-07-22');&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;八.查看数据表的结构&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;针对整个数据库&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.schema&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;针对仅仅是contact联系人该表&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.schema&amp;nbsp;&amp;nbsp;contact&amp;nbsp;注意没有分号&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;九.如何打开一个已经创建的数据库&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/SQLite"  style="color: #ff9900; text-decoration: none; padding: 0px; margin: 0px;"&gt;sqlite3&lt;/a&gt;&amp;nbsp;&amp;nbsp;test.db&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十.如何解决如下问题&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/SQL"  style="color: #ff9900; text-decoration: none; padding: 0px; margin: 0px;"&gt;SQL&lt;/a&gt;&amp;nbsp;error: near "sqlite3": syntax error&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/SQL"  style="color: #ff9900; text-decoration: none; padding: 0px; margin: 0px;"&gt;SQL&lt;/a&gt;指令都是以分号（;）结尾的。如果遇到两个减号（--）则代表注解，sqlite3会略过去&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十一.如何建立索引&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;create index index_name on table_name(field_to_be_indexed);&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十二.如何删除一张数据表&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;drop table contact;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十三.查看当前的数据库&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.database&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十四.如何删除一个数据表的数据&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;delete from contact;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十五.如何导入一个文件到某个表中&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.import&amp;nbsp;&amp;nbsp;文件路径&amp;nbsp;&amp;nbsp;表名&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;注意这是非SQL语句，所以不加分号&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十六.如何设置文件字段的分隔符&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.separator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;ldquo;,&amp;rdquo;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.import e:/contact.txt contact&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十七.如何查看当前sqllite字段的分隔符是什么？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;.show&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十八.如何将查询结果导出到一个文件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;第一步：.output a.txt&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;第二步：执行要导出的SQL语句&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;第三步：.output stdout&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;十九.SQL查询语句&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film order by year limit 10;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film order by year desc limit 10;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select count(*) from film;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film where starring like 'Jodie%';&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film where starring='Jodie Foster';&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select title, year from film order by year desc limit 10;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select columns from table_name where expression;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;最常见的用法，当然是倒出所有数据库的内容：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;如果资料太多了，我们或许会想限制笔数：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film limit 10;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;或是照着电影年份来排列：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film order by year limit 10;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;或是年份比较近的电影先列出来：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film order by year desc limit 10;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;或是我们只想看电影名称跟年份：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select title, year from film order by year desc limit 10;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;查所有茱蒂佛斯特演过的电影：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film where starring='Jodie Foster';&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;查所有演员名字开头叫茱蒂的电影('%'&amp;nbsp;符号便是&amp;nbsp;SQL&amp;nbsp;的万用字符）：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select * from film where starring like 'Jodie%';&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔，只列出电影名称和年份：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select title, year from film where starring like 'Jodie%' and year &amp;gt;= 1985 order by year desc limit 10;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;有时候我们只想知道数据库一共有多少笔资料：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select count(*) from film;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;有时候我们只想知道1985年以后的电影有几部：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;select count(*) from film where year &amp;gt;= 1985;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;（进一步的各种组合，要去看SQL专书，不过你大概已经知道SQL为什么这么流行了：这种语言允许你将各种查询条件组合在一起──而我们还没提到「跨数据库的联合查询」呢！）&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;如何更改或删除资料&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;了解select的用法非常重要，因为要在&lt;a href="http://en.wikipedia.org/wiki/SQLite"  style="color: #ff9900; text-decoration: none; padding: 0px; margin: 0px;"&gt;sqlite&lt;/a&gt;更改或删除一笔资料，也是靠同样的语法。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;例如有一笔资料的名字打错了：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;update film set starring='Jodie Foster' where starring='Jodee Foster';&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;就会把主角字段里，被打成'Jodee Foster'的那笔（或多笔）资料，改回成Jodie Foster。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;delete from film where year &amp;lt; 1970;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;就会删除所有年代早于1970年（不含）的电影了。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;其他sqlite的特别用法&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;sqlite可以在shell底下直接执行命令：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;sqlite3 film.db "select * from film;"&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;输出&amp;nbsp;HTML&amp;nbsp;表格：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;sqlite3 -html film.db "select * from film;"&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;将数据库「倒出来」：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;sqlite3 film.db ".dump" &amp;gt; output.sql&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;利用输出的资料，建立一个一模一样的数据库（加上以上指令，就是标准的SQL数据库备份了）：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;sqlite3 film.db &amp;lt; output.sql&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;在大量插入资料时，你可能会需要先打这个指令：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;begin;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;插入完资料后要记得打这个指令，资料才会写进数据库中：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;commit;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;创建数据库文件:&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;SQLite3 d:/test.db&amp;nbsp;回车&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;就生成了一个test.db在d盘。&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;这样同时也SQLite3挂上了这个test.db&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 2)&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong style="padding: 0px; margin: 0px;"&gt;用.help可以看看有什么命令&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;.help&amp;nbsp;回车即可&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 3)可以在这里直接输入SQL语句创建表格&amp;nbsp;&lt;strong style="padding: 0px; margin: 0px;"&gt;用;结束&lt;/strong&gt;&amp;nbsp;，然后回车就可以看到了&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 4)看看有&lt;strong style="padding: 0px; margin: 0px;"&gt;创建了多少表&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;.tables&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 5)看表结构&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;.schema&amp;nbsp;表名&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 6)&lt;strong style="padding: 0px; margin: 0px;"&gt;看看目前的数据库&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;.database&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 7)&lt;strong style="padding: 0px; margin: 0px;"&gt;如果要把查询输出到文件&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;.output&amp;nbsp;文件名&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;nbsp;查询语句；&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;查询结果就输出到了文件c:/query.txt&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;把查询结果用屏幕输出&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;.output stdout&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;8)把表结构输出，同时索引也会输出&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .dump&amp;nbsp;表名&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 9)&lt;strong style="padding: 0px; margin: 0px;"&gt;退出&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; &amp;gt;.exit&amp;nbsp;或者.quit&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;2。从&lt;a href="http://sqlite.phxsoftware.com/" style="color: #ff9900; text-decoration: none; padding: 0px; margin: 0px;"&gt;http://sqlite.phxsoftware.com/&lt;/a&gt;&amp;nbsp;下载Ado.net驱动。&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;下载了安装，在安装目录中存在System.Data.SQLite.dll&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们只需要拷贝这个文件到引用目录，并添加引用即可对SQLite数据库操作了&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;所有的Ado.net对象都是以SQLite开头的，比如SQLiteConnection&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;连接串只需要如下方式&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; Data Source=d:/test.db&amp;nbsp;或者DataSource=test.db--应用在和应用程序或者.net能够自动找到的目录&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;剩下的就很简单了~~&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;3。&lt;strong style="padding: 0px; margin: 0px;"&gt;SQL语法&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;由于以前用SQLServer或者ISeries，所以DDL的语法很汗颜&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 1)&lt;strong style="padding: 0px; margin: 0px;"&gt;创建一个单个&lt;a href="http://en.wikipedia.org/wiki/Unique_key"  style="color: #ff9900; text-decoration: none; padding: 0px; margin: 0px;"&gt;Primary Key&lt;/a&gt;的table&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp; CREATE TABLE&amp;nbsp; [Admin] (&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[UserName] [nvarchar] (20)&amp;nbsp;&amp;nbsp; PRIMARY KEY NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[Password] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[Rank] [smallint] NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[MailServer] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[MailUser] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[MailPassword] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[Mail] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; ) ;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;&amp;nbsp;&amp;nbsp; 2)创建一个多个Primary Key的table&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; CREATE TABLE&amp;nbsp; [CodeDetail] (&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[CdType] [nvarchar] (10)&amp;nbsp; NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[CdCode] [nvarchar] (20)&amp;nbsp; NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[CdString1] [ntext]&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[CdString2] [ntext]&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;[CdString3] [ntext]&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp; PRIMARY KEY (CdType,CdCode)&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; ) ;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; 3)&lt;strong style="padding: 0px; margin: 0px;"&gt;创建索引&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; CREATE&amp;nbsp; INDEX [IX_Account] ON&amp;nbsp; [Account]([IsCheck], [UserName]);&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;还可以视图等等。&lt;br style="padding: 0px; margin: 0px;" /&gt;4.还有很有用的SQL&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp; Select * from Sqlite_master&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp; Select datetime('now')&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp; Select date('now')&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp; Select time('now')&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;SQLite&amp;nbsp;内建函数表&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table border="0" cellpadding="0" cellspacing="1" style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;tbody style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td colspan="2" style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;算术函数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;abs(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回给定数字表达式的绝对值。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;max(X,Y[,...])&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回表达式的最大值。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;min(X,Y[,...])&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回表达式的最小值。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;random(*)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回随机数。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;round(X[,Y])&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回数字表达式并四舍五入为指定的长度或精度。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td colspan="2" style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;字符处理函数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;length(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回给定字符串表达式的字符个数。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;lower(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;将大写字符数据转换为小写字符数据后返回字符表达式。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;upper(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回将小写字符数据转换为大写的字符表达式。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;substr(X,Y,Z)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回表达式的一部分。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;randstr()&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;quote(A)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;like(A,B)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;确定给定的字符串是否与指定的模式匹配。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;glob(A,B)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td colspan="2" style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;条件判断函数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;coalesce(X,Y[,...])&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;ifnull(X,Y)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;nullif(X,Y)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td colspan="2" style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;集合函数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;avg(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回组中值的平均值。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;count(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回组中项目的数量。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;max(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回组中值的最大值。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;min(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回组中值的最小值。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;sum(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回表达式中所有值的和。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td colspan="2" style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;其他函数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;typeof(X)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回数据的类型。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;last_insert_rowid()&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回最后插入的数据的&amp;nbsp;ID&amp;nbsp;。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;sqlite_version(*)&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回&amp;nbsp;SQLite&amp;nbsp;的版本。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;change_count()&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;返回受上一语句影响的行数。&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;last_statement_change_count()&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td style="padding: 0px; margin: 0px;"&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;oh,还有就是看到有人说，好像成批插入的时候，启动事务，比不启动事务快n倍&lt;br style="padding: 0px; margin: 0px;" /&gt;还有就是尽量使用参数化的SQL,估计和商用DB一样能够自动Prepare.&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;===========&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;sqlite可以在shell/dos command底下直接执行命令：&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;sqlite3 film.db "select * from film;"&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;输出&amp;nbsp;HTML&amp;nbsp;表格：&lt;/strong&gt;&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;sqlite3 -html film.db "select * from film;"&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;将数据库「倒出来」：&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;/strong&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;sqlite3 film.db ".dump" &amp;gt; output.sql&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;利用输出的资料，建立一个一模一样的数据库（加上以上指令，就是标准的SQL数据库备份了）：&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;sqlite3 film.db &amp;lt; output.sql&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;在大量插入资料时，你可能会需要先打这个指令：&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;begin;&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;插入完资料后要记得打这个指令，资料才会写进数据库中：&lt;br style="padding: 0px; margin: 0px;" /&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;commit;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;SQLITE深入------常见问题&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;如何建立自动增长字段?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;简短回答：&lt;strong style="padding: 0px; margin: 0px;"&gt;声明为&amp;nbsp;INTEGER PRIMARY KEY&amp;nbsp;的列将会自动增长&lt;/strong&gt;&amp;nbsp;。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;长一点的答案： 如果你声明表的一列为&amp;nbsp;INTEGER PRIMARY KEY，那么， 每当你在该列上插入一NULL值时，&amp;nbsp;NULL自动被转换为一个比该列中最大值大1的一个整数，如果表是空的， 将会是1。&amp;nbsp;(如果是最大可能的主键9223372036854775807，那个，将键值将是随机未使用的数。） 如，有下列表：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;CREATE TABLE t1(&lt;br style="padding: 0px; margin: 0px;" /&gt;a INTEGER PRIMARY KEY,&lt;br style="padding: 0px; margin: 0px;" /&gt;b INTEGER&lt;br style="padding: 0px; margin: 0px;" /&gt;);&lt;br style="padding: 0px; margin: 0px;" /&gt;在该表上，下列语句&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;INSERT INTO t1 VALUES(NULL,123);&lt;br style="padding: 0px; margin: 0px;" /&gt;在逻辑上等价于：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);&lt;br style="padding: 0px; margin: 0px;" /&gt;有一个新的API叫做&amp;nbsp;&lt;strong style="padding: 0px; margin: 0px;"&gt;sqlite3_last_insert_rowid()， 它将返回最近插入的整数值。&amp;nbsp;&lt;/strong&gt;注意该整数会比表中该列上的插入之前的最大值大1。 该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值，需要在&amp;nbsp;INTEGER PRIMARY KEY&amp;nbsp;上增加AUTOINCREMENT声明。那么，新的键值将会比该表中曾能存在过的最大值大1。如果最大可能的整数值在数据表中曾经存在过，INSERT将会失败， 并返回SQLITE_FULL错误代码。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;多个应用程序或一个应用程序的多个实例可以同时访问同一个数据库文件吗？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;多个进程可同时打开同一个数据库。多个进程可以同时进行SELECT&amp;nbsp;操作，但在任一时刻，只能有一个进程对数据库进行更改。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;SQLite使用读、写锁控制对数据库的访问。（在Win95/98/ME等不支持读、写锁的系统下，使用一个概率性的模拟来代替。）但使用时要注意： 如果数据库文件存放于一个NFS文件系统上，这种锁机制可能不能正常工作。 这是因为fcntl()&amp;nbsp;文件锁在很多NFS上没有正确的实现。 在可能有多个进程同时访问数据库的时候，应该避免将数据库文件放到NFS上。在Windows上，Microsoft的文档中说：如果使用&amp;nbsp;FAT&amp;nbsp;文件系统而没有运行&amp;nbsp;share.exe&amp;nbsp;守护进程，那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我：对于网络文件，文件锁的实现有好多Bug，是靠不住的。如果他们说的是对的，那么在两台或多台Windows机器间共享数据库可能会引起不期望的问题。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;我们意识到，没有其它嵌入式的&amp;nbsp;SQL&amp;nbsp;数据库引擎能象&amp;nbsp;SQLite&amp;nbsp;这样处理如此多的并发。SQLite允许多个进程同时打开一个数据库，同时读一个数据库。当有任何进程想要写时，它必须在更新过程中锁住数据库文件。但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。典型地，其它嵌入式的SQL数据库引擎同时只允许一个进程连接到数据库。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;但是，Client/Server数据库引擎（如&amp;nbsp;PostgreSQL, MySQL,&amp;nbsp;或&amp;nbsp;Oracle）通常支持更高级别的并发，并且允许多个进程同时写同一个数据库。这种机制在Client/Server结构的数据库上是可能的，因为总是有一个单一的服务器进程很好地控制、协调对数据库的访问。如果你的应用程序需要很多的并发，那么你应该考虑使用一个Client/Server&amp;nbsp;结构的数据库。但经验表明，很多应用程序需要的并发，往往比其设计者所想象的少得多。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;当SQLite试图访问一个被其它进程锁住的文件时，缺省的行为是返回&amp;nbsp;SQLITE_BUSY。 可以在C代码中使用sqlite3_busy_handler()&amp;nbsp;或&amp;nbsp;sqlite3_busy_timeout() API&amp;nbsp;函数调整这一行为。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;在SQLite数据库中如何列出所有的表和索引？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;如果你运行&amp;nbsp;sqlite3&amp;nbsp;命令行来访问你的数据库，可以键入&amp;nbsp;&amp;ldquo;.tables&amp;rdquo;来获得所有表的列表。或者，你可以输入&amp;ldquo;.schema&amp;rdquo;&amp;nbsp;来看整个数据库模式，包括所有的表的索引。输入这些命令，后面跟一个LIKE模式匹配可以限制显示的表。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;在一个&amp;nbsp;C/C++&amp;nbsp;程序中（或者脚本语言使用&amp;nbsp;Tcl/Ruby/Perl/Python&amp;nbsp;等） 你可以在一个特殊的名叫&amp;nbsp;SQLITE_MASTER&amp;nbsp;上执行一个SELECT查询以获得所有 表的索引。每一个&amp;nbsp;SQLite&amp;nbsp;数据库都有一个叫&amp;nbsp;SQLITE_MASTER&amp;nbsp;的表， 它定义数据库的模式。&amp;nbsp;SQLITE_MASTER&amp;nbsp;表看起来如下：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;CREATE TABLE sqlite_master (&lt;br style="padding: 0px; margin: 0px;" /&gt;type TEXT,&lt;br style="padding: 0px; margin: 0px;" /&gt;name TEXT,&lt;br style="padding: 0px; margin: 0px;" /&gt;tbl_name TEXT,&lt;br style="padding: 0px; margin: 0px;" /&gt;rootpage INTEGER,&lt;br style="padding: 0px; margin: 0px;" /&gt;sql TEXT&lt;br style="padding: 0px; margin: 0px;" /&gt;);&lt;br style="padding: 0px; margin: 0px;" /&gt;对于表来说，type&amp;nbsp;字段永远是&amp;nbsp;'table'，name&amp;nbsp;字段永远是表的名字。所以，要获得数据库中所有表的列表，使用下列SELECT语句：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;SELECT name FROM sqlite_master&lt;br style="padding: 0px; margin: 0px;" /&gt;WHERE type='table'&lt;br style="padding: 0px; margin: 0px;" /&gt;ORDER BY name;&lt;br style="padding: 0px; margin: 0px;" /&gt;对于索引，type&amp;nbsp;等于&amp;nbsp;'index', name&amp;nbsp;则是索引的名字，tbl_name&amp;nbsp;是该索引所属的表的名字。不管是表还是索引，sql字段是原先用&amp;nbsp;CREATE TABLE&amp;nbsp;或&amp;nbsp;CREATE INDEX&amp;nbsp;语句创建它们时的命令文本。对于自动创建的索引（用来实现&amp;nbsp;PRIMARY KEY&amp;nbsp;或&amp;nbsp;UNIQUE&amp;nbsp;约束），sql字段为NULL。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;SQLITE_MASTER&amp;nbsp;表是只读的。不能对它使用&amp;nbsp;UPDATE、INSERT&amp;nbsp;或&amp;nbsp;DELETE。 它会被&amp;nbsp;CREATE TABLE、CREATE INDEX、DROP TABLE&amp;nbsp;和&amp;nbsp;DROP INDEX&amp;nbsp;命令自动更新。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;临时表不会出现在&amp;nbsp;SQLITE_MASTER&amp;nbsp;表中。临时表及其索引和触发器存放在另外一个叫&amp;nbsp;SQLITE_TEMP_MASTER&amp;nbsp;的表中。SQLITE_TEMP_MASTER&amp;nbsp;跟&amp;nbsp;SQLITE_MASTER&amp;nbsp;差不多，但它只是对于创建那些临时表的应用可见。如果要获得所有表的列表， 不管是永久的还是临时的，可以使用类似下面的命令：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;SELECT name FROM&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp; (SELECT * FROM sqlite_master UNION ALL&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT * FROM sqlite_temp_master)&lt;br style="padding: 0px; margin: 0px;" /&gt;WHERE type='table'&lt;br style="padding: 0px; margin: 0px;" /&gt;ORDER BY name&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;在SQLite中，VARCHAR字段最长是多少？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;SQLite&amp;nbsp;不强制&amp;nbsp;VARCHAR&amp;nbsp;的长度。 你可以在&amp;nbsp;SQLITE&amp;nbsp;中声明一个&amp;nbsp;VARCHAR(10)，SQLite还是可以很高兴地允许你放入500个字符。 并且这500个字符是原封不动的，它永远不会被截断。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;SQLite支持二进制大对象吗？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;SQLite 3.0&amp;nbsp;及以后版本允许你在任何列中存储&amp;nbsp;BLOB&amp;nbsp;数据。 即使该列被声明为其它类型也可以。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;在SQLite中，如何在一个表上添加或删除一列？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;SQLite&amp;nbsp;有有限地&amp;nbsp;ALTER TABLE&amp;nbsp;支持。你可以使用它来在表的末尾增加一列，可更改表的名称。 如果需要对表结构做更复杂的改变，则必须重新建表。重建时可以先将已存在的数据放到一个临时表中，删除原表， 创建新表，然后将数据从临时表中复制回来。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;如，假设有一个&amp;nbsp;t1&amp;nbsp;表，其中有&amp;nbsp;"a", "b", "c"&amp;nbsp;三列， 如果要删除列&amp;nbsp;c&amp;nbsp;，以下过程描述如何做:&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;BEGIN TRANSACTION;&lt;br style="padding: 0px; margin: 0px;" /&gt;CREATE TEMPORARY TABLE t1_backup(a,b);&lt;br style="padding: 0px; margin: 0px;" /&gt;INSERT INTO t1_backup SELECT a,b FROM t1;&lt;br style="padding: 0px; margin: 0px;" /&gt;DROP TABLE t1;&lt;br style="padding: 0px; margin: 0px;" /&gt;CREATE TABLE t1(a,b);&lt;br style="padding: 0px; margin: 0px;" /&gt;INSERT INTO t1 SELECT a,b FROM t1_backup;&lt;br style="padding: 0px; margin: 0px;" /&gt;DROP TABLE t1_backup;&lt;br style="padding: 0px; margin: 0px;" /&gt;COMMIT;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;在数据库中删除了很多数据，但数据库文件没有变小，是Bug吗？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;不是。当你从SQLite数据库中删除数据时， 未用的磁盘空间将会加入一个内部的&amp;ldquo;自由列表&amp;rdquo;中。 当你下次插入数据时，这部分空间可以重用。磁盘空间不会丢失，但也不会返还给操作系统。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;如果删除了大量数据，而又想缩小数据库文件占用的空间，执行&amp;nbsp;VACUUM&amp;nbsp;命令。&amp;nbsp;VACUUM&amp;nbsp;将会从头重新组织数据库。这将会使用数据库有一个空的&amp;ldquo;自由链表&amp;rdquo;， 数据库文件也会最小。但要注意的是，VACUUM&amp;nbsp;的执行会需要一些时间（在SQLite开发时，在Linux上，大约每M字节需要半秒种），并且， 执行过程中需要原数据库文件至多两倍的临时磁盘空间。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;对于&amp;nbsp;SQLite 3.1版本，一个&amp;nbsp;auto-vacumm&amp;nbsp;模式可以替代&amp;nbsp;VACUUM&amp;nbsp;命令。 可以使用&amp;nbsp;auto_vacuum pragma&amp;nbsp;打开。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;SQLITE_SCHEMA error是什么错误？为什么会出现该错误？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;当一个准备好的（prepared）SQL语句不再有效或者无法执行时， 将返回一个&amp;nbsp;SQLITE_SCHEMA&amp;nbsp;错误。发生该错误时，SQL语句必须使用&amp;nbsp;sqlite3_prepare() API来重新编译.&amp;nbsp;在&amp;nbsp;SQLite 3&amp;nbsp;中,&amp;nbsp;一个&amp;nbsp;SQLITE_SCHEMA&amp;nbsp;错误只会发生在用&amp;nbsp;sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API&amp;nbsp;执行&amp;nbsp;SQL&amp;nbsp;时。而不会发生在使用sqlite3_exec()时。 在版本2中不是这样。&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;准备好的语句失效的最通常原因是：在语句准备好后， 数据库的模式又被修改了。另外的原因会发生在：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;数据库离线：DETACHed.&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;数据库被&amp;nbsp;VACUUMed&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;一个用户存储过程定义被删除或改变。&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;一个&amp;nbsp;collation&amp;nbsp;序列定义被删除或改变。&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;认证函数被改变。&amp;nbsp;&lt;br style="padding: 0px; margin: 0px;" /&gt;在所有情况下，解决方法是重新编译并执行该SQL语句。 因为一个已准备好的语句可以由于其它进程改变数据库模式而失效，所有使用&amp;nbsp;sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API&amp;nbsp;的代码都应准备处理&amp;nbsp;SQLITE_SCHEMA错误。下面给出一个例子：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int rc;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sqlite3_stmt *pStmt;&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char zSql[] = "SELECT .....";&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;do {&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Compile the statement from SQL. Assume success. */&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sqlite3_prepare(pDb, zSql, -1, &amp;amp;pStmt, 0);&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;while( SQLITE_ROW==sqlite3_step(pStmt) ){&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Do something with the row of available data */&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;/* Finalize the statement. If an SQLITE_SCHEMA error has&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** occured, then the above call to sqlite3_step() will have&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** returned SQLITE_ERROR. sqlite3_finalize() will return&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** SQLITE_SCHEMA. In this case the loop will execute again.&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = sqlite3_finalize(pStmt);&lt;br style="padding: 0px; margin: 0px;" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while( rc==SQLITE_SCHEMA );&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;strong style="padding: 0px; margin: 0px;"&gt;如何在字符串中使用单引号(')？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;SQL&amp;nbsp;标准规定，在字符串中，单引号需要使用逃逸字符，即在一行中使用两个单引号。在这方面&amp;nbsp;SQL&amp;nbsp;用起来类似Pascal&amp;nbsp;语言。&amp;nbsp;SQLite&amp;nbsp;尊循标准。如：&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;INSERT INTO xyz VALUES('5 O''clock');&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;Sqlite中如何返回本地化当前时间？&lt;br style="padding: 0px; margin: 0px;" /&gt;在做ClinicOS的时候遇到一个问题，在保存病历登记时间时，我使用了&amp;ldquo;CURRENT_TIMESTAMP&amp;rdquo;，但这有个问题，它返回的是UTC Time，这对我们中国人没啥用，一直希望能想办法将它转为localtime。今天刚好有空，所以去查了查Sqlite的Mail List，果然也有人遇到了这个问题，我从一篇名为《translate time comparison statement》（http://www.mail-archive.com/sqlite-users@sqlite.org /msg12350.html）中看到这样的回复：&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;二十.如何更新表中数据&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;update contact set lastname=&amp;rsquo;江南七怪&amp;rsquo;where id = 1028&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding: 0px; margin: 0px;"&gt;update contact set lastname='江南七怪', mobile='13912345678' where id=1028;&lt;/p&gt;&#xD;
&lt;h1 style="padding: 0px; margin: 0px;"&gt;二十一.如何一次插入多个数据&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;pre&gt;Insert into SAMPLE(PRJNUM, PRJNAME, EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE)&lt;/pre&gt;&#xD;
&lt;pre&gt;values(100001, 'TPMS', 200001, 'Johnson', 'A', 2000), (100001, 'TPMS', 200002,&lt;/pre&gt;&#xD;
&lt;pre&gt;'Christine', 'B', 3000), (100001, 'TPMS', 200003, 'Kevin', 'C', 4000), (100002,&lt;/pre&gt;&#xD;
&lt;pre&gt;'TCT', 200001, 'Johnson', 'A', 2000), (100002, 'TCT', 200004, 'Apple', 'B',&lt;/pre&gt;&#xD;
&lt;pre&gt;3000);&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/2211079.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/10/14/2211079.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/07/30/2122030.html</id><title type="text">在查询分析器中直接查询Excel中的数据</title><summary type="text">select RouteName,RouteStepName,OperationName from (SELECT *FROM OPENDATASOURCE( &amp;#39;Microsoft.ACE.OLEDB.12.0&amp;#39;, &amp;#39;Data Source=&amp;quot;D:\Book1.xlsx&amp;quot;;User ID=Admin;Password=;Extended properties=Excel 12.0&amp;#39;)...[Sheet1$]) T</summary><published>2011-07-30T08:02:00Z</published><updated>2011-07-30T08:02:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/07/30/2122030.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/07/30/2122030.html"/><content type="html">&lt;p&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;&amp;nbsp; &amp;nbsp;select RouteName,RouteStepName,OperationName from (SELECT *&lt;br /&gt;FROM   OPENDATASOURCE(&lt;br /&gt;           'Microsoft.ACE.OLEDB.12.0',&lt;br /&gt;           'Data Source="D:\Book1.xlsx";&lt;br /&gt;User ID=Admin;Password=;&lt;br /&gt;Extended properties=Excel 12.0'&lt;br /&gt;)...[Sheet1$]) T&amp;nbsp;&lt;/p&gt;&#xD;
&lt;table style="width: 550px;"&gt;&lt;/table&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/2122030.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/07/30/2122030.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/07/18/2109751.html</id><title type="text">转：Asp.Net大型项目实践</title><summary type="text">来自：http://www.cnblogs.com/legendxian/category/225407.html</summary><published>2011-07-18T09:13:00Z</published><updated>2011-07-18T09:13:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/07/18/2109751.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/07/18/2109751.html"/><content type="html">&lt;p&gt;来自：&lt;a href="http://www.cnblogs.com/legendxian/category/225407.html"&gt;http://www.cnblogs.com/legendxian/category/225407.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/2109751.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/07/18/2109751.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/07/18/2109744.html</id><title type="text">转：跟踪真实世界里的ASP.NET MVC项目</title><summary type="text">来自：http://www.infoq.com/cn/news/2008/05/following-mvc微软ASP.NET MVC框架的第二个技术预览版已经在三月份的MIX08大会上发布，不过它在4月16日又更新了代码。这意味着微软和社区都给这个项目带来了不少有价值的事情。人们现在不仅仅在创建示例代码，而是在创建真实的项目。开发人员能够使用这些应用程序，而有些还处于开发之中，也可以从中学习或者使用它们来开发自己的应用程序。MVC StoreFrontRob Conery记录了使用MVC框架设计和创建一个店面（storefront）的过程，并且结合了测试驱动开发等敏捷开发实践，以及Reposi</summary><published>2011-07-18T09:10:00Z</published><updated>2011-07-18T09:10:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/07/18/2109744.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/07/18/2109744.html"/><content type="html">&lt;p&gt;来自：&lt;a href="http://www.infoq.com/cn/news/2008/05/following-mvc"&gt;http://www.infoq.com/cn/news/2008/05/following-mvc&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;微软ASP.NET MVC框架的第二个技术预览版已经在三月份的MIX08大会上发布，不过它在4月16日又更新了代码。这意味着微软和社区都给这个项目带来了不少有价值的事情。人们现在不仅仅在创建示例代码，而是在创建真实的项目。&lt;/p&gt;&#xD;
&lt;p&gt;开发人员能够使用这些应用程序，而有些还处于开发之中，也可以从中学习或者使用它们来开发自己的应用程序。&lt;/p&gt;&#xD;
&lt;h2 style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; color: #000000; font-size: 20px; padding-top: 4px; padding-right: 160px; padding-bottom: 4px; padding-left: 0px; font: normal normal bold 1em/normal arial; letter-spacing: -1px; background-position: initial initial; background-repeat: initial initial; margin: 0px;"&gt;MVC StoreFront&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="v-ak8" goog_docs_charindex="1616" href="http://blog.wekeroad.com/" style="text-decoration: underline; color: #0b59b2;"&gt;Rob Conery&lt;/a&gt;记录了使用MVC框架设计和创建一个店面（storefront）的过程，并且结合了测试驱动开发等敏捷开发实践，以及Repository Pattern等常用模式。Rob 在这个领域有许多经验,他是ASP.NET 2.0 Commerce Start Kit的最早开发者，也就是后来的&lt;a id="v-ak9" goog_docs_charindex="1768" href="http://dashcommerce.org/default.aspx" style="text-decoration: underline; color: #0b59b2;"&gt;dashCommerce&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;MVC Stroefront还是一个正在进行中的系列，这使读者能够经历一个从设计到开发一个ASP.NET MVC应用程序的完整过程。系列中的每部分都包含一个针对当前部分意图的描述，以及一个视频来展示代码。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li id="v-ak12" goog_docs_charindex="2584"&gt;&lt;a id="v-ak13" goog_docs_charindex="2585" href="http://blog.wekeroad.com/mvc-storefront/mvc-storefront-part-1/" style="text-decoration: underline; color: #0b59b2;"&gt;ASP.NET MVC: MVC StoreFront系列的介绍&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak14" goog_docs_charindex="2621"&gt;&lt;a id="v-ak15" goog_docs_charindex="2622" href="http://blog.wekeroad.com/mvc-storefront/asp-net-mvc-mvc-storefront-part-2/" style="text-decoration: underline; color: #0b59b2;"&gt;ASP.NET MVC: MVC Storefront,&amp;nbsp;第2部分 - Repository Pattern&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak16" goog_docs_charindex="2680"&gt;&lt;a id="v-ak17" goog_docs_charindex="2681" href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/" style="text-decoration: underline; color: #0b59b2;"&gt;ASP.NET MVC: MVC Storefront, 第3部分 - Pipes和Filters&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak18" goog_docs_charindex="2734"&gt;&lt;a id="v-ak19" goog_docs_charindex="2735" href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-4/" style="text-decoration: underline; color: #0b59b2;"&gt;ASP.NET MVC: MVC Storefront, 第4部分 - Linq To Sql&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak20" goog_docs_charindex="2786"&gt;&lt;a id="v-ak21" goog_docs_charindex="2787" href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-5/" style="text-decoration: underline; color: #0b59b2;"&gt;ASP.NET MVC: MVC Storefront, 第5部分 -&amp;nbsp;全球化&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak22" goog_docs_charindex="2830"&gt;&lt;a id="v-ak23" goog_docs_charindex="2831" href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-6/" style="text-decoration: underline; color: #0b59b2;"&gt;MVC Storefront, Part 6: Catalog Completion和Initial UI&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak24" goog_docs_charindex="2888"&gt;&lt;a id="v-ak25" goog_docs_charindex="2889" href="http://blog.wekeroad.com/mvc-storefront/mvcstore-part-7/http://blog.wekeroad.com/mvc-storefront/mvcstore-part-7/" style="text-decoration: underline; color: #0b59b2;"&gt;MVC Storefront, Part 7: Helpers和Routing&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;项目最新的代码能够在&lt;a id="v-ak27" goog_docs_charindex="3018" href="http://www.codeplex.com/mvcsamples" style="text-decoration: underline; color: #0b59b2;"&gt;CodePlex上找到&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;h2 style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; color: #000000; font-size: 20px; padding-top: 4px; padding-right: 160px; padding-bottom: 4px; padding-left: 0px; font: normal normal bold 1em/normal arial; letter-spacing: -1px; background-position: initial initial; background-repeat: initial initial; margin: 0px;"&gt;博客引擎&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="v-ak30" goog_docs_charindex="3295" href="http://nayyeri.net/" style="text-decoration: underline; color: #0b59b2;"&gt;Keyvan Nayyeri&lt;/a&gt;有一个使用ASP.NET MVC开发一个博客引擎（Blog Engine）的系列。建立一个博客引擎似乎是一个向人们展示技术的流行方法，而这个项目做的不错。大部分开发人员与博客关系密切。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li id="v-ak32" goog_docs_charindex="3689"&gt;&lt;a id="v-ak33" goog_docs_charindex="3690" href="http://aspalliance.com/1538_Building_a_Simple_Blog_Engine_with_ASPNET_MVC_and_LINQ__Part_1" style="text-decoration: underline; color: #0b59b2;"&gt;使用ASP.NET MVC和LINQ开发一个简单的博客引擎 - 第1部分&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak34" goog_docs_charindex="3730"&gt;&lt;a id="v-ak35" goog_docs_charindex="3731" href="http://aspalliance.com/1559_Building_a_Simple_Blog_Engine_with_ASPNET_MVC_and_LINQ__Part_2" style="text-decoration: underline; color: #0b59b2;"&gt;使用ASP.NET MVC和LINQ开发一个简单的博客引擎 - 第2部分&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak36" goog_docs_charindex="3771"&gt;&lt;a id="v-ak37" goog_docs_charindex="3772" href="http://aspalliance.com/1604_Building_a_Simple_Blog_Engine_with_ASPNET_MVC_and_LINQ__Part_3" style="text-decoration: underline; color: #0b59b2;"&gt;使用ASP.NET MVC和LINQ开发一个简单的博客引擎 - 第3部分&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li id="v-ak38" goog_docs_charindex="3812"&gt;&lt;a id="v-ak39" goog_docs_charindex="3813" href="http://aspalliance.com/1630_Building_a_Simple_Blog_Engine_with_ASPNET_MVC_and_LINQ__Part_4" style="text-decoration: underline; color: #0b59b2;"&gt;使用ASP.NET MVC和LINQ开发一个简单的博客引擎 - 第4部分&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;h2 style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; color: #000000; font-size: 20px; padding-top: 4px; padding-right: 160px; padding-bottom: 4px; padding-left: 0px; font: normal normal bold 1em/normal arial; letter-spacing: -1px; background-position: initial initial; background-repeat: initial initial; margin: 0px;"&gt;Kigg - Digg的克隆&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个Digg的克隆产品是一个使用MVC框架的优秀实现。这个程序属于&lt;a id="v-ak42" goog_docs_charindex="4154" href="http://kigg.dotnetslackers.com/" style="text-decoration: underline; color: #0b59b2;"&gt;Dotnetslackers站点的一部分&lt;/a&gt;。这份指南面向.NET开发人员工作中的几个重要部分：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li id="v-ak44" goog_docs_charindex="4352"&gt;使用传统的Web Forms作为视图（View）&lt;/li&gt;&#xD;
&lt;li id="v-ak45" goog_docs_charindex="4379"&gt;使用LINQ to SQL来开发模型（Model）&lt;/li&gt;&#xD;
&lt;li id="v-ak46" goog_docs_charindex="4407"&gt;使用ASP.NET Ajax进行AJAX操作&lt;/li&gt;&#xD;
&lt;li id="v-ak47" goog_docs_charindex="4432"&gt;使用VSTest和NUnit进行单元测试&lt;/li&gt;&#xD;
&lt;li id="v-ak48" goog_docs_charindex="4455"&gt;Rhino Mock&lt;/li&gt;&#xD;
&lt;li id="v-ak50" goog_docs_charindex="4469"&gt;&lt;a id="v-ak51" goog_docs_charindex="4470" href="http://dotnetslackers.com/articles/aspnet/KiggBuildingADiggCloneWithASPNETMVC1.aspx" style="text-decoration: underline; color: #0b59b2;"&gt;Kigg - 使用ASP.NET MVC开发一个Digg的克隆产品 - 第1部分&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span  style="font-family: Lucida, 'Lucida Grande', Arial, 宋体, sans-serif; font-size: 13px; line-height: 16px;"&gt;项目最新的代码能够在&lt;a id="v-ak27" title="CodePlex上找到" goog_docs_charindex="4601" href="http://www.codeplex.com/Kigg" style="text-decoration: underline; color: #0b59b2;"&gt;CodePlex上找到&lt;/a&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p id="n2he0" goog_docs_charindex="4820"&gt;其他一些展示ASP.NET MVC的功能的项目还刚刚起步。请继续在InfoQ站点上关注新项目以及本文这些项目的进展。&lt;/p&gt;&#xD;
&lt;p goog_docs_charindex="4820"&gt;&lt;strong id="v-ak54" goog_docs_charindex="4883"&gt;查看英文原文：&lt;/strong&gt;&lt;a id="v-ak55" goog_docs_charindex="4892" href="http://www.infoq.com/news/2008/05/following-mvc" style="text-decoration: underline; color: #0b59b2;"&gt;Following Real-World ASP.NET MVC Projects&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/2109744.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/07/18/2109744.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/05/17/2048880.html</id><title type="text">转：学习 HeroKu 的架构设计</title><summary type="text">来自：http://www.dbanotes.net/arch/heroku_architecture.html这几天给我印象比较深的是HeroKu，提供 Ruby 快速部署环境并提供托管能力，他们的架构图做得十分漂亮，一幅图胜过千言万语，要是对 Web 架构感兴趣，都别问架构师了，看看 HeroKu 的架构估计就明白个差不多了 :)概览图好的架构图是画出来的，好的架构未必是设计出来的，最后架构好不好，还要看持续的改进能力。HTTP反向代理使用Nginx, 这一层只进行HTTP-level 的处理。Nginx 现在是不二选择。HTTPCache对于静态内容，使用Varnish进行缓存。如果你在</summary><published>2011-05-17T06:50:00Z</published><updated>2011-05-17T06:50:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/05/17/2048880.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/05/17/2048880.html"/><content type="html">&lt;p&gt;来自：&lt;a href="http://www.dbanotes.net/arch/heroku_architecture.html"&gt;http://www.dbanotes.net/arch/heroku_architecture.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这几天给我印象比较深的是&amp;nbsp;&lt;a href="http://heroku.com/"&gt;HeroKu&lt;/a&gt;&amp;nbsp;，提供 Ruby 快速部署环境并提供托管能力，他们的架构图做得十分漂亮，一幅图胜过千言万语，要是对 Web 架构感兴趣，都别问架构师了，看看 HeroKu 的架构估计就明白个差不多了 :)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;概览图&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;好的架构图是画出来的，好的架构未必是设计出来的，最后架构好不好，还要看持续的改进能力。&lt;/p&gt;&#xD;
&lt;span &gt;&lt;img alt="HeroKu Overview.jpg" src="http://www.dbanotes.net/Images/HeroKu%20Overview.jpg" width="240" height="240"  /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;acronym title="HyperText Transfer Protocol&#xD;
"&gt;HTTP&lt;/acronym&gt;&amp;nbsp;反向代理&lt;/strong&gt;&lt;br /&gt;&#xD;
&lt;p&gt;使用&amp;nbsp;&lt;a href="http://nginx.net/"&gt;Nginx&lt;/a&gt;&amp;nbsp;, 这一层只进行&amp;nbsp;&lt;acronym title="HyperText Transfer Protocol&#xD;
"&gt;HTTP&lt;/acronym&gt;-level 的处理。Nginx 现在是不二选择。&lt;/p&gt;&#xD;
&lt;span &gt;&lt;img alt="HeroKu Reverse Proxy.jpg" src="http://www.dbanotes.net/Images/HeroKu%20Reverse%20Proxy.jpg" width="240" height="106"  /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;acronym title="HyperText Transfer Protocol&#xD;
"&gt;HTTP&lt;/acronym&gt;&amp;nbsp;Cache&lt;/strong&gt;&lt;br /&gt;&#xD;
&lt;p&gt;对于静态内容，使用&amp;nbsp;&lt;a href="http://varnish.projects.linpro.no/"&gt;Varnish&lt;/a&gt;&amp;nbsp;进行缓存。如果你在 Squid 和 Varnish 之间作选择，这里已经投了一票。&lt;/p&gt;&#xD;
&lt;span &gt;&lt;img alt="HeroKu HTTP cache.jpg" src="http://www.dbanotes.net/Images/HeroKu%20HTTP%20cache.jpg" width="240" height="104"  /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;路由网(Routing Mesh)&lt;/strong&gt;&lt;br /&gt;&#xD;
&lt;p&gt;用&amp;nbsp;&lt;a href="http://erlang.org/"&gt;Erlang&lt;/a&gt;&amp;nbsp;实现的架构组件，路由寻址，用以提升可用性和扩展性。&lt;/p&gt;&#xD;
&lt;span &gt;&lt;img alt="HeroKu Routing Mesh.jpg" src="http://www.dbanotes.net/Images/HeroKu%20Routing%20Mesh.jpg" width="240" height="150"  /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;动态网格(Dyno Grid)&lt;/strong&gt;&lt;br /&gt;&#xD;
&lt;p&gt;用户部署的代码运行在这里，可以简单看成是应用服务器集群环境，只是粒度更小一点而已。&lt;/p&gt;&#xD;
&lt;span &gt;&lt;img alt="HeroKu Dyno Grid.jpg" src="http://www.dbanotes.net/Images/HeroKu%20Dyno%20Grid.jpg" width="240" height="210"  /&gt;&lt;/span&gt;&#xD;
&#xD;
&lt;p&gt;对于 Dyno Grid 的进一步信息：&lt;/p&gt;&#xD;
&lt;span &gt;&lt;img alt="HeroKu Dyno Grid Arch.jpg" src="http://www.dbanotes.net/Images/HeroKu%20Dyno%20Grid%20Arch.jpg" width="240" height="204"  /&gt;&lt;/span&gt;&#xD;
&lt;p&gt;服务器操作系统是 Debian ；Ruby VM 是 MRI ，开源，C 写的；App Server 用的&amp;nbsp;&lt;a href="http://code.macournoyer.com/thin/"&gt;Thin&lt;/a&gt;，他们说 Thin 比&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Mongrel_(web_server)"&gt;Mongrel&lt;/a&gt;&amp;nbsp;更精炼；Rack，应用服务器接口；Rack 中间件，可选组件；框架，任何 Rack 兼容的都成；最后是客户托管的代码。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;数据库&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;，也可以采用远程数据库。&lt;/p&gt;&#xD;
&lt;span &gt;&lt;img alt="HeroKu Database.jpg" src="http://www.dbanotes.net/Images/HeroKu%20Database.jpg" width="240" height="235"  /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Memory Cache&lt;/strong&gt;&lt;br /&gt;&#xD;
&lt;p&gt;Memcached ，居家旅行架构必备。&lt;/p&gt;&#xD;
&lt;span &gt;&lt;img alt="HeroKu Memcached.jpg" src="http://www.dbanotes.net/Images/HeroKu%20Memcached.jpg" width="240" height="217"  /&gt;&lt;/span&gt;&#xD;
&#xD;
&lt;p&gt;这几张图看下来，多少算是对 Ruby 环境有了一些感性认识。可以进一步查看 HeroKu 提供的&lt;a href="http://heroku.com/docs"&gt;文档&lt;/a&gt;，包含了一些代码实现上的准则。&lt;/p&gt;&#xD;
&lt;p&gt;部署是基于&amp;nbsp;&lt;a href="http://git-scm.com/"&gt;Git&amp;nbsp;&lt;/a&gt;的。不知道大家有没有注意到 Git 在最近一年来的爆发? 超过 SVN 或许不是不可能的。&lt;/p&gt;&#xD;
&lt;p&gt;国内热炒"云计算"的，跟人家学学吧，与其整天帮着客户开发定制软件，还不如给客户提供一些弹性应用托管环境，起码看起来靠谱一些。&lt;/p&gt;&#xD;
&lt;p&gt;HeroKu ，不读 Hero-Ku, 读作 Her-oh-koo, 挺有趣&lt;/p&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/2048880.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/05/17/2048880.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/02/18/1957478.html</id><title type="text">转：ITIL的開源軟件</title><summary type="text">来自：http://blog.csdn.net/andyxm/archive/2009/09/29/4616546.aspx這裡所列出的通用軟件所使用的組織作為主要手段的ITIL流程。There are five main disciplines within ITIL which has open source ITIL software to support the discipline's processes:有5個主要學科已在ITIL的開源ITIL的軟件，以支持紀律的過程：Service Delivery服務交付Service Support服務支持Infrastructure Man</summary><published>2011-02-18T00:54:00Z</published><updated>2011-02-18T00:54:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/02/18/1957478.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/02/18/1957478.html"/><content type="html">&lt;div&gt;来自：&lt;a href="http://blog.csdn.net/andyxm/archive/2009/09/29/4616546.aspx"&gt;http://blog.csdn.net/andyxm/archive/2009/09/29/4616546.aspx&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: verdana, sans-serif; "&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;span style="line-height: 21px; "&gt;這裡所列出的通用軟件所使用的組織作為主要手段的ITIL流程。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;There are five main disciplines within ITIL which has open source ITIL software to support the discipline's processes:&lt;/span&gt;有5個主要學科已在ITIL的開源ITIL的軟件，以支持紀律的過程：&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 35px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; list-style-type: disc; "&gt;&lt;span&gt;Service Delivery服務交付&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; list-style-type: disc; "&gt;&lt;span&gt;Service Support服務支持&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; list-style-type: disc; "&gt;&lt;span&gt;Infrastructure Management基礎設施管理&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; list-style-type: disc; "&gt;&lt;span&gt;Application Management應用管理&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; list-style-type: disc; "&gt;&lt;span&gt;Software Asset Management軟件資產管理&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;If your organization has limited budget for integrated and expensive enterprise software but realizes the need to apply and implement ITIL processes within the IT department or the company as a whole, check out the following listing of open source software to support your ITIL processes.&lt;/span&gt;如果你所在的組織預算有限的綜合性和昂貴的企業軟件，但實現的需要申請和實施ITIL流程的IT部門或本公司作為一個整體，看看下面的上市開放源碼軟件，以支持您的ITIL流程。&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;Service Management &amp;#8211; Service Support&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;服務管理-服務支持&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;em style="font-style: italic; "&gt;&lt;strong&gt;Service Desk&lt;/strong&gt;&amp;nbsp;&amp;#8211; The single point of contact between IT Users and IT Service Management&lt;/em&gt;&lt;/span&gt;&amp;nbsp;&lt;em style="font-style: italic; "&gt;&lt;strong&gt;服務台&lt;/strong&gt;&amp;nbsp;-的單一的聯絡點之間的IT用戶和IT服務管理&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;em style="font-style: italic; "&gt;&lt;strong&gt;Incident Management&lt;/strong&gt;&amp;nbsp;&amp;#8211; The process to restore IT services as fast as possible to ensure little distruption&lt;/em&gt;&lt;/span&gt;&amp;nbsp;&lt;em style="font-style: italic; "&gt;&lt;strong&gt;事件管理&lt;/strong&gt;&amp;nbsp;-這一進程&lt;/em&gt;&amp;nbsp;，&amp;nbsp;&lt;em style="font-style: italic; "&gt;以恢復IT服務&lt;/em&gt;&amp;nbsp;，&amp;nbsp;&lt;em style="font-style: italic; "&gt;盡快以確保小distruption&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;em style="font-style: italic; "&gt;&lt;strong&gt;Problem Management&lt;/strong&gt;&amp;nbsp;&amp;#8211; The process to resolve root cause of incidents and identify known errors&lt;/em&gt;&lt;/span&gt;&amp;nbsp;&lt;em style="font-style: italic; "&gt;&lt;strong&gt;問題管理&lt;/strong&gt;&amp;nbsp;-這一進程&lt;/em&gt;&amp;nbsp;，&amp;nbsp;&lt;em style="font-style: italic; "&gt;以解決事件的根源&lt;/em&gt;&amp;nbsp;，&amp;nbsp;&lt;em style="font-style: italic; "&gt;並查明已知錯誤&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;em style="font-style: italic; "&gt;&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;a title="OneOrZero任務管理和幫助台" href="http://www.oneorzero.com/" target="_blank" style="text-decoration: none; color: #336699; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;OneOrZero Task Management and Help Desk System&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;strong&gt;OneOrZero任務管理和幫助台系統&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;&amp;#8211;&lt;/strong&gt;&amp;nbsp;The OneOrZero Task Management and Help Desk System is a powerful, enterprise grade task management and help desk application.&lt;/span&gt;&amp;nbsp;&lt;strong&gt;-&lt;/strong&gt;在OneOrZero任務管理和幫助台系統是一個功能強大的，企業級的任務管理和服務台應用。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;It is fast, customizable and runs on virtually any platform and is released under the General Public Licence (GPL) Open Source license, allowing you to customize freely.&lt;/span&gt;這是快速，可定制和運行在幾乎所有平台，並發布的通用公共許可證（ GPL ）的開源許可證，允許您自定義自由。&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;a title="Eventum" href="http://eventum.mysql.org/wiki/index.php/Main_Page" target="_blank" style="text-decoration: none; color: #336699; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;Eventum&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;strong&gt;Eventum&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&amp;#8211; is a user-friendly and flexible issue tracking system that can be used by a support department to track incoming technical support requests, or by a software development team to quickly organize tasks and bugs.&lt;/span&gt;&amp;nbsp;-是一個用戶友好的和靈活的問題跟踪系統，可以使用一個支持部追踪技術支援的要求，或由一個軟件開發團隊，迅速組織任務和錯誤。&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;a title="OSTicket" href="http://www.osticket.com/" target="_blank" style="text-decoration: none; color: #336699; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;OSTicket&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;strong&gt;OSTicket&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&amp;#8211; osTicket is a widely-used open source support ticket system.&lt;/span&gt;&amp;nbsp;- osTicket是一種廣泛使用的開放原始碼支援票證制度。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;Plain and simple it is a lightweight feature packed support ticket tool written mainly using PHP scripting language.&lt;/span&gt;簡單明了這是一個輕巧便攜功能支援票證工具書面主要使用PHP腳本語言。&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;a title="格台" href="http://www.accord5.com/trellis" target="_blank" style="text-decoration: none; color: #336699; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;Trellis Desk&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;格台&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&amp;#8211; Trellis Desk is a powerful, robust help desk solution for your business.&lt;/span&gt;&amp;nbsp;-網格台是一個功能強大的，強大的服務台解決方案為您的企業。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;Improve your company's service by allowing your customers to quickly and easily submit support tickets to your team.&lt;/span&gt;提高貴公司的服務，讓您的客戶快速，方便地提交票支持您的團隊。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;Trellis Desk sports a range of advanced features to revitalize the way your business handles customer support.&lt;/span&gt;格台體育一系列先進的功能，以振興您的業務處理方式的客戶支持。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;Even better, it's completely free; you don't have to pay any license fees to use Trellis Desk.&lt;/span&gt;甚至更好，而且完全免費，您不必支付任何許可費用使用網格台。&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;a title="OTRS的ITSM" href="http://www.otrs.com/en/products/otrsitsm/" target="_blank" style="text-decoration: none; color: #336699; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;&lt;strong&gt;OTRS ITSM&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;strong&gt;OTRS的ITSM&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;/a&gt;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;-&amp;nbsp;OTRS::ITSM 1.0 is the first ITIL compliant IT service management solution on open-source basis, built on the solid fundament of over 55,000 known OTRS installations and the related active community.&lt;/span&gt;&amp;nbsp;- OTRS ： ： ITSM的1.0是第一個符合ITIL的IT服務管理解決方案，開放源代碼的基礎上，建立在堅實的基礎超過55,000已知OTRS設施和相關的積極的社會。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;It is an&amp;nbsp;ITIL compliant Open Source IT Service Management&amp;nbsp;(ITSM)&amp;nbsp;Solution.&lt;/span&gt;這是一個兼容的開源ITIL的IT服務管理（ ITSM ）解決方案。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;Requires the OTRS (Open Ticket Request System) framework.&lt;/span&gt;需要OTRS （開放票證請求系統）的框架。&lt;/span&gt;&amp;nbsp;&lt;span style="line-height: 21px; "&gt;&lt;span style="line-height: 21px; "&gt;Besides all OTRS features, this solution includes Incident, Problem and Configuration Management, Integrated Configuration Management Database; Process Spanning Communication Management: within the IT Service Organization, towards Customers/Users/Management and Suppliers/Providers; powerfull statistical features for Trend Analysis, key figured Reporting, ITSM-Planning / Controlling; flexible configuration, customizing and expandability with regards to your individual requirements.&lt;/span&gt;除了所有OTRS的功能，這一解決方案包括事件，問題和配置管理，綜合配置管理數據庫;向前延伸通信管理：在IT服務組織，對客戶/用戶/管理和供應商/供應商;強大的統計功能，趨勢分析，關鍵計算報告， ITSM的規劃/控制;靈活的配置，定制和可擴展性對於您的個人要求。&lt;/span&gt;&lt;/p&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/1957478.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/02/18/1957478.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/01/28/1947028.html</id><title type="text">转：JS 获取鼠标位置</title><summary type="text">来自：http://sofish.de/1498对于一切关于位置和宽高的东西，在 JS 都特别麻烦。好在由于某些原因，需要用到的地方也很少。这也成为了不去了解的借口。今晚回来瞄一下书。看一下获取鼠标位置的兼容写法。虽然 JS 不会像 CSS 那么难搞，但兼容一直是最不爽的。还好有 PPK 老师和 Google 老师。简单来说，精简为这个表：属性参考点浏览器兼容性ClientX, ClientYdocumentIEPageX, PageYwindowsane browsers其他的LayerX, LayerY, OffsetX, OffsetY, ScreenX, ScreenY, x, y 都</summary><published>2011-01-28T07:01:00Z</published><updated>2011-01-28T07:01:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1947028.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1947028.html"/><content type="html">&lt;p&gt;来自：&lt;a href="http://sofish.de/1498"&gt;http://sofish.de/1498&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="font-family: Georgia, 宋体, Arial, sans-serif; "&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;对于一切关于位置和宽高的东西，在 JS 都特别麻烦。好在由于某些原因，需要用到的地方也很少。这也成为了不去了解的借口。今晚回来瞄一下书。看一下获取鼠标位置的兼容写法。&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;虽然 JS 不会像 CSS 那么难搞，但兼容一直是最不爽的。还好有 PPK 老师和 Google 老师。简单来说，精简为这个表：&lt;/p&gt;&lt;table style="border-collapse: collapse; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; margin-bottom: 15px; "&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scrope="col" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; font-style: normal; font-weight: 400; text-align: left; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ddeef6; text-shadow: #ffffff 1px 1px 2px; background-position: initial initial; background-repeat: initial initial; "&gt;属性&lt;/th&gt;&lt;th scrope="col" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; font-style: normal; font-weight: 400; text-align: left; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ddeef6; text-shadow: #ffffff 1px 1px 2px; background-position: initial initial; background-repeat: initial initial; "&gt;参考点&lt;/th&gt;&lt;th scrop="col" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; font-style: normal; font-weight: 400; text-align: left; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ddeef6; text-shadow: #ffffff 1px 1px 2px; background-position: initial initial; background-repeat: initial initial; "&gt;浏览器兼容性&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; "&gt;ClientX, ClientY&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; "&gt;document&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; "&gt;IE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; "&gt;PageX, PageY&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; "&gt;window&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; "&gt;sane browsers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 8px; padding-bottom: 3px; padding-left: 8px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dddddd; border-right-color: #dddddd; border-bottom-color: #dddddd; border-left-color: #dddddd; "&gt;其他的LayerX, LayerY, OffsetX, OffsetY, ScreenX, ScreenY, x, y 都 TM 是浮云，不用理会&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;然后，再看一个 Demo 吧：&lt;a href="http://www.sofish.de/file/demo/mousePosition.html" style="text-decoration: none; color: #cc3300; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #a3a3a3; "&gt;点这里点这里！&lt;/a&gt;&amp;nbsp;(把你的鼠标放在页面上乱划吧)&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;============&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;好吧，这算是个分割线。其实一直挺想写博客的。不过有时候华数网通很不给力，编辑器也很不给力。MB。让我写不成。今晚是搞了很久，才上得了博客，写了几百只字。真是，RP啊，长相啊，浮云啊。SHIT。&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;话说，最近收获不少。只是，白天在公司都比较忙，晚上回来又晚，有很多分享也都偏向于发 tweet。博客就一天天没去理她了。其实，这是不行滴。&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;感觉年轻人就应该多写写（虽然已经大叔年龄了），写下来和思考得到的结果差异总是很大。就像 PPK 说的，记下来分享，让他自己收获很多。是的，特别是写 DEMO 的时候。为了对得起读者，就要多方面测试。这其实也给自己积累了不少经验。或许，你也一样。&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="font-family: Georgia, 宋体, Arial, sans-serif; "&gt;少年。有空就记下来吧。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/1947028.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1947028.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/01/28/1946959.html</id><title type="text">转：百万级访问量网站的技术准备工作</title><summary type="text">来自：http://www.infoq.com/cn/articles/lzy-million-visits-site-technical-preparations当今从纯网站技术上来说，因为开源模式的发展，现在建一个小网站已经很简单也很便宜，所以很多人都把创业方向定位在互联网应用。这些人里大多数不是很懂技术，或者不是那么精通，而网站开发维护方面的知识又很分散，学习成本太高，所以这篇文章将这些知识点结合起来，系统的来说，一个从日几千访问的小小网站，到日访问一两百万的小网站，中间可能会产生什么问题，以及怎么才能在一开始做足工作尽量避免这些问题。相关厂商内容QCon全球企业开发大会（北京站），1月</summary><published>2011-01-28T05:38:00Z</published><updated>2011-01-28T05:38:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1946959.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1946959.html"/><content type="html">&lt;p&gt;来自：&lt;a href="http://www.infoq.com/cn/articles/lzy-million-visits-site-technical-preparations"&gt;http://www.infoq.com/cn/articles/lzy-million-visits-site-technical-preparations&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: Lucida, 'Lucida Grande', Arial, 宋体, sans-serif; line-height: 16px; font-size: 13px; "&gt;当今从纯网站技术上来说，因为开源模式的发展，现在建一个小网站已经很简单也很便宜，所以很多人都把创业方向定位在互联网应用。这些人里大多数不是很懂技术，或者不是那么精通，而网站开发维护方面的知识又很分散，学习成本太高，所以这篇文章将这些知识点结合起来，系统的来说，一个从日几千访问的小小网站，到日访问一两百万的小网站，中间可能会产生什么问题，以及怎么才能在一开始做足工作尽量避免这些问题。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="font-family: Lucida, 'Lucida Grande', Arial, 宋体, sans-serif; line-height: 16px; font-size: 13px; "&gt;&lt;div style="background-color: #f9f9f9; line-height: 14px; margin-top: 0px; margin-right: 15px; margin-bottom: 15px; margin-left: 5px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; float: right; width: 275px; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #eeeeee; border-right-color: #eeeeee; border-bottom-color: #eeeeee; border-left-color: #eeeeee; "&gt;&lt;p&gt;&lt;strong&gt;相关&lt;span style="color: #87b2e3; "&gt;厂商&lt;/span&gt;内容&lt;/strong&gt;&lt;/p&gt;&lt;p f_vcrembed"="" jsh="{&amp;quot;title&amp;quot;:&amp;quot;QCon全球企业开发大会（北京站），1月31日前7折抢票火热进行中！&amp;quot;,&amp;quot;id&amp;quot;:1269}" style="padding-top: 0px; padding-right: 0px; padding-bottom: 5px; padding-left: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 12px; background-image: url(http://cdn2.infoq.com/styles/cn/i/icon-rvc.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: 0px 0px; background-repeat: no-repeat no-repeat; "&gt;&lt;a href="http://www.infoq.com/cn/vendorcontent/show.action?vcr=1269" target="_blank" style="text-decoration: none; color: #333333; font-weight: bold; "&gt;QCon全球企业开发大会（北京站），1月31日前7折抢票火热进行中！&lt;/a&gt;&lt;/p&gt;&lt;p f_vcrembed"="" jsh="{&amp;quot;title&amp;quot;:&amp;quot;领域设计驱动（DDD）之父Eric Evans确认出席QCon北京2011大会&amp;quot;,&amp;quot;id&amp;quot;:1303}" style="padding-top: 0px; padding-right: 0px; padding-bottom: 5px; padding-left: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 12px; background-image: url(http://cdn2.infoq.com/styles/cn/i/icon-rvc.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: 0px 0px; background-repeat: no-repeat no-repeat; "&gt;&lt;a href="http://www.infoq.com/cn/vendorcontent/show.action?vcr=1303" target="_blank" style="text-decoration: none; color: #333333; font-weight: bold; "&gt;领域设计驱动（DDD）之父Eric Evans确认出席QCon北京2011大会&lt;/a&gt;&lt;/p&gt;&lt;p f_vcrembed"="" jsh="{&amp;quot;title&amp;quot;:&amp;quot;Adobe Flash Builder 4简体中文正式版高速下载&amp;quot;,&amp;quot;id&amp;quot;:664}" style="padding-top: 0px; padding-right: 0px; padding-bottom: 5px; padding-left: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 12px; background-image: url(http://cdn2.infoq.com/styles/cn/i/icon-rvc.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: 0px 0px; background-repeat: no-repeat no-repeat; "&gt;&lt;a href="http://www.infoq.com/cn/vendorcontent/show.action?vcr=664" style="text-decoration: none; color: #333333; font-weight: bold; "&gt;Adobe Flash Builder 4简体中文正式版高速下载&lt;/a&gt;&lt;/p&gt;&lt;p f_vcrembed"="" jsh="{&amp;quot;title&amp;quot;:&amp;quot;全球最大视频网站Netflix架构师Adrian Cockroft介绍其云计算架构&amp;quot;,&amp;quot;id&amp;quot;:1302}" style="padding-top: 0px; padding-right: 0px; padding-bottom: 5px; padding-left: 20px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 12px; background-image: url(http://cdn2.infoq.com/styles/cn/i/icon-rvc.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: 0px 0px; background-repeat: no-repeat no-repeat; "&gt;&lt;a href="http://www.infoq.com/cn/vendorcontent/show.action?vcr=1302" target="_blank" style="text-decoration: none; color: #333333; font-weight: bold; "&gt;全球最大视频网站Netflix架构师Adrian Cockroft介绍其云计算架构&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;你的网站因为努力经营，访问量逐渐升高，在升高的过程中，问题也可能开始显现了。因为带宽的增加、硬件的扩展、人员的扩张所带来的成本提高是显而易见的，而还有相当大的一部分成本是因为代码重构、架构重构，甚至底层开发语言更换引起的，最坏的情况就是数据丢失，所有努力付之一炬。这类成本支出大多数在一开始就可以避免，先打好基础，往后可以省很多精力，少操很多心。&lt;/p&gt;&lt;p&gt;对于不同的初期投资成本，技术路线的选择是不同的。这里假设网站刚刚只是一个构想，计划第一年服务器硬件带宽投入5万左右。对于这个资金额度，有很多种方案可选择，例如租用虚拟主机、租用单独服务器，或者流行的私有云，或者托管服务器。前两种选择，网站发展到一定规模时需迁移，那时再重做规划显然影响更大。服务器托管因为配置自主、能完全掌握控制权，所以有一定规模的网站基本都是这种模式。采用自己托管服务器的网站，一开始要注意以下几点&amp;#8212;&amp;#8212;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、开发语言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一般来说，技术人员（程序员）都是根据自己技术背景选择自己最熟悉的语言，不过不可能永远是一个人写程序，所以在语言的选择上还要是要费些心思。首先明确一点，无论用什么语言，最终代码质量是看管理，因此我们从前期开发成本分析。现在国内流行的适用于网站的语言，大概有java、php、.net、python、ruby这五大阵营。python和ruby因为在国内流行的比较晚，现在人员还是相对难招一些。.net平台的人相对多，但是到后期需要解决性能问题时，对人员技能的要求比较高。剩余的java、php用人可以说是最多的。java和php无法从语言层面做比较，但对于初期，应用几乎都是靠前端支撑的网站来说，php入门简单、编写快速，优势相对大一点。至于后端例如行为分析、银行接口、异步消息处理等，等真正需要时，就要根据不同业务需求来选择不同语言了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、代码版本管理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;稍微有点规模的网站就需要使用代码版本管理了。代码版本管理两点最大的好处，一是方便协同工作，二是有历史记录可查询比较。代码版本管理软件有很多，vss/cvs/svn/hg等，目前国内都比较流行，其中svn的普及度还是很高的。&lt;/p&gt;&lt;p&gt;假设选了svn，那么有几点考虑。一是采用什么树结构。初期可能只有一条主干，往后就需要建立分支，例如一条开发分支，一条上线分支，再往后，可能要每个小组一个分支。建议一开始人少时选择两条分支，开发和线上，每个功能本地测试无误后提交到开发分支，最后统一测试，可以上线时合并到上线分支。如果每人都建自己的分支，合并时会浪费很大精力，对于几乎每天都要修改几次的WEB应用来说，所费时间太多。&lt;/p&gt;&lt;p&gt;向服务器部署代码，可以手工部署也可以自动部署。手工部署相对简单，一般可直接在服务器上svn update，或者找个新目录svn checkout，再把web root给ln -s过去。应用越复杂，部署越复杂，没有什么统一标准，只是别再用ftp上传那种形式，一是上传时文件引用不一致错误率增加，二是很容易出现开发人员的版本跟线上版本不一致，导致本来想改个错字结果变成回滚。如果有多台服务器还是建议自动部署，更换代码的机器从当前服务池中临时撤出，更新完毕后再重新加入。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三、服务器硬件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在各个机房里，靠一台服务器孤独支撑的网站数不清，但如果资金稍微充足，建议至少三台的标准配置，分别用作web处理、数据库、备份。web服务器至少要8G内存，双sata raid1，如果经济稍微宽松，或静态文件或图片多，则15k sas raid10。数据库至少16G内存，15k sas raid 10。备份服务器最好跟数据库服务器同等配置。硬件可以上整套品牌，也可以兼容机，也可以半品牌半组装，取决于经济能力。当然，这是典型的搭配，有些类型应用的性能瓶颈首先出现在web上，那种情况就要单独分析了。&lt;/p&gt;&lt;p&gt;web服务器可以既跑程序又当内存缓存，数据库服务器则只跑主数据库（假如是MySQL的话），备份服务器所承担就相对多一些，web配置、缓存配置、数据库配置都要跟前两台一致，这样WEB和数据库任意一台出问题，很容易就可以将备份服务器切换过去临时顶替，直到解决完问题。要注意，硬件是随时可能坏掉的，特别是硬盘，所以宁可WEB服务器跟数据库服务器放在一起，也一定不能省掉备份，备份一定要异机，并且有异步，电力故障、误操作都可能导致一台机器上的所有数据丢失。很多的开源备份方案可选择，最简单的就是rsync，写crontab里，定时同步。备份和切换，建议多做测试，选最安全最适合业务的，并且尽可能异地备份。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;四、机房&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;三种机房尽量不要选：联通访问特别慢的电信机房、电信访问特别慢的联通机房、电信联通访问特别慢的移动或铁通机房。机房要尽可能多的实地参观，多测试，找个网络质量好，管理严格的机房。机房可以说是非常重要，直接关系到网站访问速度，网站访问速度直接关系到用户体验，访问速度很慢的网站，很难获得用户青睐。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;五、架构&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在大方向上，被熟知的架构是web负载均衡+数据库主从+缓存+分布式存储+队列。在一开始，按照可扩展的原则设计和编程就可以。只是要多考虑缓存失效时的雪崩效应、主从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。缓存失效、数据库复制中断、队列写入错误、电源损坏，在实际运维中经常发生，如果不注意这些，出现问题时恢复期可能会超出预期很长时间。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;六、服务器软件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;操作系统Linux很流行。在没有专业运维人员的情况下，应倾向于择使用的人多、社区活跃、配置方便、升级方便的发行版，例如RH系列、debian、ubuntu server等，硬件和操作系统要一起选择，看是否有适合的驱动，如果确定用某种商业软件或解决方案，也要提前知晓其对哪种操作系统支持最佳。web服务器方面，apache、nginx、lighttpd三大系列中，apache占有量还是最大，但是想把性能调教好还是需要很专业的，nginx和lighttpd在不需要太多调整的情况下可以达到一个比较不错的性能。无论选择什么软件，除非改过这些软件或你的程序真的不兼容新版本，否则尽量版本越新越好，版本新，意味着新特性增多、BUG减少、性能增加。一个典型的php网站，基本上大多数人都没改过任何服务器软件源代码，绝大多数情况是能平稳的升级到新版本的。类似于jdk5到 jdk6，python2到python3这类变动比较大的升级还是比较少见的。看看ChangeLog，看看升级说明，结合自己情况评估测试一下，越早升级越好，升级的越晚，所花费的成本越高。对于软件包，尽量使用发行版内置的包管理工具，没有特殊要求时不建议自己编译，那样对将来运维不利。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;七、数据库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;几乎所有操作最后都要落到数据库身上，它又最难扩展（存储也挺难）。数据库常见的扩展方法有复制、分片，设计时要考虑到每种应用的数据如何复制、分片，当然这种考虑一般会推迟到技术设计时期。在初期进行数据库结构设计时，要根据不同的业务类型和增长量预期来考虑是否要分库、分区，并且尽量不要使用联合查询、不使用自增ID以方便分片。复制延时问题、主从数据库数据一致性问题，可以自己写或者用已有的运维工具进行检测。&lt;/p&gt;&lt;p&gt;用存储过程是比较难扩展的，这种情形多发生于传统C/S，特别是OA系统转换过来的开发人员。低成本网站不是一两台小型机跑一个数据库处理所有业务的模式，是机海作战。方便水平扩展比那点预分析时间和网络传输流量要重要的多的多。&lt;/p&gt;&lt;p&gt;另外，现在流行一种概念叫NoSQL，可以理解为非传统关系型数据库。实际应用中，网站有着越来越多的密集写操作、上亿的简单关系数据读取、热备等，这都不是传统关系数据库所擅长的，于是就产生了很多非关系型数据库，比如Redis/TC&amp;amp;TT/MongoDB/Memcachedb等，在测试中，这些几乎都达到了每秒至少一万次的写操作，内存型的甚至5万以上。在设计时，可根据业务特点和性能要求来选择是否使用这类数据库。例如MongoDB，几句配置就可以组建一个复制+自动分片+failover的环境，文档化的存储也简化了传统设计库结构再开发的模式。但是当你决定采用一项技术时，一定要真正了解其优劣，例如可能你所选择的技术并不能支持你所需要的事务和数据一致性要求。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;八、文件存储&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;存储的分布几乎跟数据库扩展一样困难，不过只有百万的PV的情况下，磁盘IO方面一般不会成大问题，一两台采用SATA做条带RAID的机器可以应付，反而是自己做异步备份比较复杂，因为小文件多。如果只有一台机器做存储，可以做简单的优化，例如放最小缩略图的分区和放中等缩略图的分区，根据平均大小调整一下块大小。存储要规划好目录结构，否则文件增多后维护起来复杂，也不利于扩展。同时还要考虑将来扩容，例如采用LVM，或者把文件根据不同规则散列到不同机器。磁盘IO繁重的情况下更容易出现故障，所以要做好备份，若发现有盘坏掉，要马上行动更换，很多人的硬盘都是坏了一块之后，接二连三的坏下去。&lt;/p&gt;&lt;p&gt;为了将来图片走cdn做准备，一开始最好就将图片的域名分开，且不用主域名。因为很多网站都将cookie设置到了.domain.ltd，如果图片也在这个域名下，很可能因为cookie而造成缓存失效，并且占多余流量，还可能因为浏览器并发线程限制造成访问缓慢。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;九、程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一定硬件条件下，应用能承载多少访问量，很大一部分也取决于程序如何写。程序写的不好，可能一万的访问都承载不了，写的好，可能一两台机器就能承担几百万PV。越是复杂、数据实时性要求越高的应用，优化起来越难，但对普通网站有一个统一的思路，就是尽量向前端优化、减少数据库操作、减少磁盘IO。向前端优化指的是，在不影响功能和体验的情况下，能在浏览器执行的不要在服务端执行，能在缓存服务器上直接返回的不要到应用服务器，程序能直接取得的结果不要到外部取得，本机内能取得的数据不要到远程取，内存能取到的不要到磁盘取，缓存中有的不要去数据库查询。减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成（例如join查询），减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分，换语法是无法&amp;#8220;优化&amp;#8221;的。&lt;/p&gt;&lt;p&gt;然而编程时不应该把重点放在优化上，应该关注扩展性。当今的WEB应用，需求变化非常之快，适应多种需求的架构是不存在的，我们的扩展性就要把要点放在跟底层交互的架构上，例如持久化数据的存取规则、缓存的存取规则等，还有一些共用服务，例如用户信息等。先把不变的部分做完善，剩下的部分就很容易将精力放在业务逻辑上面了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关于作者&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;刘志一，从1999年做个人网站开始一直专注于互联网，目前就职于一家垂直行业C2C网站，做产品和开发方面工作。新浪微博：&lt;a href="http://t.sina.com.cn/liuzhiyi" style="text-decoration: underline; color: #0b59b2; "&gt;http://t.sina.com.cn/liuzhiyi&lt;/a&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;感谢&lt;a href="http://www.infoq.com/cn/bycategory.action?authorName=%E5%B4%94%E5%BA%B7" style="text-decoration: underline; color: #0b59b2; "&gt;崔康&lt;/a&gt;对本文的审校。&lt;/p&gt;&lt;p&gt;给InfoQ中文站投稿或者参与内容翻译工作，请邮件至&lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#101;&amp;#100;&amp;#105;&amp;#116;&amp;#111;&amp;#114;&amp;#115;&amp;#64;&amp;#99;&amp;#110;&amp;#46;&amp;#105;&amp;#110;&amp;#102;&amp;#111;&amp;#113;&amp;#46;&amp;#99;&amp;#111;&amp;#109;" style="text-decoration: underline; color: #0b59b2; "&gt;editors@cn.infoq.com&lt;/a&gt;。也欢迎大家加入到&lt;a target="_blank" href="http://groups.google.com/group/InfoQChina" style="text-decoration: underline; color: #0b59b2; "&gt;InfoQ中文站用户讨论组&lt;/a&gt;中与我们的编辑和其他读者朋友交流。&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/1946959.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1946959.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/01/28/1946955.html</id><title type="text">转：Facebook是如何发布代码的</title><summary type="text">来自：http://www.infoq.com/cn/news/2011/01/facebook-coding-practicesYee Lee（Skype的一位产品经理）整理了大量笔记，详细描述了Facebook是如何发布代码的。Facebook采用的是开发者驱动的文化，它由两支大的团队组成：工程师与运维。Facebook里经理与工程师的比率平均在1-7到1-10之间。所有工程师都要经历新人训练营，期间他们修复错误，参加高级工程师的讲座。一位工程师说到“产品经理在这里其实没什么用。”工程师可以在中期修改需求说明、重新安排项目中的工作，任何时间都可以注入新特性[...]，很明显，Faceboo</summary><published>2011-01-28T05:33:00Z</published><updated>2011-01-28T05:33:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1946955.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1946955.html"/><content type="html">&lt;div&gt;来自：&lt;a href="http://www.infoq.com/cn/news/2011/01/facebook-coding-practices"&gt;http://www.infoq.com/cn/news/2011/01/facebook-coding-practices&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Lucida, 'Lucida Grande', Arial, 宋体, sans-serif; line-height: 16px; font-size: 13px; "&gt;&lt;p&gt;Yee Lee（Skype的一位产品经理）&lt;a href="http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/" style="text-decoration: underline; color: #0b59b2; "&gt;整理了大量笔记&lt;/a&gt;，详细描述了Facebook是如何发布代码的。Facebook采用的是&lt;a href="http://www.facebook.com/Engineering" style="text-decoration: underline; color: #0b59b2; "&gt;开发者驱动的文化&lt;/a&gt;，它由两支大的团队组成：工程师与运维。Facebook里经理与工程师的比率平均在1-7到1-10之间。所有工程师都要经历新人训练营，期间他们修复错误，参加高级工程师的讲座。&lt;/p&gt;&lt;blockquote style="border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 0px; margin-left: 20px; color: #333333; background-image: url(http://cdn1.infoq.com/styles/cn/i/bg-blockquote.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #fafafa; background-position: 5px 5px; background-repeat: no-repeat no-repeat; "&gt;一位工程师说到&amp;#8220;产品经理在这里其实没什么用。&amp;#8221;工程师可以在中期修改需求说明、重新安排项目中的工作，任何时间都可以注入新特性[...]，很明显，Facebook的文化很包容产品管理实践，因此产品管理的角色并没有被忽略或是省略掉。&lt;/blockquote&gt;&lt;p&gt;就Yee看来，Facebook公司的文化就是这样，每个人都感觉对产品负有责任。要有影响力的关键是和工程经理搞好关系。&lt;/p&gt;&lt;p&gt;工程师自己处理全部功能，从JavaScript到数据库代码。工程师还要负责测试、修正错误、对自己的工作进行上线后的维护。Facebook也有QA，但不是正式团队。实际上，所有的变更都强制要求做代码审查。一个Facebook的员工补充到：&lt;/p&gt;&lt;blockquote style="border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 0px; margin-left: 20px; color: #333333; background-image: url(http://cdn1.infoq.com/styles/cn/i/bg-blockquote.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #fafafa; background-position: 5px 5px; background-repeat: no-repeat no-repeat; "&gt;大多数工程师都有能力写出没有错误的代码，只是在大多数公司里他们没有这个动力，当有QA部门时，只要把简单地代码扔给它们去找错误就好了。&lt;/blockquote&gt;&lt;p&gt;Facebook采用的是每周发布，代码最终要发布到Facebook的60,000+台服务器上，发布分为9个阶段，从第一阶段6台服务器开始。&lt;/p&gt;&lt;p&gt;项目都是自愿参与的，有人说服大家来实现他的想法，工程师会决定是否参与。&lt;/p&gt;&lt;p&gt;运维对Facebook的成功是至关重要的。&lt;/p&gt;&lt;blockquote style="border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #efefef; border-right-color: #efefef; border-bottom-color: #efefef; border-left-color: #efefef; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 0px; margin-left: 20px; color: #333333; background-image: url(http://cdn1.infoq.com/styles/cn/i/bg-blockquote.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #fafafa; background-position: 5px 5px; background-repeat: no-repeat no-repeat; "&gt;运维团队训练有素、受人尊敬，而且很有商业意识。他们的服务器度量指标远不止常用错误日志、负载&amp;amp;内存利用状态，还包含了用户行为。&lt;/blockquote&gt;&lt;p&gt;Facebook是当今最具可扩展性的Web平台之一，访问量超过400亿页/天。如果没有好的机遇和那工程师驱动的文化，这一切都是不可能的。&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="font-family: Lucida, 'Lucida Grande', Arial, 宋体, sans-serif; line-height: 16px; font-size: 13px; "&gt;&lt;strong&gt;查看英文原文：&lt;/strong&gt;&amp;#8203;&lt;a href="http://www.infoq.com/news/2011/01/facebook-coding-practices" style="text-decoration: underline; color: #0b59b2; "&gt;How Facebook Ships Code&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/1946955.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/01/28/1946955.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/songsh96/archive/2011/01/26/1945097.html</id><title type="text">转：一切整合分享到新浪网易微博代码</title><summary type="text">来自：http://www.taoba123.com/show.asp?id=7392近期，国内外微博火热，大有全民一起写微博之气，但随着微博流行，人们渐渐的习惯把生活、工作、学习、娱乐等方面的消息发到微博上，为此本人整理了主流微博分享代码，供大家使用。 一、新浪微博分享代码： 1、各网站、论坛、博客等通用代码：&amp;lt;a href="javascript:(function(){window.open('http://v.t.sina.com.cn/share/share.php?title='+encodeURIComponent(document.title)+'&amp;url='+encodeUR</summary><published>2011-01-26T01:24:00Z</published><updated>2011-01-26T01:24:00Z</updated><author><name>Sammy</name><uri>http://www.cnblogs.com/songsh96/</uri></author><link rel="alternate" href="http://www.cnblogs.com/songsh96/archive/2011/01/26/1945097.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/songsh96/archive/2011/01/26/1945097.html"/><content type="html">&lt;div&gt;来自：&lt;a href="http://www.taoba123.com/show.asp?id=7392"&gt;http://www.taoba123.com/show.asp?id=7392&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 宋体, Arial, Helvetica, sans-serif; line-height: 23px; color: #333333; "&gt;&lt;p&gt;近期，国内外微博火热，大有全民一起写微博之气，但随着微博流行，人们渐渐的习惯把生活、工作、学习、娱乐等方面的消息发到微博上，为此本人整理了主流微博分享代码，供大家使用。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;strong&gt;&amp;nbsp;&amp;nbsp; 一、新浪微博分享代码：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; 1、各网站、论坛、博客等通用代码：&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;strong&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right-color: #cccccc; border-right-width: 1px; border-right-style: dotted; table-layout: fixed; border-top-color: #cccccc; border-top-width: 1px; border-top-style: dotted; border-left-color: #cccccc; border-left-width: 1px; border-left-style: dotted; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: dotted; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#f3f3f3" style="font-size: 12px; color: #333333; font-family: 宋体, Arial, Helvetica, sans-serif; word-wrap: break-word; "&gt;&amp;lt;a href="javascript:(function(){window.open('http://v.t.sina.com.cn/share/share.php?title='+encodeURIComponent(document.title)+'&amp;amp;url='+encodeURIComponent(location.href)+'&amp;amp;source=bookmark','_blank','width=450,height=400');})()" title="新浪微博分享"&amp;gt;&amp;lt;img src="http://t.sina.com.cn/favicon.ico"&amp;nbsp; alt="新浪微博分享" border="0"&amp;gt;分享到新浪微博&amp;lt;/a&amp;gt;&amp;nbsp;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;/strong&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; 此代码无需申请 Appkey&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、新浪官方分享到代码：&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right-color: #cccccc; border-right-width: 1px; border-right-style: dotted; table-layout: fixed; border-top-color: #cccccc; border-top-width: 1px; border-top-style: dotted; border-left-color: #cccccc; border-left-width: 1px; border-left-style: dotted; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: dotted; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#f3f3f3" style="font-size: 12px; color: #333333; font-family: 宋体, Arial, Helvetica, sans-serif; word-wrap: break-word; "&gt;&amp;lt;a href="javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f='http://v.t.sina.com.cn/share/share.php?appkey=真实的appkey',u=z||d.location,p=['&amp;amp;url=',e(u),'&amp;amp;title=',e(t||d.title),'&amp;amp;source=',e(r),'&amp;amp;sourceUrl=',e(l),'&amp;amp;content=',c||'gb2312','&amp;amp;pic=',e(p||'')].join('');function%20a(){if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=440,height=430,left=',(s.width-440)/2,',top=',(s.height-430)/2].join('')))u.href=[f,p].join('');};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,'','','图片链接|默认为空','标题|默认当前页标题','内容链接|默认当前页location','页面编码gb2312|utf-8默认gb2312'));"&amp;gt;分享至微博&amp;lt;/a&amp;gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;注意事项说明：&amp;nbsp;&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 此需要申请appkey帐号，地址：open.t.sina.com.cn&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 真实的appkey {string} 必选参数&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 图片链接 (String) 可选参数, 默认为空&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 标题 (String) 可选参数, 默认当前页title&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 内容链接 (String) 可选参数, 默认当前页location&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 页面编码 (String) 可选参数, [gb2312|utf-8] 默认gb2312&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a&amp;gt; 的链接样式及文字可自行据需求修改.代码中有 " %20f " 属正常代码,无需处理&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;strong&gt;&amp;nbsp;&amp;nbsp; 3、非官方正式代码：&lt;/strong&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right-color: #cccccc; border-right-width: 1px; border-right-style: dotted; table-layout: fixed; border-top-color: #cccccc; border-top-width: 1px; border-top-style: dotted; border-left-color: #cccccc; border-left-width: 1px; border-left-style: dotted; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: dotted; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#f3f3f3" style="font-size: 12px; color: #333333; font-family: 宋体, Arial, Helvetica, sans-serif; word-wrap: break-word; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1)、&amp;lt;a href="http://v.t.sina.com.cn/share/share.php?title=%E4%BD%A0%E5%A5%BD%20hello%20world" target="_blank"&amp;gt;分享到微博&amp;lt;/a&amp;gt;，简单分享（无需申请）&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2)、&amp;lt;a href="http://v.t.sina.com.cn/share/share.php?appkey=4120396272&amp;amp;title=%E4%BD%A0%E5%A5%BD%20hello%20world" target="_blank"&amp;gt;分享到微博&amp;lt;/a&amp;gt;，带有AppKey（Appkey需要前往 open.t.sina.com.cn 申请）&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 字段需要经过encodeURIComponent，例子：&amp;nbsp;&lt;br /&gt;你好 http://t.sina.com.cn/ -&amp;amp;gt &amp;lt;script&amp;gt;document.write(encodeURIComponent("你好 http://t.sina.com.cn/"));&amp;lt;/script&amp;gt;&amp;nbsp;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注：Appkey需要前往 open.t.sina.com.cn 申请&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 二、网易微博分享代码&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1、样式一：任何网站、博客都可以调用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right-color: #cccccc; border-right-width: 1px; border-right-style: dotted; table-layout: fixed; border-top-color: #cccccc; border-top-width: 1px; border-top-style: dotted; border-left-color: #cccccc; border-left-width: 1px; border-left-style: dotted; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: dotted; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#f3f3f3" style="font-size: 12px; color: #333333; font-family: 宋体, Arial, Helvetica, sans-serif; word-wrap: break-word; "&gt;&amp;lt;a href="javascript:(function(){window.open('http://t.163.com/article/user/checkLogin.do?link=http://news.163.com/&amp;amp;source='+'土豆网'+ '&amp;amp;info='+encodeURIComponent(document.title)+' '+encodeURIComponent(location.href),'_blank','width=510,height=300');})()" title="分享到网易微博"&amp;gt;&amp;lt;img src="http://www.taoba123.com/images/resource_10544871274700952v.png" alt="网易微博分享" border="0"&amp;gt;&amp;lt;/a&amp;gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、样式二&lt;/strong&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="6" width="95%" align="center" border="0" style="border-right-color: #cccccc; border-right-width: 1px; border-right-style: dotted; table-layout: fixed; border-top-color: #cccccc; border-top-width: 1px; border-top-style: dotted; border-left-color: #cccccc; border-left-width: 1px; border-left-style: dotted; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: dotted; "&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="#f3f3f3" style="font-size: 12px; color: #333333; font-family: 宋体, Arial, Helvetica, sans-serif; word-wrap: break-word; "&gt;&amp;lt;a target="_self" onclick="(function(){var url = 'link=http://news.163.com/&amp;amp;amp;source='+ encodeURIComponent('网易新闻')+ '&amp;amp;amp;info='+ encodeURIComponent(document.title) + ' ' + encodeURIComponent(document.location.href);window.open('http://t.163.com/article/user/checkLogin.do?'+url+'&amp;amp;amp;'+new Date().getTime(),'newwindow','height=330,width=550,top='+(screen.height-280)/2+',left='+(screen.width-550)/2+', toolbar=no, menubar=no, scrollbars=no,resizable=yes,location=no, status=no');})()" href="javascript:void(0);"&amp;gt;&amp;lt;img height="19px" border="0" align="absMiddle" src="http://img1.cache.netease.com/cnews/css09/wblog.gif" alt="分享到网易微博" title="分享到网易微博" /&amp;gt;分享到网易微博&amp;lt;/a&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;以上代码简单实用，是您给自己博客、网站居家必备秘密武器，祝您使用愉快。=^_^=(文/猴子)&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/songsh96/aggbug/1945097.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/songsh96/archive/2011/01/26/1945097.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
