﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-mashiguang-随笔分类-数据库相关</title><link>http://www.blogjava.net/mashiguang/category/23846.html</link><description>小马快跑</description><language>zh-cn</language><lastBuildDate>Fri, 21 Jan 2011 06:06:05 GMT</lastBuildDate><pubDate>Fri, 21 Jan 2011 06:06:05 GMT</pubDate><ttl>60</ttl><item><title>关于Oracle一个汉字代表几个字节的问题（转）</title><link>http://www.blogjava.net/mashiguang/archive/2011/01/21/343313.html</link><dc:creator>mashiguang</dc:creator><author>mashiguang</author><pubDate>Fri, 21 Jan 2011 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/mashiguang/archive/2011/01/21/343313.html</guid><wfw:comment>http://www.blogjava.net/mashiguang/comments/343313.html</wfw:comment><comments>http://www.blogjava.net/mashiguang/archive/2011/01/21/343313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mashiguang/comments/commentRss/343313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mashiguang/services/trackbacks/343313.html</trackback:ping><description><![CDATA[<p>在Oracle定义变量时，常有VARCHAR2 (3 Char)或者VARCHAR2 (10 Byte)的数据类型，那么3char或者10Byte到底代表几个汉字，几个字符呢，上次外公司一同事讨论这个问题，一下没给解释清楚，所以下来以后整理如下：</p>
<p>总结：<br />
当NLS_CHARACTERSET=AL32UTF8时（）<br />
NLS_LENGTH_SEMANTICS=BYTE时，一个汉字代表三个字节<br />
NLS_LENGTH_SEMANTICS=CHAR时，一个汉字代表一个字节<br />
当NLS_CHARACTERSET=US7ASCII时（字符集为单字节）<br />
NLS_LENGTH_SEMANTICS=BYTE时，一个汉字代表两个字节<br />
NLS_LENGTH_SEMANTICS=CHAR时，一个汉字代表两个字节</p>
<p>现象:<br />
select * from nls_database_parameters;<br />
&#8230;.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;&#8230;&#8230;..<br />
NLS_CHARACTERSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AL32UTF8</p>
<p>&#8230;..</p>
<p>NLS_LENGTH_SEMANTICS BYTE</p>
<p>&#8230;.</p>
<p>NLS_NCHAR_CHARACTERSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AL16UTF16</p>
<p>NLS_RDBMS_VERSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.2.0.4.0<br />
&nbsp;</p>
<p>SQL&gt; alter session set nls_length_semantics='BYTE';</p>
<p>SQL&gt; create table nls_byte(c1 varchar2(7));</p>
<p>SQL&gt; insert into nls_byte values('测试机');</p>
<p>&nbsp;insert into nls_byte values('测试机')</p>
<p>&nbsp;ORA-12899: 列 "SYS"."NLS_BYTE"."C1" 的值太大 (实际值: 9, 最大值: 7)</p>
<p>SQL&gt; insert into nls_byte values('测试a');</p>
<p>&nbsp;1 row inserted<br />
&nbsp;<br />
SQL&gt; select table_name,column_name,t.DATA_TYPE,t.DATA_LENGTH,t.CHAR_USED from user_tab_columns t where table_name='NLS_BYTE';</p>
<p>&nbsp;TABLE_NAME COLU DATA_TYP DATA_LENGTH CHAR_USED</p>
<p>---------- ---- -------- ----------- ---------</p>
<p>NLS_BYTE&nbsp;&nbsp; C1&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 B<br />
&nbsp;&nbsp; <br />
NLS_LENGTH_SEMANTICS allows you to specify the length of a column datatype in terms of CHARacters rather than in terms of BYTEs. Typically this is when using an AL32UTF8 or other varying width NLS_CHARACTERSET database where one character is not always one byte. While using CHAR semantics has as such no added value in a 7/8 bit characterset it's fully supported so any application code / table setup using CHAR can also be used in a 7/8bit characterset like US7ASCII/WE8MSWIN1252.<br />
This parameter is a 9i (and up) feature and is not available in older releases</p>
<p>翻译过来就是:这个参数允许将列的数据单位设为字符而不是byte.这个问题会在字符集设为UTF8的时候出现. 此参数在9i以上版本有效.</p>
<p>NLS_LENGTH_SEMANTICS 设置.</p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_DATABASE_PARAMETERS中的值是在数据库创建的时候确定的,一般都为BYTE</p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp; 此参数可以以 &#8220;ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR scope=both&#8221;方式修改,但是需要重启数据库才能生效.</p>
<p>3.&nbsp;&nbsp;&nbsp;&nbsp; 也可用&#8221; ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR&#8221;使对当前session生效.</p>
<p>4.&nbsp;&nbsp;&nbsp;&nbsp; 此参数可以在10G以上版本中,在环境变量或注册表中设置(注意需要大写),设定后从当前客户端启动的所有会话都采用新的取值.</p>
<p>5.&nbsp;&nbsp;&nbsp;&nbsp; 修改后只对新建的列生效,对于已有的列没有作用</p>
<p>6.&nbsp;&nbsp;&nbsp;&nbsp; 新建或升级DB时用BYTE,否则XDB或dba_tables会出现问题.</p>
<p>7.&nbsp;&nbsp;&nbsp;&nbsp; NLS_LENGTH_SEMANTICS对sys用户下的对象无效.</p>
<p>8.&nbsp;&nbsp;&nbsp;&nbsp; 如果对于7/8bit的字符集,设为byte/char意义不大,因为无论是char和byte都对应一个byte.</p>
<p>测试:</p>
<p>一.在当前session中修改此参数</p>
<p>&nbsp;SQL&gt; alter session set nls_length_semantics='char';</p>
<p>&nbsp;Session altered</p>
<p>&nbsp;SQL&gt; create table nls_char(c1 varchar2(7),c2 varchar2(7));</p>
<p>&nbsp;Table created</p>
<p>&nbsp;SQL&gt; desc nls_char</p>
<p>Name Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nullable Default Comments</p>
<p>---- ----------- -------- ------- --------</p>
<p>C1&nbsp;&nbsp; VARCHAR2(7) Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>C2&nbsp;&nbsp; VARCHAR2(7) Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;SQL&gt; insert into nls_char values('测试机','测试测试测试');</p>
<p>&nbsp;1 row inserted&nbsp; </p>
<p>如果对于alter system,效果是一样的</p>
<p>二.对于已经存在的表,</p>
<p>&nbsp;SQL&gt; desc nls_byte</p>
<p>Name Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nullable Default Comments</p>
<p>---- ---------------- -------- ------- --------</p>
<p>C1&nbsp;&nbsp; VARCHAR2(7 BYTE) Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>SQL&gt; alter table nls_byte modify c1 varchar2(7 char);</p>
<p>&nbsp;Table altered</p>
<p>&nbsp;SQL&gt; desc nls_byte</p>
<p>Name Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nullable Default Comments</p>
<p>---- ----------- -------- ------- --------</p>
<p>C1&nbsp;&nbsp; VARCHAR2(7) Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;SQL&gt; insert into nls_byte values('测试机');</p>
<p>&nbsp;1 row inserted<br />
&nbsp;<br />
1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp/imp : 不能直接导入,因为会采用source table的建表方式在target db里建表,即使目标库设的值为char.</p>
<p>*可以预先在目标库中以char方式建表</p>
<p>*然后导入,指定参数ignore=y</p>
<p>&nbsp; 2. Alter table</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; alter table "&lt;owner&gt;"."&lt;table&gt;" modify "&lt;column&gt;" char (10 char);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建脚本,修改列设定.</p>
<p>&nbsp;注:</p>
<p>Bug-3611750, ora-01450 online rebuild of index fails, 可以在重建索引前指定byte, 10.2.0.5以上已经修复</p>
<p>Bug 1488174 UNICODE: ALTER SYSTEM SET NLS_LENGTH_SEMANTICS DOESN'T<br />
TAKE EFFECT, 用此语句修改后,实际上不起作用,需要重启才能生效, 但是如果用alter session方式即时生效,不用重启.</p>
<p>进一步测试,在另一个字符集设为us7ascii的DB设置此参数</p>
<p>SQL&gt; select * from nls_database_parameters</p>
<p>6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_CHARACTERSET&nbsp; US7ASCII</p>
<p>SQL&gt; alter session set nls_length_semantics=byte;</p>
<p>Session altered.</p>
<p>SQL&gt; create table nls_byte(c1 varchar2(7));</p>
<p>Table created.</p>
<p>SQL&gt; insert into&nbsp; nls_byte values('测试测试');</p>
<p>insert into&nbsp; nls_byte values('测试测试')</p>
<p>ERROR at line 1:</p>
<p>ORA-12899: value too large for column "TEA"."NLS_BYTE"."C1" (actual: 8,</p>
<p>maximum: 7)</p>
<p>SQL&gt; desc nls_byte</p>
<p>&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Null?&nbsp;&nbsp;&nbsp; Type</p>
<p>&nbsp;-------------------------------</p>
<p>&nbsp;C1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(7)</p>
<p>SQL&gt; alter session set nls_length_semantics=char;</p>
<p>Session altered.</p>
<p>SQL&gt; create table nls_char(c1 varchar2(7));</p>
<p>Table created.</p>
<p>SQL&gt; insert into&nbsp; nls_char values('测试测试');</p>
<p>insert into&nbsp; nls_char values('测试测试')</p>
<p>ERROR at line 1:</p>
<p>ORA-12899: value too large for column "TEA"."NLS_CHAR"."C1" (actual: 8,</p>
<p>maximum: 7)</p>
<p>SQL&gt; desc nls_char</p>
<p>&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Null?&nbsp;&nbsp;&nbsp; Type</p>
<p>&nbsp;----------------------------------------- -------- -------------------</p>
<p>C1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(7)<br />
&nbsp; <br />
&nbsp;可以看出,在字符集为单字节的情况下,无论取何值,汉字都是以二个字节的方式存在的.</p>
<p>&nbsp;</p>
<br />
本文转自http://www.wudeyao.com/post-69.html
<img src ="http://www.blogjava.net/mashiguang/aggbug/343313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mashiguang/" target="_blank">mashiguang</a> 2011-01-21 12:49 <a href="http://www.blogjava.net/mashiguang/archive/2011/01/21/343313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql相关</title><link>http://www.blogjava.net/mashiguang/archive/2007/07/07/128174.html</link><dc:creator>mashiguang</dc:creator><author>mashiguang</author><pubDate>Fri, 06 Jul 2007 17:03:00 GMT</pubDate><guid>http://www.blogjava.net/mashiguang/archive/2007/07/07/128174.html</guid><wfw:comment>http://www.blogjava.net/mashiguang/comments/128174.html</wfw:comment><comments>http://www.blogjava.net/mashiguang/archive/2007/07/07/128174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mashiguang/comments/commentRss/128174.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mashiguang/services/trackbacks/128174.html</trackback:ping><description><![CDATA[<p><strong>1.创建mysql用户并授权:GRANT</strong></p>
语法: <br>GRANT <em>privileges</em> (<em>columns</em>)<br>ON <em>what</em><br>TO <em>username</em> IDENTIFIED BY "<em>password</em>"<br>WITH GRANT OPTION<br><br><em>privileges </em>:授予用户的权限<br><em>columns</em> :权限运用的列,可选<br><em>what</em> :权限运用的对象,可以是数据库,表,列<br><em>username</em> :权限授予的用户<br><em>password</em> :密码<br>WITH GRANT OPTION子句是可选的。 <br><br>先来创建一个用户plmm(漂亮mm),给她最大的权限,可以对所有的表做任何操作,密码是"1234",但是她只能从本地登陆:
<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%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">grant</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">all</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">to</span><span style="COLOR: #000000">&nbsp;plmm</span><span style="COLOR: #008000">@localhost</span><span style="COLOR: #000000">&nbsp;identified&nbsp;</span><span style="COLOR: #0000ff">by</span><span style="COLOR: #000000">&nbsp;"</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1234</span><span style="COLOR: #000000">"</span></div>
再来创建一个用户klmm(恐龙mm),我们只给她查看test数据库里的table1表的权限,而且只能在192.168.0.%登陆,这里的"%"是个通配符,如果要使用通配符的话一定要用引号括起来.
<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%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">grant</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000">&nbsp;test.table1<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">to</span><span style="COLOR: #000000">&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#107;&#108;&#109;&#109;&#64;&#39;&#49;&#57;&#50;&#46;&#49;&#54;&#56;&#46;&#48;&#46;&#37;&#39;">klmm</span><span style="COLOR: #008000">@'192</span><span style="COLOR: #000000">.</span><span style="FONT-WEIGHT: bold; COLOR: #800000">168.0</span><span style="COLOR: #000000">.</span><span style="FONT-WEIGHT: bold; COLOR: #800000">%</span><span style="COLOR: #000000">'</a>&nbsp;identified&nbsp;</span><span style="COLOR: #0000ff">by</span><span style="COLOR: #000000">&nbsp;"</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1234</span><span style="COLOR: #000000">"</span></div>
<br>下面表中列出<em>privileges&nbsp; </em>除了上面用到的all和select还有哪些值可以选择<br>
<table style="WIDTH: 509px; BORDER-COLLAPSE: collapse; HEIGHT: 416px" cellSpacing=0 cellPadding=3 border=1>
    <tbody>
        <tr>
            <td>权限指定符</td>
            <td>权限允许的操作</td>
        </tr>
        <tr>
            <td>ALTER</td>
            <td>修改表和索引</td>
        </tr>
        <tr>
            <td>CREATE</td>
            <td>创建数据库和表</td>
        </tr>
        <tr>
            <td>DELETE</td>
            <td>删除表中已有的记录</td>
        </tr>
        <tr>
            <td>DROP</td>
            <td>抛弃（删除）数据库和表</td>
        </tr>
        <tr>
            <td>INDEX</td>
            <td>创建或抛弃索引</td>
        </tr>
        <tr>
            <td>INSERT</td>
            <td>向表中插入新行</td>
        </tr>
        <tr>
            <td>REFERENCE</td>
            <td>未用</td>
        </tr>
        <tr>
            <td>SELECT</td>
            <td>检索表中的记录</td>
        </tr>
        <tr>
            <td>UPDATE</td>
            <td>修改现存表记录</td>
        </tr>
        <tr>
            <td>FILE</td>
            <td>读或写服务器上的文件</td>
        </tr>
        <tr>
            <td>PROCESS</td>
            <td>查看服务器中执行的线程信息或杀死线程</td>
        </tr>
        <tr>
            <td>RELOAD</td>
            <td>重载授权表或清空日志、主机缓存或表缓存。</td>
        </tr>
        <tr>
            <td>SHUTDOWN</td>
            <td>关闭服务器</td>
        </tr>
        <tr>
            <td>ALL</td>
            <td>所有；ALL PRIVILEGES同义词</td>
        </tr>
        <tr>
            <td>USAGE</td>
            <td>特殊的&#8220;无权限&#8221;权限</td>
        </tr>
    </tbody>
</table>
<br><strong>2.撤消用户权限:revoke<br></strong>上面我们创建plmm用户时给了她所有的权限,现在要撤消她更新(update)数据库的权限
<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%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">revoke</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">update</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">ON</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">.</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000">&nbsp;plmm</span><span style="COLOR: #008000">@localhost</span></div>
<img src ="http://www.blogjava.net/mashiguang/aggbug/128174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mashiguang/" target="_blank">mashiguang</a> 2007-07-07 01:03 <a href="http://www.blogjava.net/mashiguang/archive/2007/07/07/128174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>