发布新日志

  • mysql用户远程登录与分析

    2012-07-19 10:32:41

    创建远程登陆用户并授权
    > grant all PRIVILEGES on bugtracker.* to mantis@'192.168.2.59' identified by '123456';
    上面的语句表示将 bugtracker 数据库的所有权限授权给 mantis 这个用户,允许 mantis 用户在 192.168.2.59 这个 IP 进行远程登陆,并设置 mantis 用户的密码为 123456 。

    下面逐一分析所有的参数:

    all PRIVILEGES 表示赋予所有的权限给指定用户,这里也可以替换为赋予某一具体的权限,例如:select,insert,update,delete,create,drop 等,具体权限间用“,”半角逗号分隔。

    bugtracker.* 表示上面的权限是针对于哪个表的,bugtracker 指的是数据库,后面的 * 表示对于所有的表,由此可以推理出:对于全部数据库的全部表授权为“*.*”,对于某一数据库的全部表授权为“数据库名.*”,对于某一数据库的某一表授 权为“数据库名.表名”。

    mantis 表示你要给哪个用户授权,这个用户可以是存在的用户,也可以是不存在的用户。

    192.168.2.59 表示允许远程连接的 IP 地址,如果想不限制链接的 IP 则设置为“%”即可。

    123456 为用户的密码。

    执行了上面的语句后,再执行下面的语句,方可立即生效。

    > flush privileges;

    在数据库内添加了一个帐号:
    create databases firstdb;
    grant all on firstdb.* to ‘firstdb’@’’ identified by ‘xxxxx’;
    flush privileges;
    (用firstdb帐号登录能看到firstdb数据库,没想到发生了下面的故事,继续看,你也会成长的。)
    我这样登录,mysql –ufirstdb –p  输入密码,可提示:
    [root@wikiob ~]# mysql -ufirstdb -p
    Enter password:
    ERROR 1045 (28000): Access denied for user 'firstdb'@'localhost' (using password: YES)
    我的密码,肯定没有问题,通过提示分析,我现在用的登录是localhost+firstdb
    ,但我定义的是任意主机,感觉没有匹配我想要的情况。
    分析:
    看下mysql.user表的情况
    (root@badboy:)[(none)]>select host,user,password from mysql.user;
    +---------------------+---------+-------------------------------------------+
    | host                | user    | password                                  |
    +---------------------+---------+-------------------------------------------+
    | localhost           | root    | D8BF0760B25D47A3EBF34F |
    | wikiob.badboy.com | root    | 0760B25D47A3EBF34F |
    | 127.0.0.1           | root    | 760B25D47A3EBF34F |
    | localhost           |         |                                           |
    | wikiob.badboy.com |         |                                           |
    | localhost           | mantis  | 36D0D144BDC21263CCFF |
    | localhost           | dvbbs   |D1C26E56446E9DE2F52813 |
    | 192.168.1.162       | root    | 4D8BF0760B25D47A3EBF34F |
    | 192.168.2.215      | root    | 4D8BF0760B25D47A3EBF34F |
    |                     | firstdb | 18BB99005ADCA2EC9D1E19 |
    | localhost           | test_db | 2A1F959FD02F964C7AF4CFC29 |
    +---------------------+---------+-------------------------------------------+
    11 rows in set (0.00 sec)
    我们根据mysql在加载授权表时,要排序,最终排序结果:
    +---------------------+---------+-------------------------------------------+
    | host                | user    | password                                  |
    +---------------------+---------+-------------------------------------------+
    | localhost           | root    | D8BF0760B25D47A3EBF34F |
    | localhost           | mantis  | 36D0D144BDC21263CCFF |
    | localhost           | dvbbs   |D1C26E56446E9DE2F52813 |
    | localhost           | test_db | 2A1F959FD02F964C7AF4CFC29 |
    | localhost           |         |                                           |
    | wikiob.badboy.com | root    | 0760B25D47A3EBF34F |
    | wikiob.badboy.com |         |                                           |
    | 127.0.0.1           | root    | 760B25D47A3EBF34F |
    | 192.168.1.162       | root    | 4D8BF0760B25D47A3EBF34F |
    | 192.168.2.215      | root    | 4D8BF0760B25D47A3EBF34F |
    |                     | firstdb | 18BB99005ADCA2EC9D1E19 |
    +---------------------+---------+-------------------------------------------+
     
    这样的话,我刚刚输入的mysql –ufirstdb –p就匹配了第5行,也就是说,客户端是localhost,帐号是任意,密码为空。
    根据前面的判断,我不输入密码试下;
    [root@wikiob ~]# mysql -ufirstdb -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 18
    Server version: 5.1.30-log Source distribution
     
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
     
    (wiki@badboy:)[(none)]>
    好,可以进去了。我现在来看看,我的登录帐号信息:
    (firstdb@badboy:)[(none)]>select CURRENT_USER();
    +----------------+
    | CURRENT_USER() |
    +----------------+
    | @localhost     |
    +----------------+
    1 row in set (0.00 sec)
    看到没,是匿名帐号,和我前面判断的没错,那看下这个帐号下的数据库有哪些….
    (firstdb@badboy:)[(none)]>show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | test               |
    | test_db            |
    +--------------------+
    3 rows in set (0.00 sec)
    这三个数据库是怎么在匿名帐户下呢?继续分析…
    看下mysql.db
    (root@badboy:)[(none)]>select host,user,db from mysql.db;         
    +-----------+---------+---------+
    | host      | user    | db      |
    +-----------+---------+---------+
    |           | firstdb | firstdb |
    | %         |         | test    |
    | %         |         | test\_% |
    | localhost | dvbbs   | discuz  |
    | localhost | mantis  | mantis  |
    | localhost | test_db | test_db |
    +-----------+---------+---------+
    6 rows in set (0.00 sec)
    再排序一次:
    (root@badboy:)[(none)]>select host,user,db from mysql.db;         
    +-----------+---------+---------+
    | host      | user    | db      |
    +-----------+---------+---------+
    | localhost | dvbbs   | discuz  |
    | localhost | mantis  | mantis  |
    | localhost | test_db | test_db |
    |           | firstdb | firstdb |
    | %         |         | test    |
    | %         |         | test\_% |
    +-----------+---------+---------+
    6 rows in set (0.00 sec)
    根据前面登录的是匿名用户,那么只能是最后两行是匹配我的show databases;

    mysql添加远程用户或允许远程访问三种方法
    用root用户登陆,然后:
    grant all privileges on *.* to 创建的用户名 @"%" identified by "密码";
    flush privileges;   * 刷新刚才的内容*
    格式:grant 权限 on 数据库教程名.表名 to 用户@登录主机 identified by "用户密码";
                @ 后面是访问mysql的客户端ip地址(或是 主机名) % 代表任意的客户端,如果填写 localhost 为
    本地访问(那此用户就不能远程访问该mysql数据库了)。
    同时也可以为现有的用户设置是否具有远程访问权限。如下:
    use mysql;
    update db set host = '%' where user = '用户名'; (如果写成 host=localhost 那此用户就不具有远程访问权限)
    flush privileges;
    grant all privileges on *.* to 'myuser'@'%' identified by 'mypassword' with grant option;
     
     
    方法二
    1.  使用grant语句添加:首先在数据库本机上用root用户
    登录mysql(我是用远程控制linux服务器,相当于在服务器本机登录mysql了),然后输入:
    mysql>grant all privileges on *.* to admin@localhost identified by 'something' with grant option;
    添加一个用户admin并授权通过本地机(localhost)访问,密码"something"。
     mysql>grant all privileges on *.* to admin@"%" identified by 'something' with grant option;
    添加一个用户admin并授权可从任何其它主机发起的访问(通配符%)。使用这一条语句即可。
    2.使用insert语句:
    mysql>insert into user values('%','admin',password('something'), 'y','y','y','y','y','y',
    'y','y','y','y','y','y','y','y')
       用户信息可在mysql数据库中的users表中查看,这里不在介绍了就。数清y的个数哦。
       好了,使用admin帐号连接试试看,我是屡试屡成功哦,呵呵!
    方法三
    添加远程用户admin密码为password 
    grant all privileges on *.* to admin@localhost identified by 'password' with grant option 
    grant all privileges on *.* to admin@"%" identified by 'password' with grant option

    由于项目开发的要求数据库的设计不得不用远程模式。但是数据库的远程设置并没那么简单,该项目的数据库是mysql5.0。刚开始以为只要装了数据库服务器就可以进行远程链接了,但是mysql的设置是为了用户的安全,系统默认的设置是不允许远程用户连接,只能本地的用户连接。只要我们设置下系统的管理员用户的host这一项的值就可以给远程的用户访问了。

     
  • Oracle命令行工具基本操作及SQL 命令

    2012-07-13 11:39:21

    2. SQL*PLUS
    这是个Oracle提供的最常用,也是最好用的sql命令执行工具。

    2.1.1. 登录
    C:> sqlplusw
    C:> sqlplus /nolog
    SQL> conn username/password@Oranet
    如,system登录
    SQL> conn system/systempwd@whfc
    如果要行一些只有sysdba才能执行的命令,必须以sysdba特权登录:
    SQL> conn sys/syspwd@whfc as sysdba

    2.1.2. 创建表空间
    必须有CREATE TABLESPACE 特权的用户才能创建表空间,比如system
    和sys用户。
    SQL> conn system@whfc01
    请输入口令:
    已连接。
    SQL> create tablespace ts_test datafile '/data2/oradata/ciis/ts_test01.dbf' size
    10m ;
    表空间已创建。
    2.1.3. 添加数据文件
    SQL> alter tablespace ts_test add datafile '/data2/oradata/ciis/ts_test02.dbf' size
    10m ;
    表空间已更改。
    2.1.4. 查看表空间大小
    SQL> DESC DBA_DATA_FILES
    名称 是否为空? 类型
    -------------------- -------- --------------
    FILE_NAME VARCHAR2(513)
    FILE_ID NUMBER
    TABLESPACE_NAME VARCHAR2(30)
    BYTES NUMBER
    BLOCKS NUMBER
    STATUS VARCHAR2(9)
    RELATIVE_FNO NUMBER
    AUTOEXTENSIBLE VARCHAR2(3)
    MAXBYTES NUMBER
    MAXBLOCKS NUMBER
    INCREMENT_BY NUMBER
    USER_BYTES NUMBER
    USER_BLOCKS NUMBER
    SQL> SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 M
    2 FROM DBA_DATA_FILES
    3 GROUP BY TABLESPACE_NAME;
    TABLESPACE_NAME M
    -------------------- ----------
    DEVELOP1 8000
    DEVELOP2 14336
    DEVELOPINDEX 4106
    DRSYS 20
    EXAMPLE 145.625
    INDX 25
    ODM 20
    SYSTEM 1024
    TOOLS 10
    TS_CI_13 4094
    TS_CI_32 4094
    TS_CI_33 2047
    TS_II_13 2047
    TS_II_32 2047
    TS_PI_1301 2047
    TS_PI_1302 2047
    TS_PI_3201 2047
    TS_TEST 20
    UNDOTBS1 5048
    USERS 25
    XDB 38.125
    已选择21 行。
    SQL> SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 M
    2 FROM DBA_DATA_FILES
    3 WHERE TABLESPACE_NAME='TS_TEST'
    4 GROUP BY TABLESPACE_NAME;
    TABLESPACE_NAME M
    -------------------- ----------
    TS_TEST 20
    2.1.5. 查看自由(剩余)表空间大小
    SQL> desc DBA_FREE_SPACE
    名称 是否为空? 类型
    ---------------------- -------- ---------------
    TABLESPACE_NAME VARCHAR2(30)
    FILE_ID NUMBER
    BLOCK_ID NUMBER
    BYTES NUMBER
    BLOCKS NUMBER
    RELATIVE_FNO NUMBER
    SQL> SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 M
    2 FROM DBA_FREE_SPACE
    3 WHERE tablespace_name='TS_TEST'
    4 GROUP BY TABLESPACE_NAME;
    TABLESPACE_NAME M
    -------------------- ----------
    TS_TEST 19.6875
    2.1.6. 创建新用户
    SQL> create user test identified by test default tablespace ts_test temporary
    tablespace temp;
    用户已创建
    2.1.7. 给用户角色特权
    SQL> grant connect,resource to test;
    授权成功。
    2.2. 用户数据对象
    2.2.1. 查看当前用户表名
    SQL> select * from tab;
    TNAME TABTYPE CLUSTERID
    ------------------------------ ------- ----------
    BONUS TABLE
    CC TABLE
    DEPT TABLE
    EMP TABLE
    EMP_IOT TABLE
    SALGRADE TABLE
    已选择6 行。
    2.2.2. 创建数据表
    SQL> CREATE TABLE book (
    2 bookid NUMBER(18),
    3 bookname VARCHAR2(80) NOT NULL,
    4 author VARCHAR2(40),
    5 price NUMBER(6,2)
    6 );
    表已创建。
    2.2.3. 创建索引
    SQL> CREATE INDEX idx_book_bookid ON book(bookname);
    索引已创建。
    2.2.4. 创建主键约束
    SQL> ALTER TABLE book ADD CONSTRAINT pk_book_bookid PRIMARY
    KEY (bookid);
    表已更改。
    2.2.5. 显示表结构
    SQL> desc book
    名称 是否为空? 类型
    ------------------------------ -------- ----------------------
    BOOKID NOT NULL NUMBER(18)
    BOOKNAME NOT NULL VARCHAR2(80)
    AUTHOR VARCHAR2(40)
    PRICE NUMBER(6,2)
    2.2.6. 查看表的索引
    SQL> column index_name format a30
    SQL> select table_name, index_name from user_indexes;
    TABLE_NAME INDEX_NAME
    ------------------------------ ------------------------
    BOOK IDX_BOOK_BOOKNAME
    BOOK PK_BOOK_BOOKID
    2.2.7. 查看索引列
    SQL> select table_name, index_name, column_name, column_position
    from user_ind_columns;
    TABLE_NAME INDEX_NAME COLUMN_NAME COLUMN_POSITION
    -------------- ------------------- -------------- ---------------
    BOOK PK_BOOK_BOOKID BOOKID 1
    BOOK IDX_BOOK_BOOKNAME BOOKNAME 1
    2.2.8. 查看数据段占空间大小
    数据段包括表、索引、分区等。
    SQL> desc user_segments
    名称 是否为空? 类型
    -------------------- -------- ------------------------
    SEGMENT_NAME VARCHAR2(81)
    PARTITION_NAME VARCHAR2(30)
    SEGMENT_TYPE VARCHAR2(18)
    TABLESPACE_NAME VARCHAR2(30)
    BYTES NUMBER
    BLOCKS NUMBER
    EXTENTS NUMBER
    INITIAL_EXTENT NUMBER
    NEXT_EXTENT NUMBER
    MIN_EXTENTS NUMBER
    MAX_EXTENTS NUMBER
    PCT_INCREASE NUMBER
    FREELISTS NUMBER
    FREELIST_GROUPS NUMBER
    BUFFER_POOL VARCHAR2(7)
    SQL> select segment_name,segment_type,bytes from user_segments;
    SEGMENT_NAME SEGMENT_TYPE BYTES
    ------------------------------ --------------- ---------
    BOOK TABLE 65536
    IDX_BOOK_BOOKNAME INDEX 65536
    PK_BOOK_BOOKID INDEX 65536

    2.2.9. 查看表占空间大小
    SQL> select segment_name,segment_type,bytes from user_segments where
    segment_type='TABLE';
    SEGMENT_NAME SEGMENT_TYPE BYTES
    ------------------------------ ---------------- --------
    BOOK TABLE 65536 


     

    经典的SQL语句

    1. 行列转换--普通

    假设有张学生成绩表(CJ)如下
    Name    Subject     Result
    张三    语文        80
    张三    数学        90
    张三    物理        85
    李四    语文        85
    李四    数学        92
    李四    物理        82

    想变成    
    姓名   语文   数学   物理
    张三   80     90     85
    李四   85     92     82

    declare @sql varchar(4000)
    set @sql = 'select Name'
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
     from (select distinct Subject from CJ) as a
    select @sql = @sql+' from test group by name'
    exec(@sql)

    2. 行列转换--合并

    有表A,
     id pid
     1   1
     1   2
     1   3
     2   1
     2   2
     3   1
    如何化成表B:
     id pid
      1  1,2,3
      2  1,2
      3  1

    创建一个合并的函数
    create function fmerg(@id int)
    returns varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    select @str=@str+','+cast(pid as varchar) from 表A where id=@id
    set @str=right(@str,len(@str)-1)
    return(@str)
    End
    go

    --调用自定义函数得到结果
    select distinct id,dbo.fmerg(id) from 表A

    3. 如何取得一个数据表的所有列名

    方法如下:先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。
    SQL语句如下:
    declare @objid int,@objname char(40)
    set @objname = 'tablename'
    select @objid = id from sysobjects where id = object_id(@objname)
    select 'Column_name' = name from syscolumns where id = @objid order by colid

    是不是太简单了? 呵呵 不过经常用阿.

    4. 通过SQL语句来更改用户的密码

    修改别人的,需要sysadmin  role    
    EXEC  sp_password  NULL,  'newpassword',  'User'

    如果帐号为SA执行EXEC  sp_password  NULL,  'newpassword',  sa 

    5. 怎么判断出一个表的哪些字段不允许为空?

    select  COLUMN_NAME  from  INFORMATION_SCHEMA.COLUMNS  where  IS_NULLABLE='NO'  and  TABLE_NAME=tablename 

    6. 如何在数据库里找到含有相同字段的表?
    a. 查已知列名的情况
    SELECT  b.name  as  TableName,a.name  as  columnname  
    From  syscolumns    a  INNER  JOIN    sysobjects  b    
    ON  a.id=b.id    
    AND  b.type='U'    
    AND  a.name='你的字段名字' 

    b. 未知列名查所有在不同表出现过的列名
    Select  o.name  As  tablename,s1.name  As  columnname  
    From  syscolumns  s1,  sysobjects  o  
    Where  s1.id  =  o.id  
       And  o.type  =  'U'  
       And  Exists  (  
           Select  1  From  syscolumns  s2    
           Where  s1.name  =  s2.name    
           And  s1.id  <>  s2.id  
           )

    7. 查询第xxx行数据

    假设id是主键:  
    select  *  
    from  (select  top  xxx  *  from  yourtable)  aa  
    where  not  exists(select  1  from  (select  top  xxx-1  *  from  yourtable)  bb  where  aa.id=bb.id)
      
    如果使用游标也是可以的  
    fetch  absolute  [number]  from  [cursor_name]  
    行数为绝对行数

    8. SQL Server日期计算
    a. 一个月的第一天
    SELECT  DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0)  
    b. 本周的星期一
    SELECT  DATEADD(wk,  DATEDIFF(wk,0,getdate()),  0) 
    c. 一年的第一天
    SELECT  DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)  
    d. 季度的第一天
    SELECT  DATEADD(qq,  DATEDIFF(qq,0,getdate()),  0)  
    e. 上个月的最后一天 
    SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0))  
    f. 去年的最后一天
    SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)) 
    g. 本月的最后一天
    SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0))  
    h. 本月的第一个星期一
    select  DATEADD(wk,  DATEDIFF(wk,0,                                                          
                                   dateadd(dd,6-datepart(day,getdate()),getdate())        
                                                                                                     ),  0)      
    i. 本年的最后一天
    SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate())+1,  0))。

    1. 说明:复制表(只复制结构,源表名:a,新表名:b)

    SQL: select * into b from a where 1<>1;

    2. 说明:拷贝表(拷贝数据,源表名:a,目标表名:b) 

    SQL: insert into b(a, b, c) select d, e, f from b;

    3. 说明:显示文章、提交人和最后回复时间

    SQL: select a.title, a.username, b.adddate 
         from table a,(
              select max(adddate) adddate 
              from table where table.title=a.title) b 
     

    4. 说明:外连接查询(表名1:a,表名2:b)

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f 
         from a LEFT OUT JOIN b ON a.a = b.c;  

    5. 说明:日程安排提前五分钟提醒

    SQL: select * 
         from 日程安排 
         where datediff(''minute'', f开始时间, getdate())>5   
      

    6. 说明:两张关联表,删除主表中已经在副表中没有的信息

    SQL: delete from info 
         where not exists(
               select * 
               from infobz 
               where info.infid=infobz.infid );


    7. 说明:——

    SQL: SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE 
         FROM TABLE1,(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE 
                      FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND 
                            FROM TABLE2 
                            WHERE TO_CHAR(UPD_DATE,''YYYY/MM'') = 
                                  TO_CHAR(SYSDATE, ''YYYY/MM'')) X, 
                           (SELECT NUM, UPD_DATE, STOCK_ONHAND 
                            FROM TABLE2 
                            WHERE TO_CHAR(UPD_DATE,''YYYY/MM'') = 
                                  TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, ''YYYY/MM'') 
                                  || ''/01'',''YYYY/MM/DD'') - 1, ''YYYY/MM'') ) Y, 
                       WHERE X.NUM = Y.NUM (+)AND X.INBOUND_QTY 
                                     + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B 
                       WHERE A.NUM = B.NUM; 
    8. 说明:——

    SQL: select * 
         from studentinfo 
         where not exists(select * from student where studentinfo.id=student.id) 
               and 系名称=''"&strdepartmentname&"''
               and 专业名称=''"&strprofessionname&"''

  • oracle数据类型测试参考

    2012-07-13 10:24:23

    在Oracle中Number类型可以用来存储0,正负定点或者浮点数,可表示的数据范围在1.0 * 10(-130) —— 9.9...9 * 10(125) {38个9后边带88个0}的数字,当Oracle中的数学表达式的值>=1.0*10(126)时,Oracle就会报错。
    Number的数据声明如下:
    表示                 作用                说明
    Number(p, s)        声明一个定点数        p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,scale的取值范围为-84到127
    Number(p)        声明一个整数        相当于Number(p, 0)
    Number        声明一个浮点数        其精度为38,要注意的是scale的值没有应用,也就是说scale的指不能简单的理解为0,或者其他的数。

    定点数的精度(p)和刻度(s)遵循以下规则:
           当一个数的整数部分的长度 > p-s 时,Oracle就会报错
           当一个数的小数部分的长度 > s 时,Oracle就会舍入。
           当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
           当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入


    oracle字段类型NUMBER(38,3),括号中两个数字分别表示什么?

    38代表总位数 3代表小数点后面位数
    number(p,s)
    p:1~38
    s:-84~127
    p>0,对s分2种情况:1. s>0
    精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;如果s>p,小数点右边至少有s-p个0填充。
    2. s<0
    精确到小数点左边s位,并四舍五入。然后检验有效数位是否<=p+|s|

    123.2564 NUMBER 123.2564

    1234.9876 NUMBER(6,2) 1234.99

    12345.12345 NUMBER(6,2) Error

    1234.9876 NUMBER(6) 1235

    12345.345 NUMBER(5,-2) 12300

    1234567 NUMBER(5,-2) 1234600

    12345678 NUMBER(5,-2) Error

    123456789 NUMBER(5,-4) 123460000

    1234567890 NUMBER(5,-4) Error

    12345.58 NUMBER(*, 1) 12345.6

    0.1 NUMBER(4,5) Error

    0.01234567 NUMBER(4,5) 0.01235

    0.09999 NUMBER(4,5) 0.09999




    Oracle数据库中的varchar2类型
    我Oracle数据库中定义了一个name  varchar2(50) null;
    我想知道name这个字段能输入多少个字或是字母,数字,特殊字符。varchar2(50)是什么意思?有什么输入限制?
    我来帮他解答
    2010-5-22 13:33 满意回答
    varchar2(50) 表示该字段类型为varchar2类型,长度为50,可以存单字节字符50个,如字母、数字等,可以存储双字节字符25个,如汉字。
    varchar2是Oracle中特有的一种数据库类型,与varchar的区别在于

    varchar 存贮为定长
    varchar2 存贮为不定长。

    即:如果定义了一个字段为varchar(10),那么存贮到这个字段的值,不管有没有10个字符,都存贮为10个字符长度,不足的部份补足空格。而如果定义为varchar2(10),那么按实际值来存贮,即字段值有多长存贮为多长,不补足空格。这样,在进行字段值的比较时,varchar2显然比 varchar字段简单且不易出错。另外,在进行存贮时,varchar2 也比varchar节约存贮空间。因此建议用varchar2来代替varchar类型。除非你能确定这个字段存贮内容总是那么长,那么varchar字段也是可以用的。

    varchar2的最大长度是4000



    CHAR的长度是固定的,VARCHAR2的长度是可以变化的, 存储字符串“ABC",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储.
    VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些
  • oracle 查看字符集与修改字符集

    2012-07-13 10:17:42

    oracle字符集
    Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。   
    影响oracle数据库字符集最重要的参数是NLS_LANG参数。
    它的格式如下:   NLS_LANG = language_territory.charset   
    它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。
    其中:   
    Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK   
    从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
    所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
    select userenv(‘language’) from dual;
     
    1、查看字符集
     
           数据库服务器字符集 select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。
        
      
      客户端字符集环境 select * from nls_instance_parameters,其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
      
      会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
      
      客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
      
      字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
     
     
    2、修改数据库的字从字符集

        SQL> SHUTDOWN IMMEDIATE;  
        SQL> STARTUP MOUNT; 
        SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; 
        SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
        SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
        SQL> ALTER DATABASE OPEN; 
        SQL> ALTER DATABASE CHARACTER SET ZHS16GBK; --AL32UTF8
        SQL> SHUTDOWN IMMEDIATE;
        SQL> STARTUP;
Open Toolbar