<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[七小木东]]></title> 
<link>http://www.qixiaomudong.cn/index.php</link> 
<description><![CDATA[七小木东]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[七小木东]]></copyright>
<item>
<link>http://www.qixiaomudong.cn/read.php?409</link>
<title><![CDATA[SQL Server 2008 R2 (MS官方全版本)，AIO，含x86和x64]]></title> 
<author>七小木东 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Fri, 06 Aug 2010 07:33:14 +0000</pubDate> 
<guid>http://www.qixiaomudong.cn/read.php?409</guid> 
<description>
<![CDATA[ 
	MS 发布了最新的SQL Server 2008 R2，似乎早在4.19就提供了下载，不过才到昨天放出下载地址：<br/>这个是试用版的下载，于正式版的区别就只在一个序列号！<br/>而MSDN的版本则集成了安装序列号（类似VS2010），如果有大大下载了MSDN SQL 2008 R2，期待放出其中的序列号！<br/><br/>MS官方下载地址（使用迅雷很快。。。）：<br/>简体中文<br/>自解压版本，分别有x86和x64下载（因为有AIO的安装光盘，我就没有下载这个自解压版了）<br/><br/>http://care.dlservice.microsoft.com/dl/download/1/E/6/1E626796-588A-495C-917B-321093FB98EB/2052/SQLFULL_x86_CHS.exe?lcid=2052&ptype=pcare<br/><br/>http://care.dlservice.microsoft.com/dl/download/1/E/6/1E626796-588A-495C-917B-321093FB98EB/2052/SQLFULL_x64_CHS.exe?lcid=2052&ptype=pcare<br/><br/>AIO CD：<br/><br/>http://care.dlservice.microsoft.com/dl/download/1/E/6/1E626796-588A-495C-917B-321093FB98EB/2052/SQLFULL_CHS.iso?lcid=2052&ptype=pcare<br/><br/>SHA1：75fd5c38a683b9253220370a73bde8697e88ef87<br/><br/>繁体中文<br/>自解压版本，分别有x86和x64下载<br/><br/>http://care.dlservice.microsoft.com/dl/download/9/5/B/95B065D0-1305-469B-91E0-5A0BFF4905D0/1028/SQLFULL_x86_CHT.exe?lcid=1028&ptype=pcare<br/><br/>http://care.dlservice.microsoft.com/dl/download/9/5/B/95B065D0-1305-469B-91E0-5A0BFF4905D0/1028/SQLFULL_x64_CHT.exe?lcid=1028&ptype=pcare<br/><br/>AIO CD：<br/><br/>http://care.dlservice.microsoft.com/dl/download/9/5/B/95B065D0-1305-469B-91E0-5A0BFF4905D0/1028/SQLFULL_CHT.iso?lcid=1028&ptype=pcare<br/><br/>SHA1：暂无（我还没下载完）<br/><br/>英文<br/>自解压版本，分别有x86和x64下载<br/><br/>http://care.dlservice.microsoft.com/dl/download/D/8/0/D808E432-5AC6-4DA5-A087-21947AC4AC5F/1033/SQLFULL_x86_ENU.exe?lcid=1033&ptype=pcare<br/><br/>http://care.dlservice.microsoft.com/dl/download/D/8/0/D808E432-5AC6-4DA5-A087-21947AC4AC5F/1033/SQLFULL_x64_ENU.exe?lcid=1033&ptype=pcare<br/><br/>AIO CD：<br/><br/>http://care.dlservice.microsoft.com/dl/download/D/8/0/D808E432-5AC6-4DA5-A087-21947AC4AC5F/1033/SQLFULL_ENU.iso?lcid=1033&ptype=pcare<br/><br/>SHA1：a9f5baeb323cc2a5504dc0dc23a64c44be96f5ab<br/><br/>祝大家下载愉快！有需要的，推上去！<br/>目前有数据中心版的序列号：<br/>PTTFM-X467G-P7RH2-3Q6CG-4DMYB<br/><br/>开发版：<br/>MC46H-JQR3C-2JRHY-XYRKY-QWPVM （待测，8楼）<br/><br/>企业版：<br/>JD8Y6-HQG69-P9H84-XDTPG-34MBB （无效）<br/>R88PF-GMCFT-KM2KR-4R7GB-43K4B （可用）<br/><br/>希望大家有序列号不吝提供！<br/><br/>至于MSDN版本则含了对应的序列号，希望下载了MSDN的朋友，能提取对应版本的序列号公布。。。<br/><br/><br/><br/>1楼 add by&nbsp;&nbsp;tt 2010年05月5日 23:50 <br/><br/>=========================================<br/>SQL.Server.2008.R2_Sn<br/>=========================================<br/><br/>数据版：PTTFM-X467G-P7RH2-3Q6CG-4DMYB<br/>=========================================<br/><br/>企业版：R88PF-GMCFT-KM2KR-4R7GB-43K4B<br/>=========================================<br/><br/>标准版：<br/>=========================================<br/><br/>开发版：MC46H-JQR3C-2JRHY-XYRKY-QWPVM<br/>=========================================<br/><br/>[回复]<br/>2楼 add by&nbsp;&nbsp;爱SQL 2010年06月24日 02:20 <br/><br/>企业版：R88PF-GMCFT-KM2KR-4R7GB-43K4B<br/>数据版：PTTFM-X467G-P7RH2-3Q6CG-4DMYB<br/>这两个号已经测试通过，可用！<br/><br/>[回复]<br/>3楼 add by&nbsp;&nbsp;rr 2010年06月25日 17:02 <br/><br/>=========================================<br/>SQL.Server.2008.R2_Sn<br/>=========================================<br/><br/>数据版：PTTFM-X467G-P7RH2-3Q6CG-4DMYB<br/>DDT3B-8W62X-P9JD6-8MX7M-HWK38<br/>=========================================<br/><br/>企业版：R88PF-GMCFT-KM2KR-4R7GB-43K4B<br/>GYF3T-H2V88-GRPPH-HWRJP-QRTYB<br/>=========================================<br/><br/>标准版：CXTFT-74V4Y-9D48T-2DMFW-TX7CY<br/>B68Q6-KK2R7-89WGB-6Q9KR-QHFDW<br/>=========================================<br/><br/>开发版：MC46H-JQR3C-2JRHY-XYRKY-QWPVM<br/>FTMGC-B2J97-PJ4QG-V84YB-MTXX8<br/>=========================================<br/><br/>工组版：XQ4CB-VK9P3-4WYYH-4HQX3-K2R6Q<br/>=========================================<br/><br/>WEB版：FP4P7-YKG22-WGRVK-MKGMX-V9MTM<br/>=========================================<br/><br/>以上序列号全部通过测试！！<br/><br/>[回复]<br/>4楼 add by&nbsp;&nbsp;rr 2010年06月25日 17:03 <br/><br/>=========================================<br/>SQL.Server.2008.R2_Sn<br/>=========================================<br/><br/>数据版：PTTFM-X467G-P7RH2-3Q6CG-4DMYB<br/>DDT3B-8W62X-P9JD6-8MX7M-HWK38<br/>=========================================<br/><br/>企业版：R88PF-GMCFT-KM2KR-4R7GB-43K4B<br/>GYF3T-H2V88-GRPPH-HWRJP-QRTYB<br/>=========================================<br/><br/>标准版：CXTFT-74V4Y-9D48T-2DMFW-TX7CY<br/>B68Q6-KK2R7-89WGB-6Q9KR-QHFDW<br/>=========================================<br/><br/>开发版：MC46H-JQR3C-2JRHY-XYRKY-QWPVM<br/>FTMGC-B2J97-PJ4QG-V84YB-MTXX8<br/>=========================================<br/><br/>工组版：XQ4CB-VK9P3-4WYYH-4HQX3-K2R6Q<br/>=========================================<br/><br/>WEB版：FP4P7-YKG22-WGRVK-MKGMX-V9MTM<br/>=========================================<br/><br/>以上序列号全部通过测试！！!!!!!!!!!!<br/><br/>[回复]<br/>
]]>
</description>
</item><item>
<link>http://www.qixiaomudong.cn/read.php?95</link>
<title><![CDATA[mysql乱码]]></title> 
<author>七小木东 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Mon, 22 Sep 2008 07:47:54 +0000</pubDate> 
<guid>http://www.qixiaomudong.cn/read.php?95</guid> 
<description>
<![CDATA[ 
	如果所有设置都已经改为GB2312的情况下,还会出现乱码问题,可能你的数据库是经过导入的.那么可以尝试下面的办法: <br/>在你的数据库链接的php页面下找到类似的这样一段: <br/>$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword); <br/>在它的前面先执行一次connection的字符集更改: <br/>$this->query("SET NAMES 'gb2312'"); <br/>如果问题解决了,则可以肯定是你的数据库经过导入出现了问题.
]]>
</description>
</item><item>
<link>http://www.qixiaomudong.cn/read.php?91</link>
<title><![CDATA[备份和恢复PostgreSQL数据库]]></title> 
<author>七小木东 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Fri, 19 Sep 2008 10:05:58 +0000</pubDate> 
<guid>http://www.qixiaomudong.cn/read.php?91</guid> 
<description>
<![CDATA[ 
	备份和恢复PostgreSQL数据库&nbsp;&nbsp;<br/>你是否遇到过因为不小心而删除了某个数据库表，或者是存放数据库的磁盘损坏了的情况呢？如果碰到这种情况，我相信你会觉得非常的沮丧，因为你努力工作了几个星期的成果可能就付之东流了。 <br/> <br/><br/>但是，你也不必每次都陷入这种困境。如果你将数据存放在 PostgreSQL 表中，你就可以定时的进行数据库备份，从而避免上述悲剧的发生。PostgreSQL 自带有内置工具来执行备份工作，而且在系统出现损坏或是意外时，你可以通过这些工具进行“回滚”，并通过以前保存的快照将系统恢复到其初始的状态。 <br/><br/>数据备份 <br/><br/>PostgreSQL 自带的内置备份工具叫做 pg_dump。这个工具是通过一系列的SQL语句读取某个指定的数据库并复制其中的内容，以它作为快照并用于日后的数据恢复。客户端到服务器端的连接是用于执行备份工作。这些备份文件就是前面所讲的快照并可以用于日后的数据恢复。而保证客户端与服务器端的连接是执行备份所必需的。 <br/><br/>注意： 在进行上述工作之前，首先请确保你具有登录到服务器并访问你将要备份的数据库或表的权限。你可以通过使用PostgreSQL 命令行客户端——psql，进行服务器登录。在客户端中输入主机名（-h），用户名（-u）和密码（-p），以及数据库名，然后就可以校验你是否被授权访问。 <br/><br/>使用 pg_dump 非常的简单——只需要在命令提示符后面输入将要导出的数据库名就可以进行备份工作了，如下例所示（根据你自己的安装路经更改PostgreSQL 路径）： <br/><br/>$ /usr/local/pgsql/bin/pg_dump -D -h localhost -U pgsql test > test.bak <br/><br/>通过上面的命令就会创建一个名为test.bak的文件，文件中记录了用于恢复数据库的SQL命令。在这个文件中你可以看到类似于下面这个例子中所列出的内容： <br/><br/>--<br/>-- Name: pets; Type: TABLE; Schema: public; Owner: root; Tablespace: <br/>--<br/><br/>CREATE TABLE pets (<br/>species character varying,<br/>name character varying<br/>);<br/><br/>ALTER TABLE public.pets OWNER TO root;<br/><br/>--<br/>-- Data for Name: pets; Type: TABLE DATA; Schema: public; Owner: root<br/>--<br/><br/>INSERT INTO pets (species, name) VALUES ('dog', 'Sparky');<br/>INSERT INTO pets (species, name) VALUES ('cat', 'Tabitha'); <br/><br/><br/>如果你希望对整个系统中所有的数据库进行备份的话（而不是只对某一个数据库进行备份），你可以使用命令pg_dumpall 而不是pg_dump。执行这个命令可以对PostgreSQL 所能识别的所有的数据库（包括其自身的系统数据库） 备份到一个文件中。下面给出了一个使用实例： <br/><br/>$ /usr/local/pgsql/bin/pg_dumpall -D -h localhost -U pgsql > all.bak <br/><br/>为了保证你的备份时刻保持更新，你可以通过往cron table中加入pg_dump或者是pg_dumpall命令来定期执行备份工作。这里给出了两个cron entries的例子。第一个是在每天凌晨3点对test数据库进行备份，而第二个是在每个星期五的晚上9点对所有的数据库进行备份： <br/><br/>0 3 * * * /usr/local/pgsql/bin/pg_dump -D -h localhost -U pgsql test > /disk2/test.bak0 21 * * <br/>5 /usr/local/pgsql/bin/pg_dumpall -D -h localhost -U pgsql > /disk2/all.bak <br/><br/>数据恢复 <br/><br/>从备份中恢复数据的工作比执行备份甚至更简单——你所要做的就是通过执行备份文件中的SQL命令来对数据库进行恢复。如果你是使用pg_dump对某一个数据库进行了备份，那么备份中就会有CREATE TABLE 的语句来对源表进行复制。当然，你首先要新创建一个空数据库来存放这些数据表。你可以使用createdb 这个工具来完成这一步工作，这个工具也是PostgreSQL 套件中的一部分： <br/><br/>$ /usr/local/pgsql/bin/createdb restored <br/><br/>现在你就可以执行备份文件中的SQL命令来对数据库进行恢复了，如下例所示： <br/><br/>$ /usr/local/pgsql/bin/psql -h localhost -U pgsql -d restored < test.bak <br/><br/>如果你是使用pg_dumpall对所有的数据库进行备份的，就没有必要先新建一个数据库，因为备份文件中已经包含了完成CREATE DATABASE工作的相关的调用。在这里，只需要在psql命令行客户端中输入对应的备份文件就可以了，而不需要指定目标数据库： <br/><br/>$ /usr/local/pgsql/bin/psql -h localhost -U pgsql < all.bak <br/><br/>一旦数据恢复完成后，你就可以登录到服务器并查看到已恢复的数据。 <br/>
]]>
</description>
</item><item>
<link>http://www.qixiaomudong.cn/read.php?71</link>
<title><![CDATA[索引简介]]></title> 
<author>七小木东 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Thu, 28 Aug 2008 05:57:57 +0000</pubDate> 
<guid>http://www.qixiaomudong.cn/read.php?71</guid> 
<description>
<![CDATA[ 
	索引是表示数据的另一种方式，它提供的数据顺序不同于数据在磁盘上的物理存储顺序。索引的特殊作用是在表内重新排列记录的物理位置。索引可建立在数据表的一列上，或建立在表的几列的组合上。<br/><br/>回想一下图书馆中，存放着一架一架的图书。假设要找一本书，图书管理员视必要一架一架的寻找，直到找到想要的那本书为止。这样的查找肯定费时费力，那么管理员可以将所有的图书标题按字母分类建立索引卡片，按字母顺序放在不同的办公抽屉中，这样一架一架查找图书的过程就变成了在办公桌前抽屉中查询索引卡片了，很容易得到有关这本书的信息。<br/><br/>再进一步设想，图书管理员很勤快，他不仅按照图书标题字母分类，而且还按作者姓名和出版社分别建立了另外的索引卡片，这个过程将给借阅者在检索图书信息时以更大的灵活性。因此在一个数据表中是可以建立多个索引的。<br/><br/>在数据库中，对无索引的表进行查询一般称为全表扫描。全表扫描是数据库服务器用来搜寻表的每一条记录的过程，直到所有符合给定条件的记录返回为止。这个操作可以比作在图书馆中查书，从第一个书架的第一本书开始，浏览每一本书，直到发现所要的书为止。为了进行高效查询，可以在数据表上针对某一字段建立索引，由于该索引包括了一个指向数据的指针，数据库服务器则只沿着索引排列的顺序对仅有一列数据的索引进行读取（只建立一个索引）直至索引指针指向相应的记录上为止。由于索引只是按照一个字段进行查找，而没有对整表进行遍历，因此一般说来索引查找比全表扫描的速度快。<br/><br/>那么，是不是使用索引查询一定比全表扫描的速度快呢？答案是否定的。如果查询小型数据表（记录很少）或是查询大型数据表（记录很多）的绝大部分数据，全表扫描更为实用。例如，查询“性别”字段，其值只能是“男或女”，在其上建立索引的意义就不大，甚至不允许在布尔型、大二进制型（备注型、图像型等）上建立索引。<br/><br/>全表扫描，查询过程如图1所示<br/><br/><a href="http://www.qixiaomudong.cn/attachment.php?fid=116" target="_blank"><img src="http://www.qixiaomudong.cn/attachment.php?fid=116" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>索引查询，查询过程如图2所示<br/><br/><a href="http://www.qixiaomudong.cn/attachment.php?fid=117" target="_blank"><img src="http://www.qixiaomudong.cn/attachment.php?fid=117" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a>
]]>
</description>
</item><item>
<link>http://www.qixiaomudong.cn/read.php?101</link>
<title><![CDATA[ CASE在sql server中的使用用法]]></title> 
<author>七小木东 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Wed, 27 Jun 2007 09:49:17 +0000</pubDate> 
<guid>http://www.qixiaomudong.cn/read.php?101</guid> 
<description>
<![CDATA[ 
	CASE 语句在sql server跟其它程序语言中的switch功能类似，用于计算条件列表并返回多个可能结果表达式之一。 <br/>&nbsp;&nbsp; 在sql server中CASE具有两种格式：<br/>&nbsp;&nbsp; a.简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。 <br/>&nbsp;&nbsp; b.CASE 搜索函数计算一组布尔表达式以确定结果。<br/>&nbsp;&nbsp; 以上两种格式都支持可选的 ELSE 参数。<br/><br/>&nbsp;&nbsp;常见的几种CASE语句的用法如下所示:<br/>&nbsp;&nbsp;1.CASE 函数用于计算多个条件并为每个条件返回单个值。CASE 函数通常的用途是使用可读性更强的值替换代码或缩写。<br/>下面的查询使用 CASE 函数重命名书籍的分类，以使之更易理解。<br/><br/>USE pubs<br/>SELECT<br/>&nbsp;&nbsp;CASE type<br/>&nbsp;&nbsp;&nbsp;&nbsp; WHEN 'popular_comp' THEN 'Popular Computing'<br/>&nbsp;&nbsp;&nbsp;&nbsp; WHEN 'mod_cook' THEN 'Modern Cooking'<br/>&nbsp;&nbsp;&nbsp;&nbsp; WHEN 'business' THEN 'Business'<br/>&nbsp;&nbsp;&nbsp;&nbsp; WHEN 'psychology' THEN 'Psychology'<br/>&nbsp;&nbsp;&nbsp;&nbsp; WHEN 'trad_cook' THEN 'Traditional Cooking'<br/>&nbsp;&nbsp;&nbsp;&nbsp; ELSE 'Not yet categorized'<br/>&nbsp;&nbsp;END AS Category, <br/>CONVERT(varchar(30), title) AS "Shortened Title", <br/>price AS Price<br/>FROM titles<br/>WHERE price IS NOT NULL<br/>ORDER BY 1<br/><br/>&nbsp;&nbsp; 2.使用带有简单 CASE 函数和 CASE 搜索函数的 SELECT 语句<br/><br/>&nbsp;&nbsp; CASE 函数的另一个用途给数据分类。下面的查询使用 CASE 函数对价格分类。<br/><br/>SELECT<br/>&nbsp;&nbsp;CASE <br/>&nbsp;&nbsp;&nbsp;&nbsp; WHEN price IS NULL THEN 'Not yet priced'<br/>&nbsp;&nbsp;&nbsp;&nbsp; WHEN price < 10 THEN 'Very Reasonable Title'<br/>&nbsp;&nbsp;&nbsp;&nbsp; WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'<br/>&nbsp;&nbsp;&nbsp;&nbsp; ELSE 'Expensive book!'<br/>&nbsp;&nbsp;END AS "Price Category",<br/>CONVERT(varchar(20), title) AS "Shortened Title"<br/>FROM pubs.dbo.titles<br/>ORDER BY price<br/><br/>&nbsp;&nbsp; 3.使用带有 SUBSTRING 和 SELECT 的 CASE 函数<br/>下面的示例使用 CASE 和 THEN 生成一个有关作者、图书标识号和每个作者所著图书类型的列表。 <br/><br/>USE pubs<br/>SELECT SUBSTRING((RTRIM(a.au_fname) + ' '+ <br/>&nbsp;&nbsp;RTRIM(a.au_lname) + ' '), 1, 25) AS Name, a.au_id, ta.title_id,<br/>&nbsp;&nbsp;Type = <br/> CASE <br/>&nbsp;&nbsp; WHEN SUBSTRING(ta.title_id, 1, 2) = 'BU' THEN 'Business'<br/>&nbsp;&nbsp; WHEN SUBSTRING(ta.title_id, 1, 2) = 'MC' THEN 'Modern Cooking'<br/>&nbsp;&nbsp; WHEN SUBSTRING(ta.title_id, 1, 2) = 'PC' THEN 'Popular Computing'<br/>&nbsp;&nbsp; WHEN SUBSTRING(ta.title_id, 1, 2) = 'PS' THEN 'Psychology'<br/>&nbsp;&nbsp; WHEN SUBSTRING(ta.title_id, 1, 2) = 'TC' THEN 'Traditional Cooking'<br/> END<br/>FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id<br/><br/>&nbsp;&nbsp; 4.在Group by子句中使用CASE子句<br/>比方说下面的 GROUP BY 子句中的 CASE：<br/><br/>SELECT 'Number of Titles', Count(*)<br/>FROM titles<br/>GROUP BY<br/>&nbsp;&nbsp; CASE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price IS NULL THEN 'Unpriced'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price < 10 THEN 'Bargain'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price BETWEEN 10 and 20 THEN 'Average'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE 'Gift to impress relatives'<br/>&nbsp;&nbsp; END<br/>GO <br/><br/>你甚至还可以组合这些选项，添加一个 ORDER BY 子句，如下所示：<br/><br/>USE pubs<br/>GO<br/>SELECT<br/>&nbsp;&nbsp; CASE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price IS NULL THEN 'Unpriced'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price < 10 THEN 'Bargain'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price BETWEEN 10 and 20 THEN 'Average'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE 'Gift to impress relatives'<br/>&nbsp;&nbsp; END AS Range,<br/>&nbsp;&nbsp; Title<br/>FROM titles<br/>GROUP BY<br/>&nbsp;&nbsp; CASE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price IS NULL THEN 'Unpriced'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price < 10 THEN 'Bargain'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price BETWEEN 10 and 20 THEN 'Average'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE 'Gift to impress relatives'<br/>&nbsp;&nbsp; END,<br/>&nbsp;&nbsp; Title<br/>ORDER BY<br/>&nbsp;&nbsp; CASE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price IS NULL THEN 'Unpriced'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price < 10 THEN 'Bargain'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN price BETWEEN 10 and 20 THEN 'Average'<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE 'Gift to impress relatives'<br/>&nbsp;&nbsp; END,<br/>&nbsp;&nbsp; Title<br/>GO <br/><br/>注意，为了在 GROUP BY 块中使用 CASE，查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。<br/>
]]>
</description>
</item><item>
<link>http://www.qixiaomudong.cn/read.php?162</link>
<title><![CDATA[如何利用MySQL加密函数保护Web网站敏感数据]]></title> 
<author>七小木东 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Mon, 04 Jun 2007 05:04:56 +0000</pubDate> 
<guid>http://www.qixiaomudong.cn/read.php?162</guid> 
<description>
<![CDATA[ 
	如果您正在运行使用MySQL的Web应用程序，那么它把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取是一个令人关注的重要问题，因为您既不能让未经授权的人员使用或者破坏应用程序，同时还要保证您的竞争优势。幸运的是，MySQL带有很多设计用来提供这种类型安全的加密函数。本文概述了其中的一些函数，并说明了如何使用它们，以及它们能够提供的不同级别的安全。<br/><br/>双向加密<br/><br/>就让我们从最简单的加密开始：双向加密。在这里，一段数据通过一个密钥被加密，只能够由知道这个密钥的人来解密。MySQL有两个函数来支持这种类型的加密，分别叫做ENCODE()和DECODE()。下面是一个简单的实例：<br/><br/>mysql> INSERT INTO users (username, password) VALUES ('joe', ENCODE('guessme', 'abracadabra'));<br/>Query OK, 1 row affected (0.14 sec)<br/><br/>其中，Joe的密码是guessme，它通过密钥abracadabra被加密。要注意的是，加密完的结果是一个二进制字符串，如下所示：<br/><br/>mysql> SELECT * FROM users WHERE username='joe';<br/>+----------+----------+<br/>&#124; username &#124; password &#124;<br/>+----------+----------+<br/>&#124; joe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; ¡?i??!?&nbsp;&nbsp;&#124;<br/>+----------+----------+<br/>1 row in set (0.02 sec)<br/><br/>abracadabra这个密钥对于恢复到原始的字符串至关重要。这个密钥必须被传递给DECODE()函数，以获得原始的、未加密的密码。下面就是它的使用方法：<br/><br/>mysql> SELECT DECODE(password, 'abracadabra') FROM users WHERE username='joe';<br/>+---------------------------------+<br/>&#124; DECODE(password, 'abracadabra') &#124;<br/>+---------------------------------+<br/>&#124; guessme&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+---------------------------------+<br/>1 row in set (0.00 sec)<br/><br/>应该很容易就看到它在Web应用程序里是如何运行的——在验证用户登录的时候，DECODE()会用网站专用的密钥解开保存在数据库里的密码，并和用户输入的内容进行对比。假设您把PHP用作自己的脚本语言，那么可以像下面这样进行查询：<br/><br/><?php<br/>$query = "SELECT COUNT(*) FROM users WHERE username='$inputUser' AND DECODE(password, 'abracadabra') = '$inputPass'";?><br/><br/>提示：虽然ENCODE()和DECODE()这两个函数能够满足大多数的要求，但是有的时候您希望使用强度更高的加密手段。在这种情况下，您可以使用AES_ENCRYPT()和AES_DECRYPT()函数，它们的工作方式是相同的，但是加密强度更高。<br/><br/><br/><br/> <br/><br/>单向加密<br/><br/>单向加密与双向加密不同，一旦数据被加密就没有办法颠倒这一过程。因此密码的验证包括对用户输入内容的重新加密，并将它与保存的密文进行比对，看是否匹配。一种简单的单向加密方式是MD5校验码。MySQL的MD5()函数会为您的数据创建一个“指纹”并将它保存起来，供验证测试使用。下面就是如何使用它的一个简单例子：<br/><br/>mysql> INSERT INTO users (username, password) VALUES ('joe', MD5('guessme'));<br/>Query OK, 1 row affected (0.00 sec)<br/><br/>mysql> SELECT * FROM users WHERE username='joe';<br/>+----------+----------------------------------+<br/>&#124; username &#124; password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----------+----------------------------------+<br/>&#124; joe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 81a58e89df1f34c5487568e17327a219 &#124;<br/>+----------+----------------------------------+<br/>1 row in set (0.02 sec)<br/><br/>现在您可以测试用户输入的内容是否与已经保存的密码匹配，方法是取得用户输入密码的MD5校验码，并将它与已经保存的密码进行比对，就像下面这样：<br/><br/>mysql> SELECT COUNT(*) FROM users WHERE username='joe' AND password=MD5('guessme');<br/>+----------+<br/>&#124; COUNT(*) &#124;<br/>+----------+<br/>&#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124;<br/>+----------+<br/>1 row in set (0.00 sec)<br/><br/>或者，您考虑一下使用ENCRYPT()函数，它使用系统底层的crypt()系统调用来完成加密。这个函数有两个参数：一个是要被加密的字符串，另一个是双（或者多）字符的“salt”。它然后会用salt加密字符串；这个salt然后可以被用来再次加密用户输入的内容，并将它与先前加密的字符串进行比对。下面一个例子说明了如何使用它：<br/><br/>mysql> INSERT INTO users (username, password) VALUES ('joe', ENCRYPT('guessme', 'ab'));<br/>Query OK, 1 row affected (0.00 sec)<br/><br/>mysql> SELECT * FROM users WHERE username='joe';<br/>+----------+---------------+<br/>&#124; username &#124; password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>+----------+---------------+<br/>&#124; joe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; ab/G8gtZdMwak &#124;<br/>+----------+---------------+<br/>1 row in set (0.00 sec)<br/><br/>结果是<br/><br/>mysql> SELECT COUNT(*) FROM users WHERE username='joe' AND password=ENCRYPT('guessme', 'ab');<br/>+----------+<br/>&#124; COUNT(*) &#124;<br/>+----------+<br/>&#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124;<br/>+----------+<br/>1 row in set (0.00 sec)<br/><br/>提示：ENCRYPT()只能用在*NIX系统上，因为它需要用到底层的crypt()库。<br/><br/>幸运的是，上面的例子说明了能够如何利用MySQL对您的数据进行单向和双向的加密，并告诉了您一些关于如何保护数据库和其他敏感数据库信息安全的理念。祝您编程愉快！
]]>
</description>
</item><item>
<link>http://www.qixiaomudong.cn/read.php?105</link>
<title><![CDATA[PowerDesigner杂记]]></title> 
<author>七小木东 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Thu, 14 Sep 2006 07:29:10 +0000</pubDate> 
<guid>http://www.qixiaomudong.cn/read.php?105</guid> 
<description>
<![CDATA[ 
	PowerDesigner杂记<br/><br/>数据库设计工具对比<br/><br/>&nbsp;&nbsp; PowerDesign：PowerDesign是Sybase推出的主打数据库设计工具。PowerDesign致力于采用基于Entiry-Relation的数据模型，分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical Data Model)两个层次对数据库进行设计。概念数据模型描述的是独立于数据库管理系统(DBMS)的实体定义和实体关系定义。物理数据模型是在概念数据模型的基础上针对目标数据库管理系统的具体化。<br/><br/>&nbsp;&nbsp; ERWin：这个是CA公司的拳头产品，它有一个兄弟是BPWin,这个是CASE工具的一个里程碑似的产品。ERWin界面相当简洁漂亮，也是采用ER模型，如果你是开发中小型数据库，极力推荐ERWin，它的Diagram给人的感觉十分清晰。在一个实体中，不同的属性类型采用可定制的图标显示，实体与实体的关系也一目了然。ERWin不适合非常大的数据库的设计，因为它对Diagram欠缺更多层次的组织。<br/><br/>如何一次性将表结构的脚本导出来？ <br/>&nbsp;&nbsp; Database --->Generate Database ---> Genarate Script 就可实现。<br/><br/>Name用中文英文以便查询、写程序的时候方便， Code才是最终产生的Table Name <br/><br/>PowerDesigner中建了模型，如何把它作为文档导出？<br/>&nbsp;&nbsp; 利用REPORT。选择一个模板，然后就生成了RTF或是HTM格式的文档<br/><br/>如何将已经存在的数据库所有表，导入到PowerDesign中？<br/>&nbsp;&nbsp; 用PD里的反向工程file--->reverse engineering ===> and go on <br/><br/>概念数据模型(CDM)<br/>&nbsp;&nbsp; CDM表现数据库的全部逻辑的结构,与任何的软件或数据储藏结构无关。一个概念模型经常包括在物理数据库中仍然不实现的数据对象。它给运行计划或业务活动的数据一个正式表现方式。不考虑物理实现细节，只考虑实体之间的关系。<br/><br/>物理数据模型 (PDM)<br/>&nbsp;&nbsp; PDM叙述数据库的物理实现。主要目的是把CDM中建立的现实世界模型生成特定的DBMS脚本，产生数据库中保存信息的储存结构，保证数据在数据库中的完整性和一致性。<br/><br/>面向对象模型 (OOM)<br/>&nbsp;&nbsp; 一个OOM包含一系列包，类，接口和他们的关系。这些对象一起形成所有的(或部份)一个软件系统的逻辑的设计视图的类结构。一个OOM本质上是软件系统的一个静态的概念模型。<br/><br/>业务程序模型(BPM)<br/>&nbsp;&nbsp; BPM描述业务的各种不同内在任务和内在流程，而且客户如何以这些任务和流程互相影响。BPM是从业务合伙人的观点来看业务逻辑和规则的概念模型，使用一个图表描述程序，流程，信息和合作协议之间的交互作用。<br/><br/>正向工程<br/>&nbsp;&nbsp; 你能直接地从PDM产生一个数据库, 或产生一个能在你的数据库管理系统环境中运行的数据库脚本。可以生成数据库脚本,如果选择ODBC方式,则可以直接连接到数据库,从而直接产生数据库表以及其他数据库对象。<br/><br/>逆向工程<br/>&nbsp;&nbsp; 将已存在的数据库产生进新的PDM 之内。数据来源可能是从脚本文件或一个开放数据库连接数据来源。 <br/><br/>&nbsp;&nbsp; 并不是每个设计都需要用到Power Designer。 例如：小的系统，或Table数比较少的情况下就没有必要采用Power Designer了。<br/><br/>设计步骤<br/><br/><br/>CDM PDM OOM三者转换关系<br/><br/><br/>2004-08-22更新<br/><br/>PowerDesigner仅仅是实现的工具 <br/>&nbsp;&nbsp; 不要以为Power能帮你把关系什么的全部建立好，很多数据库理论只是还是需要的，设计数据库的时候，那些范式什么的，一定要掌握。 <br/>&nbsp;&nbsp; 设计一个好的数据库，最好的工具不是必须的，但是基础理论是一定要的。<br/><br/>PowerDesigner用途不局限于数据建模 <br/>&nbsp;&nbsp; 还可以用PowerDweigner设计web service<br/><br/>并不是每个设计都需要用到PD <br/>&nbsp;&nbsp; 用Powerdesigner对付比较大型的项目，是很好的，对于短平快类型的项目，如果时间要求你1个星期完成一个程序，那么完全没有必要用PowerDesigner，直接维护数据库就可以了，当表的数量超过10个（一个小系统的表在10个左右）的时候，建议还是用用Powerdesigner 。<br/>&nbsp;&nbsp; 我的看法：如果想做成一个比较规范的数据库，小项目也可以用。毕竟生成报表和正反向工程很有用。<br/><br/>零碎<br/><br/>&nbsp;&nbsp; PD中的CDM设计时，可以将所有需要的字段都定义好。然后在设计实体是直接取出来。PD提供了这样的统一管理的工具。在PD菜单栏-Model-Data Item下。<br/><br/>&nbsp;&nbsp; 为了使自己设计的CDM看起来象样一点，可以从工具栏中，拖动一个Title。其显示的信息，是当前CDM的属性值。<br/><br/>&nbsp;&nbsp; 为了使实体等Symbol看起来显眼和舒服。可以根据个人喜好进行外观上的调整。当前设计界面中，右键-Display Perferences中进行设置。还可以增加shadow效果。选中Symbol后，Ctrl+W。或者右键菜单。<br/><br/>&nbsp;&nbsp; 为了使布局整齐。选中需要调整的Symbol后，菜单-Symbol-Align进行设置。快捷键：ctrl+UP,ctrl+Down,ctrl+Left,ctrl+Right即为上下左右对齐。<br/><br/>&nbsp;&nbsp; 设计实体属性时注意的细节：M：表示强制非空；P：是否为主键；D：是否在模型中显示。gerenate：表示是否作为表生成。<br/><br/>&nbsp;&nbsp; 默认情况下，CDM的实体会显示Identifier一栏。如果不想其显示出来，在右键-Display Perferences中ObjectView-Entity中设置。<br/><br/>&nbsp;&nbsp; 关系的命名方法是：实体名1 实体名2。<br/><br/>&nbsp;&nbsp; 关系中的角色（Role）表示联系线上一个方向上的含义。用一个动词来描述。Role只是起一个描述作用。<br/><br/>&nbsp;&nbsp; 依赖(Dependency)：表示在联系中一个实体的存在是否依赖于另一个实体。寄生实体（Dependent Entity）是一种部分地被另一实体确定的实体。在依赖联系中，一个实体与另一实体通过标识符相联系，当一个实体的存在没有另一个实体的存在作为参考就不能唯一确定时，两个实体间就存在依赖联系。<br/>&nbsp;&nbsp; 主从表就是典型的依赖关系。<br/><br/>&nbsp;&nbsp; 中间实体（Associative Entity）：是为了解决多对多联系而产生的一个人工实体，能够为中间实体定义属性。用鼠标右键单击多对多联系线，在弹出的菜单中选择“Change to entity”，能够把这个联系转换成连接两个实体的中间实体。<br/>&nbsp;&nbsp; 善于利用自动生成的中间实体，可以简化设计工作，提高数据库设计的正确性。<br/>&nbsp;&nbsp; 中间实体一般不用再加入新的字段。<br/><br/>&nbsp;&nbsp; 牢记：外键是通过关系Relationship自动来建立的，不需要手动建立。不然会产生多余的键。所以设计时，关注实体本身的字段，以及实体间的关系，特别是多对多和依赖关系。<br/><br/>&nbsp;&nbsp; 从CDM到PDM的转换需要注意：<br/><br/><br/>不能改变Diagram的名称 <br/>在树状图中，如果钩选红色标出的Symbol表示覆盖修改，不钩选表示保护修改。<br/><br/>&nbsp;&nbsp; 数据库为了保证数据完整性和一致性，提出了约束。即表约束，列约束以及参照完整性约束。通常数据库设计和程序开发不是绝对的分离的。所以前两者在实际开发过程中逐渐的完善。需要注意的还是参照完整性约束。<br/>&nbsp;&nbsp; 在PD中前两者的设定是对字段，后者是对关系。<br/><br/>&nbsp;&nbsp; 参照完整性约束<br/><br/><br/>限制（Restrict）。不允许进行修改或删除操作。若修改或删除主表的主键时，如果子表中存在子记录，系统将产生一个错误提示。这是缺省的参照完整性设置。 <br/>置空(Set Null)。如果外键列允许为空，若修改或删除主表的主键时，把子表中参照的外键列设置为空值（NULL）。 <br/>置为缺省(Set Default)。如果指定了缺省值，若修改或删除主表的主键时，把子表中参照的外键设置为缺省值（Default）。 <br/>级联(Cascade)。把主表中主键修改为一个新的值时，相应修改子表中外键的值；或者删除主表中主键的记录时，要相应删除子表中外键的记录。<br/><br/>&nbsp;&nbsp; 注意理解以上的约束时，抓住操作的都是主表。子表的操作都是相对主表来说的。操作方式就是Update和Delete。<br/><br/>&nbsp;&nbsp; 引用基础数据表的数据时，可以建立对应的视图。选中需要作为视图的表，菜单栏-Tools-Create View<br/><br/>&nbsp;&nbsp; PD支持对已有数据的表更新表结构。不过需要谨慎操作，检查生成的SQL脚本。<br/><br/>&nbsp;&nbsp; PD也可以生成随机的测试数据。<br/><br/>&nbsp;&nbsp; 触发器就是DBMS中提供的事件驱动机制。发生在表的Insert,Update和Delete。执行SQL语句或存储过程。<br/><br/>&nbsp;&nbsp; 在PD中可以完成存储过程的编写，也便于管理。<br/><br/>&nbsp;&nbsp; 逆向工程可以通过数据库脚本或者通过ODBC数据源来实现。<br/><br/>
]]>
</description>
</item>
</channel>
</rss>