﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-冬日飘雪-随笔分类-DataBase</title><link>http://www.cppblog.com/Cpp001/category/14410.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 04 Aug 2010 15:19:52 GMT</lastBuildDate><pubDate>Wed, 04 Aug 2010 15:19:52 GMT</pubDate><ttl>60</ttl><item><title>ADO智能指针（转）</title><link>http://www.cppblog.com/Cpp001/archive/2010/08/04/122244.html</link><dc:creator>Bomb</dc:creator><author>Bomb</author><pubDate>Wed, 04 Aug 2010 14:57:00 GMT</pubDate><guid>http://www.cppblog.com/Cpp001/archive/2010/08/04/122244.html</guid><wfw:comment>http://www.cppblog.com/Cpp001/comments/122244.html</wfw:comment><comments>http://www.cppblog.com/Cpp001/archive/2010/08/04/122244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cpp001/comments/commentRss/122244.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cpp001/services/trackbacks/122244.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">使用C++（MFC）操作数据库，首选就是ADO。<span style="FONT-SIZE: 10pt">ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。在MFC要使用ADO（COM）首先要引用COM地址，编译器才能够实现。从网上的很多资料都介绍，将EOF重命名，防止和其他冲突，那偶们也这样做反正也不会有坏处。格式如下：<br></span></span><font size=2><span style="COLOR: red">#include &lt;comdef.h&gt;<br>#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "EndOfFields")<br></span><span style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; 只要用过MFC的人都知道把它放在哪（stdafx.h）。由于ADO是一个COM所以在调用他们之前要初始化COM环境，本人就在初始化这个栽了个跟头。初始化OLE（调用AfxOleInit();）在方法</span></span>uApp::InitInstance()中进行（必须在DoModal()之前），当然也可以在你调用前初始化。OK下面就可以调用了，系统会生成两个文件，这些都是从COM高过来的。<br><br></font>
<div style="BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; BORDER-LEFT: #666666 1px solid; BORDER-BOTTOM: #666666 1px solid"><span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; <span style="COLOR: red">_ConnectionPtr</span>接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句，如一个存储过程。使用 _ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录，而用_RecordserPtr时不需要。<br>&nbsp;&nbsp;&nbsp; <span style="COLOR: red">_CommandPtr</span>接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时，你可以利用全局 _ConnectionPtr接口，也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作，后者是比较好的选择。但如果你要频繁访问数据库，并要返回很多记录集，那么，你应该使用全局_ConnectionPtr接口创建一个数据连接，然后使用_CommandPtr 接口执行存储过程和SQL语句。<br>&nbsp;&nbsp;&nbsp; <span style="COLOR: red">_RecordsetPtr</span>是一个记录集对象。与以上两种对象相比，它对记录集提供了更多的控制功能，如记录锁定，游标控制等。同_CommandPtr接口一样，它不一定要使用一个已经创建的数据连接，可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量，让它自己创建数据连接。如果你要使用多个记录集，最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口，然后使用_RecordsetPtr执行存储过程和SQL语句。<br></span></div>
<br>&nbsp;&nbsp;&nbsp; 使用_ConnectionPtr和_RecordsetPtr来读取数据库内容：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;在此添加额外的初始化代码</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;szServerName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Driver=SQL&nbsp;Server;Server=(local);Database=Domains;uid=sa;pwd=;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pConnection.CreateInstance(__uuidof(Connection));<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pConnection</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Open((_bstr_t)szServerName,</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pRecordset.CreateInstance(__uuidof(Recordset));<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;szSQL</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SELECT&nbsp;DomainName&nbsp;FROM&nbsp;Domains;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTR&nbsp;bstrSQL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;szSQL.AllocSysString();<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Open(bstrSQL,(IDispatch&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">EndOfFields)<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_variant_t&nbsp;theValue;<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theValue&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetCollect(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DomainName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(theValue.vt</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">VT_NULL)<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(CString(theValue));<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">MoveNext();<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Close();<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pConnection</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Close();<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(_com_error&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">e)&nbsp;<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(e</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Description(),e</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Source());&nbsp;<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;} <br></span></div>
<br>原文出自：<a href="http://kb.cnblogs.com/a/949747/">http://kb.cnblogs.com/a/949747/</a> 
<img src ="http://www.cppblog.com/Cpp001/aggbug/122244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cpp001/" target="_blank">Bomb</a> 2010-08-04 22:57 <a href="http://www.cppblog.com/Cpp001/archive/2010/08/04/122244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何利用UDL文件来建立ADO连接（转）</title><link>http://www.cppblog.com/Cpp001/archive/2010/08/04/122197.html</link><dc:creator>Bomb</dc:creator><author>Bomb</author><pubDate>Wed, 04 Aug 2010 05:22:00 GMT</pubDate><guid>http://www.cppblog.com/Cpp001/archive/2010/08/04/122197.html</guid><wfw:comment>http://www.cppblog.com/Cpp001/comments/122197.html</wfw:comment><comments>http://www.cppblog.com/Cpp001/archive/2010/08/04/122197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cpp001/comments/commentRss/122197.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cpp001/services/trackbacks/122197.html</trackback:ping><description><![CDATA[<p>如何利用UDL文件来建立ADO连接&nbsp; 使用通用数据连接文件（*.UDL，以下简称文件）来创建ADO连接，可以和ODBC一样可视化地定义要连接的数据源，从而实现数据访问的透明性。</p>
<p>1.使用UDL文件来创建ADO连接</p>
<p>创建ADO的连接，首先要设置ADO连接对象的ConnectionString属性，该属性提供所要连接的数据库类型、数据所处服务器、要访问的数据库和数据库访问的安全认证信息。比较专业的方法是在ConnectionString中直接提供以上信息，下面是访问不同类型数据源设置ConnectionString的标准：访问ODBC数据<br>"Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassWord;" <br>访问ORACLE数据库 <br>"Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;" <br>访问MS SQL数据库 <br>"Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName; User ID=userName;Password=userPassword;" <br>访问Access 数据库 <br>"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;"</p>
<p>上述的连接属性设置标准随着数据源的类型不同而变化，软件用户常常不习惯这种设置方式，都希望有可视化的数据源设置方法。为此Microsoft提供了通用数据连接文件（.UDL）来建立和测试ADO连接属性。ADO连接对象可以很方便地使用UDL文件来连接数据源，下面例子使用my_data1.udl来创建ADO连接。</p>
<p>_ConnectionPtr m_pDBConn; <br>m_pDBConn.CreateInstance(__uuidof(Connection)); <br>m_pDBConn-&gt;ConnectionString ="File Name=c:\mydir\my_data1.udl"; <br>m_pDBConn-&gt;Open("","","",NULL);</p>
<p>&nbsp;</p>
<p>这样一来无论数据源如何变化，在软件中都可以用统一的方法编程。当数据源改变时，只要双击相应的udl文件即可可视化地设置数据源，无需更改软件。</p>
<p>因为ADO是COM接口，为了软件的可靠性，打开ADO连接时，可以加入异常处理代码。 try{ <br>m_pDBConn-&gt;Open("","","",NULL); <br>}catch(_com_error &amp;e){ <br>//处理异常的代码 <br>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . <br>m_pDBConn=NULL; <br>}</p>
<p><br>因为_ConnectionPtr m_pDBConn是智能指针，应在处理异常代码时将智能指针设为NULL后将自动将引用计数降为0.</p>
<p>如果不出现异常，只要在使用完m_pDBConn，只要引用Close方法即可。</p>
<p>2.创建你所需的UDL文件</p>
<p>在你所想创建UDL文件的目录中单击右键，选择从菜单 新建Microsoft 数据连接，然后将新创建的UDL文件更改为你所希望的文件名（。UDL扩展名不能改变）。</p>
<p>注：如果操作系统是Window 2000，先创建一个文本文件，再将该文本文件的扩展名改为 "udl".</p>
<p>然后双击所创建的UDL文件，即可视化地完成数据源的设定。</p>
<p>使用UDL文件必须在系统中先安装Microsoft MDAC，Win 98第二版，Win 2000中都自动包含了该组件，需要该组件最新版本时可以到Microsoft网站去下载。</p>
<p>本文来自[Svn中文网]转发请保留本站地址：<a href="http://www.svn8.com/c/cc/2010020220112.html">http://www.svn8.com/c/cc/2010020220112.html</a></p>
<img src ="http://www.cppblog.com/Cpp001/aggbug/122197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cpp001/" target="_blank">Bomb</a> 2010-08-04 13:22 <a href="http://www.cppblog.com/Cpp001/archive/2010/08/04/122197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server字符集的研究（转）</title><link>http://www.cppblog.com/Cpp001/archive/2010/08/03/122111.html</link><dc:creator>Bomb</dc:creator><author>Bomb</author><pubDate>Tue, 03 Aug 2010 14:17:00 GMT</pubDate><guid>http://www.cppblog.com/Cpp001/archive/2010/08/03/122111.html</guid><wfw:comment>http://www.cppblog.com/Cpp001/comments/122111.html</wfw:comment><comments>http://www.cppblog.com/Cpp001/archive/2010/08/03/122111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Cpp001/comments/commentRss/122111.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Cpp001/services/trackbacks/122111.html</trackback:ping><description><![CDATA[<font face=#ce_temp_font#><strong>一、 试验归类</strong>
<p>　　测试SQL：</p>
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
<div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><span style="COLOR: #000000">drop table a create table a(a varchar(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)) insert into a values(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) insert into a values(N</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) insert into a values(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">深圳</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) insert into a values(N</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">深圳</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) select a， len(a)， datalength(a) from a drop table #a create table a(a varchar(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)) insert into #a values(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) insert into #a values(N</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) insert into #a values(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">深圳</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) insert into #a values(N</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">深圳</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">) select a， len(a)， datalength(a) from #a drop table a create table a(a varchar(</span><span style="COLOR: #000000">8000</span><span style="COLOR: #000000">)) insert into a select REPLICATE(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">， </span><span style="COLOR: #000000">8000</span><span style="COLOR: #000000">) insert into a select REPLICATE(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">深</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">， </span><span style="COLOR: #000000">8000</span><span style="COLOR: #000000">) insert into a select REPLICATE(N</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">， </span><span style="COLOR: #000000">8000</span><span style="COLOR: #000000">) insert into a select REPLICATE(N</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">深</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">， </span><span style="COLOR: #000000">8000</span><span style="COLOR: #000000">) select a， len(a)， datalength(a) from a</span></div>
</pre>
<p>　　1. 字符集是支持双字节的字符集如中文字符集（Collation name为Chinese_PRC_CI_AS）<br>&nbsp;<br>　　&nbsp;&lt;1&gt;. 定义varchar(2)<br>&nbsp;<br>　　(1) 正式表</p>
<p>　　总结：在中文字符集下，定义varchar(x)， 不论使用不使用N''，英文字符都占1个字节，即可以存x个英文字符； 不论使用不使用N''，中文字符都占2个字节，即可以存(x / 2)个中文，select结果为汉字本身，不是乱码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>　　(2) 临时表</p>
<p>　　总结：在中文字符集下，定义varchar(x)，&nbsp;和正式表表现一样；<br>&nbsp; <br>　　&lt;2&gt;. 定义nvarchar(2)<br>&nbsp;<br>　　(1) 正式表</p>
<p>　　总结：在中文字符集下，定义nvarchar(x)， 不论使用不使用N''，英文字符都占2个字节，即可以存x个英文字符； 不论使用不使用N''，中文字符都占2个字节，即可以存x个中文，select结果为汉字本身，不是乱码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>　　(2) 临时表</p>
<p>　　总结：在中文字符集下，定义nvarchar(x)，&nbsp;和正式表表现一样。</p>
<p>　　&lt;3&gt;. 类型为varchar时，长度 x 和 datalength()对应，都指字节大小； 英文len() = datalength()；中文len() = datalength() / 2；类型为nvarchar时，长度 x 和 len()对应，都指字符长度。<br>&nbsp;&nbsp;&nbsp; <br>　　2. 字符集是支持单字节的字符集如拉丁字符集（Collation name为Latin1_General_CI_AS）<br>&nbsp; <br>　　&lt;1&gt;. 定义varchar(2)<br>&nbsp;<br>　　(1) 正式表</p>
<p>　　总结：在英文字符集下，定义varchar(x)，不论使用不使用N''，英文字符都占1个字节，即可以存x个英文字符；不论使用不使用N''，中文字符都占1个字节，即可以存x个中文，但只保存前半截中文编码，所以select结果为乱码；（特殊：如果使用N''，此时插入的字符数最大为4000）</p>
<p>　　英文和中文 len() = datalength()；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>　　(2) 临时表</p>
<p>　　总结：在英文字符集下，定义varchar(x)， 不论使用不使用N''，英文字符都占1个字节，即可以存x个英文字符；不使用N''时，中文占1个字节，可以存x个汉字，但都只存入汉字前半截字符编码，显示为乱码；使用N''时，中文占2个字节，只可以存 x/2 个汉字，没有乱码，取出仍为汉字，说明在英文字符集下通过使用N''是可以保存汉字的；除用N''保存的中文外，其余英文和中文 len() = datalength()；用N''保存的中文字符len() = datalength() / 2；<br>&nbsp;&nbsp;&nbsp; <br>　　&lt;2&gt;. 定义nvarchar(2)<br>&nbsp;<br>　　(1) 正式表</p>
<p>　　总结：在英文字符集下，定义nvarchar(x)，不论使用不使用N''，英文字符都占2个字节，即可以存x个英文字符；（注意每个字符比varchar用的空间大）不论使用不使用N''，中文字符都占2个字节，即可以存x个中文字符，但不使用N''只保存前半截中文编码，所以select结果为乱码；使用N''则保存和取出都为汉字本身；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>　　(2) 临时表</p>
<p>　　总结：在英文字符集下，定义nvarchar(x)，&nbsp;和正式表表现相同；<br>&nbsp;&nbsp;&nbsp; <br>　　&lt;3&gt;. 类型为varchar时，长度 x 和 datalength()对应，都指字节大小；（临时表中N''中文字符长度比较特殊；） 类型为nvarchar时，长度 x 和 len()对应，都指字符长度。<br>&nbsp;<br>　　<strong>二、 使用归类</strong></p>
<p>　　抛开不常用的临时表不谈，只看正式表，再加上varchar和nvarchar类型的最大长度，得到以下经验：</p>
<p>　　&lt;1&gt; 最大长度问题</p>
<p>　　1. 在中文字符集下使用varchar，最大长度可定义8000，这个8000是指字节数（datalength()），即最大可以保存8000个英文字符，4000个中文字符。</p>
<p>　　特殊：若存入字符N'a'，则最大能保存4000个字符，但其所占空间为4000字节。</p>
<p>　　2. 在中文字符集下使用nvarchar，最大长度可定义4000，这个4000是指字符个数（len()），即最大可以保存4000个英文字符，4000个中文字符。<br>&nbsp;<br>　　3. 在英文字符集下使用varchar，最大长度可定义8000，这个8000是指字节数（datalength()），由于中文英文都保存为1字节，故最大可以保存8000个英文、中文字符。</p>
<p>　　4. 在英文字符集下使用nvarchar，最大长度可定义4000，这个4000是指字符个数（len()），即最大可以保存4000个英文字符，4000个中文字符。</p>
<p>　　&lt;2&gt; 文字显示问题</p>
<p>　　1. N''要和数据类型nvarchar， nchar一起使用，如果对varchar， char字段类型强制使用N''，则会产生一些特殊现象，甚至无法控制。 </p>
<p>　　2. 在英文字符集下，想要保存特殊符号字符、中文等双字节字符，在定义表结构时要使用nvarchar或者nchar，在保存时要用N''。</p>
<p>　　3. 在中文字符集下，数据库系统缺省已经可以保存特殊符号字符、中文等双字节字符。即使用不使用N''，都按双字节处理。但为了统一期间建议，在定义表结构时如果使用nvarchar或者nchar，在保存时要用N''，在定义表结构时如果使用varchar和char，此时不要使用N''操作。</p>
<p>　　4. SUBSTRING ( expression ， start ， length )&nbsp;。length：是一个整数，指定子串的长度（要返回的字符数或字节数）。 中文字符集中按字符数取；英文字符集中，char， varchar按字节数取，nchar， nvarchar按字符数取；</p>
<p>　　<strong>三、 其他参考</strong></p>
<p>　　使用 Unicode 数据</p>
<p>　　unicode代码页、排序规则、SQL Server 排序规则基础知识、Windows 排序规则排序样式、选择 SQL 排序规则、&nbsp;DBCS 字符</p>
原文出自：<a href="http://tech.it168.com/oldarticle/2006-07-21/200607211444921.shtml">http://tech.it168.com/oldarticle/2006-07-21/200607211444921.shtml</a></font> 
<img src ="http://www.cppblog.com/Cpp001/aggbug/122111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Cpp001/" target="_blank">Bomb</a> 2010-08-03 22:17 <a href="http://www.cppblog.com/Cpp001/archive/2010/08/03/122111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>