精华内容
下载资源
问答
  • Oracle数据库字段问题

    千次阅读 2016-08-23 12:00:56
    Oracle数据库字段问题问题描述字段内容长度超4000最近项目中存在用某些字段存预处理sql语句,最初,项目此类型字段用varchar2(4000),但随着项目跟进到二期,牵连的表越来越多,存在预处理索引,中间临时表的...

    Oracle数据库大字段问题

    问题描述:字段内容长度超4000

    最近项目中存在用某些字段存预处理sql语句,最初,项目此类型字段用varchar2(4000),但随着项目跟进到二期,牵连的表越来越多,存在预处理索引,中间临时表的问题,预处理SQL字段长度超过4000。

    oracel默认varchar2类型是不能超过4000的

    我们都知道,oracel默认varchar2类型是不能超过4000的,如果类型超过4000的数据插入会自动转为long型数据插入,所以问题来了。

    所以我将表中需要超过4000内容的字段该文long型,接下来问题又来了。

    oracle一个表中最多只能有一个long型字段

    我们又知道,oracle一个表中最多只能有一个long型字段,所以这种解决方案又不适合解决业务需求了,经查询oracle推荐用clob字段类型存储。

    这里需要简单普及一下clob和blob的知识:CLOB(Character Large Object) 字符大对象,Blob(Binary Large Object)二进制大对象。

    由字面意思可以简单的辨别根据需求选择不同的对应类型,我们项目中这个字段全是文字形式的预处理sql,所以选择了clob,如果在遇到文件、视频、音频等可以选择blob哈。

    好吧,既然oracle推荐使用这种clob方式存储超4000的字符内容,那我就选择呗。

    接下来问题又来了:这是一种对象存储方式,如何存取呢?

    简单的举个栗子吧:

    为了使用方便我们肯定要进行数据封装,简单写个类似bean

    Class User

    Clob sqla;

    Clob sqlb;

    以及对应的set get方法。

    我们在遍历查询结果集ResultSet的时候将对应的结果user.setClob(rs.getClob(“sqla”));

    因为我们要用clob里面的内容信息,将Clob转为String使用呗

    这就对了塞。在user对象能存储进sqla这个clob对象了吧,是我们就将其取出来用呗,

    简单测试一下System.out.println(user.getSqla().toString());

    这我们都知道,这打印出来是对象地址对吧。

    查询了下怎么将clob转String,我在用的时候将clob转为String使用呗,就查了一下写工具类,方便使用的时候调用

    public static String clobToString(CLOB clob) throws SQLException, IOException { 
      result clob != null ? clob.getSubString(1, (int) clob.length()): null;
    
    }
    

    当jdbc返回给我user对象后我在使用的地方调用clobToString(user.getSqls()),抛出的异常是:连接数据库才能操作。

    写了一个stringToClob(String string) 方法返回Clob对象,关键代码如下:

    new javax.sql.rowset.serial.SerialClob(s.toCharArray());这就是将字符串变为char数组利用jdbcApi转换。
    
    在使用的地方调用同样报出需要连接数据库才能操作。
    
    所以经研究发现,在jdbc外面String与clob互转是会出错的。
    
    
    
    整文的核心:将转换代码在jdbc 操纵是使用。
    
    展开全文
  • 大家看到现有的大多数ERP系统向用户展示的都是中文的字段名,如果维护过ERP就会发现后台的数据库里面用的都是英文字段名的,这时就需要一个字段名别名转换处理,我有想过用[字段名 AS 别名]的方法不过我觉得好麻烦 ...

    大家看到现有的大多数ERP系统向用户展示的都是中文的字段名,如果维护过ERP就会发现后台的数据库里面用的都是英文字段名的,这时就需要一个字段名别名转换处理,我有想过用[字段名 AS 别名]的方法不过我觉得好麻烦 也写了好多的代码,后面我无意中看到了MSDN上的文档发现了DataTableMapping 
    以下代码示例创建一个 DataTableMapping(从 System.Data.Common 命名空间)并通过将其命名为“Table”来使其成为指定 DataAdapter 的默认映射。然后,该示例将查询结果中第一个表(Northwind 数据库的 Customers 表)中的列映射到 DataSet 的 Northwind Customers 表中的一组更为用户友好的名称。对于未映射的列,将使用数据源中的列名称。
    这里面的“一组更为用户友好的名称” 这几个字吸引了我的眼球。

    1.得到一个表包含:表名,表描述,字段名,字段描述等字段资料

            public DataTable GetColumnsInformation(bool IsHeader, params string[] TableNames)
            {
                using (SqlConnection sconn = new SqlConnection(ConnectionString.sqlconnection))
                {
                    StringBuilder sbTableInner = new StringBuilder();
                    DataSet ds = new DataSet();
                    DataTable dt = new DataTable();
                    if (!IsHeader)
                    {
                        for (int CurrentTable = 0; CurrentTable < TableNames.Length; CurrentTable++)
                        {
                            if (CurrentTable == TableNames.Length - 1)
                            {
                                sbTableInner.Append("@" + TableNames[CurrentTable]);
                            }
                            else
                            {
                                sbTableInner.Append("@" + TableNames[CurrentTable] + ",");
                            }
                        }
                    }
                    else
                    {
                        sbTableInner.Append("@" + TableNames[0]);
                    }
                    SqlCommand scomm = new SqlCommand("SELECT TableName = OBJECT_NAME(c.object_id)," +
                        "TableDecription = (SELECT a.[value] FROM sys.extended_properties a left JOIN  sysobjects b ON a.major_id=b.id WHERE b.name=OBJECT_NAME(c.object_id) and a.minor_id=0 )," +
                        "ColumnsName = c.name, Description = ex.value, ColumnType = t.name, " +
                        "Length = c.max_length, strCount = len(OBJECT_NAME(c.object_id)) " +
                        "FROM sys.columns c LEFT OUTER JOIN sys.extended_properties ex " +
                        "ON ex.major_id = c.object_id AND ex.minor_id = c.column_id AND ex.name = 'MS_Description' " +
                        "left outer join systypes t on c.system_type_id = t.xtype WHERE " +
                        "OBJECTPROPERTY(c.object_id, 'IsMsShipped') = 0 " +
                        "AND OBJECT_NAME(c.object_id) in (" + sbTableInner.ToString() + ") " +
                        "order by strCount", sconn);
                    if (!IsHeader)
                    {
                        for (int CurrentTable = 0; CurrentTable < TableNames.Length; CurrentTable++)
                        {
                            scomm.Parameters.AddWithValue("@" + TableNames[CurrentTable], TableNames[CurrentTable]);
                        }
                    }
                    else
                    {
                        scomm.Parameters.AddWithValue("@" + TableNames[0], TableNames[0]);
                    }
                    SqlDataAdapter sda = new SqlDataAdapter(scomm);
                    sda.MissingSchemaAction = MissingSchemaAction.AddWithKey;//添加必须的列和主键信息以完成架构
                    sda.Fill(ds, "FieldTable");
                    dt = ds.Tables[0];
                    dt.Columns.Add("InnerColumns");
                    dt.Columns.Add("InnerColumnsCN");
                    for (int CurrentRow = 0; CurrentRow < dt.Rows.Count; CurrentRow++)
                    {
                        dt.Rows[CurrentRow]["InnerColumns"] = dt.Rows[CurrentRow]["TableName"] + "." +
                            dt.Rows[CurrentRow]["ColumnsName"];
                        dt.Rows[CurrentRow]["InnerColumnsCN"] = dt.Rows[CurrentRow]["TableDecription"] + "-" +
                            dt.Rows[CurrentRow]["Description"];
    
                    }
                    return dt;
                }
            }
    2.利用DataTableMapping 实现,向用户显示友好的字段名称

            public DataTable Query(string tableName, string where, bool IsAlias = true)
            {
                DataTable dtColumns = new DataTable();
                dtColumns = bq.ColumnsInformation(false, new string[] { tableName });
                using (SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM " + tableName +
                    " WHERE InnerID LIKE @where ORDER BY RowID", ConnectionString.sqlconnection))
                {
                    SqlParameter parm = new SqlParameter("@where", "%" + where + "%");
                    sda.SelectCommand.Parameters.Add(parm);
                    DataTableMapping mapping = sda.TableMappings.Add(tableName, dtColumns.Rows[0]["TableDecription"].ToString());
                    for (int CurrentRow = 0; CurrentRow < dtColumns.Rows.Count; CurrentRow++)
                        mapping.ColumnMappings.Add(dtColumns.Rows[CurrentRow]["ColumnsName"].ToString(),
                            dtColumns.Rows[CurrentRow]["Description"].ToString());
                    DataSet ds = new DataSet();
                    if (IsAlias)
                    {
                        sda.Fill(ds, mapping.SourceTable);
                    }
                    else
                    {
                        sda.Fill(ds, mapping.DataSetTable);
                    }
                    DataTable dt = new DataTable();
                    dt = ds.Tables[0];
                    return dt;
                }
            }

    这边可以考虑多表关联的情况,留给大家去动动脑子吧!

    展开全文
  • 关于数据库Varchar字段类型长度设计问题 现代数据库一般都支持CHAR与VARCHAR字符型字段类型,CHAR是用来保存定长字符,存储空间的大小为字段定义的长度,与实际字符长度无关,当输入的字符小于定义长度时最后会补上...

    关于数据库Varchar字段类型长度设计问题


          现代数据库一般都支持CHAR与VARCHAR字符型字段类型,CHAR是用来保存定长字符,存储空间的大小为字段定义的长度,与实际字符长度无关,当输入的字符小于定义长度时最后会补上空格。VARCHAR是用来保留变长字符,在数据库中存储空间的大小是实际的字符长度,不会像CHAR一样补上空格,这样占用的空间更少。


          从以上特点来看,VARCHAR比CHAR有明显的优势,因此大部份数据库设计时都应该采用VARCHAR类型。那为什么还需要CHAR类型呢,个人认为有以下几个原因:
    1、为了跟以前版本的数据库进行一个兼容,因为很久以前数据库只支持CHAR类型,有些应用的业务逻辑也只是针对CHAR类型设计的,所以数据库软件也就一直保留CHAR类型。
    2、CHAR类型是定长的,一些数据库可以在每条记录中不存储字段长度信息,这样可以节省部份空间,也可以方便做一些内存对齐提高性能,但个人认为这带来的性能提升非常微小,至少ORACLE数据库是没有意义的。
    3、还有说法是有些数据经常修改,长度可能变化,会引起碎片,采用CHAR就不会产生碎片,这个说法比较多,但我认为既然长度会变化,那用VARCHAR更能节省内存与存储空间来提升性能,只要数据块预留的空间没有问题,采用VARCHAR性能更好。


           对于ORACLE数据库,我找不到充足的理由来使用CHAR类型,而且CHAR还会带来讨厌的空格,有些文章说MYSQL的MYISAM存储引擎在和长度固定的情况下CHAR比VARCHAR好,这个没有测试过,不太了解。


           由于VARCHAR是变长存储,那么很多人会有疑问,比如STATUS字段定义VARCHAR(10)与VARCHAR(1000)有什么区别,反正是变长的,存储空间都一样,省得以后要加长又要改变字段定义。 下面说一下我的理解:
    1、字段长度是数据库一种约束,可以保证进入数据库的数据符合长度要求,定义合理的字段长度可以减少一部份非法数据进入,比如:我们业务中STATUS只有‘NEW’,‘DELETE’,‘CLOSE’3种状态,使用VARCHAR(5)保存,这样可以有效的减少非法数据进入,定义合理的长度也可以让人容易理解字段的用途,试想一下,如果你所有的字符字段长度都是VARCHAR(4000)会是什么样的情况。


    2、VARCHAR的字段长度虽然对数据存储没有太大影响,但对特定的数据库还是有一些细微差别,比如MYSQL中定义的长度如果小于255,字段长度用1个字节表示,如果超过255,字段的长度将固定用2个字节表示。如果你的业务数据最大长度只有10,但定义长度为256则每条记录会多浪费了一个字节来存储长度。ORACLE没有这样的问题,它会根据每条记录字段的实际长度动态选择长度标识。


    3、字段定义的长度对索引也有较大影响。ORACLE对索引长度还是有一定限制,8i官方文档说明单条记录索引信息的长度不能超过数据块大小的40%,9i中是75%,实际上也差不多,具体可以见jametong的http://www.dbthink.com/?p=20这篇文档,里面有详细的测试结果。如果你的数据块大小是8K,那么索引字段的定义长度不能超过6398,比如,你要给表上2个VARCHAR(4000)字段建组合索引,创建时会直接报错。另外索引组织表及在线重建索引(因为中间会临时创建一个索引组织表)允许的索引信息长度更小,只能是数据块大小的40%,实际中8K的数据块大小,要使用在线重建索引,那定义的长度不能超过3215。从以上可以看出,数据块大小为8K时,设计字段时如果要定义为VARCHAR(4000),那这个字段就不能考虑建立索引,因为即使能建上,也不能做在线重定义操作,DBA要进行索引维护时只能停止应用,这将对系统的可用性产生较大影响。关于ORACLE索引长度限制测试的脚本如下:

    SQL> create table test1
      2  (
      3    c1 varchar2(4000),
      4    c2 varchar2(4000),
      5    c3 varchar2(4000)
      6  )
      7  ;
     
    Table created
    SQL> create index test1_ind1 on TEST1 (c1);
     
    Index created
    SQL> alter index test1_ind1 rebuild online;
     
    alter index test1_ind1 rebuild online
     
    ORA-00604: error occurred at recursive SQL level 1
    ORA-01450: maximum key length (3215) exceeded
    SQL> create index test1_ind2 on TEST1 (c2, c3);
     
    create index test1_ind2 on TEST1 (c2, c3)
     
    ORA-01450: maximum key length (6398) exceeded
     
    SQL> 

          关于ORACLE的索引长度还有一些特别的规则,比如自定义函数返回的字符定义长度固定是4000,所以要用自定义函数做函数索引需要特别注意一下,这可能会影响在线重建索引不能操作。
          内置函数的索引长度根据函数决定,比如UPPER这种不改变长度的就是索引字段定义的长度,SUBSTR这种会改变长度要根据函数截取长度决定。
          NUMBER类型字段的长度固定是22。
          DATA类型字段的长度固定是7。
          索引默认是升序,如果要降序建的索引长度是字段定义长度*1.5+1。


          MYSQL对索引长度限制比较复杂,每种版本及存储引擎都不一样,如下是MYSQL5.1.58测试的结果:
          INNODB的最大总长度是3072字节,单个字符字段是767字节,如果字段长度大于767则自动截取前767个字符。
          MYISAM最大总长度是1000字节,单个字符字段是1000字节。
          MEMORY的最大总长度是3072字节,单个字符字段是3072字节。


    4、变长字段定义的长度虽然不会影响服务器数据空间大小,但是对于客户端的内存有影响,因为客户端在用SQL从数据库读取数据时,首先会取到字段定义的长度,然后分配足够的内存,也就是说如果你定义的字段长度是1K,实际长度是10字节,要取1K记录,那客户端会分配1MB的内存, 但只保存了10K有效数据。这将会比较严重的浪费客户端内存。特别是一些高并发或者是取大量数据的场景,容易产生内存溢出。


    5、关于字段长度对齐的问题,有些设计人员喜欢定义字段的长度为4或者8的倍数,如16,32,64,128之类的,理由是可以做到内存对齐,对于这个问题我没有深入分析过,个人认为必要性不大,也没看到过这种优化能提升性能的案例。如果一个VARCHAR(1)定义为VARCHAR(4)反而浪费内存与存储,实际上我看到在ORACLE jdbc驱动中会将所有的字符类型数据保存在一个大的char[]中,把所有NUMBER与DATE类型放在另一个char[]中,这样整合后都不清楚如何内存对齐了。


          综上所述:VARCHAR类型字段长度不能随便定义,并不是越大越好,还是需要根据实际业务数据定义一个合适的长度。我个人对于一些可以完全预估的长度就按实际长度定义,比如年月、状态、标记之类的信息。对于不确定长度的业务数据如NAME、STYLE之类的信息定义一个合理值,如VARCHAR(20),VARCHAR(30) 之类 。对于描述性或备注性的信息,这些字段也确定不会有索引,长度也不可预知,所以留更大的长度,避免以后经常进行长度调整,如VARCHAR(1024),或者直接VARCHAR2(4000) 。

     我的新浪微博:http://weibo.com/yzsind

    展开全文
  • 当前数据库的所有字段都保留在syscolumns里面。syscolumns ( name sysname, --字段名称 id int, --该字段所属的表的ID xtype tinyInt, --该字段类型,关联sysTypes表 length smallint, --该字段物理存储长度 .....

    当前数据库的所有字段都保留在syscolumns里面。

    syscolumns (

      name     sysname,   --字段名称

      id       int,        --该字段所属的表的ID

      xtype    tinyInt,    --该字段类型,关联sysTypes表

      length   smallint,   --该字段物理存储长度

      ...

    )

    使用方法是:

    Select name from syscolumns Where ID=OBJECT_ID('表名')

    或者做为一个判断的条件:

    Select 1 from syscolumns Where ID=OBJECT_ID('表名') and name='(列名)'。

    我的实例:(为stu表添加一个stu_nm字段)

    if exists(select 1 from syscolumns where id=object_id('stu') and name='stu_nm')

       alter table stu alter column stu_nm int null

    else

       alter table stu add stu_nm int null

    go

    以上程序在运行多次也不会出现系统错误,所以在发布使用时特别的方便。

    另有:

     ncsyscolumns:包括id、name、number

     syscolumns:包括id、colid、number

    select   *   from   yourdb.INFORMATION_SCHEMA.KEY_COLUMN_USAGE   

     

      KEY_COLUMN_USAGE的结构   

     

      列名   数据类型   描述     

      CONSTRAINT_CATALOG   nvarchar(128)   约束限定符     

      CONSTRAINT_SCHEMA   nvarchar(128)   约束所有者名称     

      CONSTRAINT_NAME   nvarchar(128)   约束名     

      TABLE_CATALOG   nvarchar(128)   表限定符     

      TABLE_SCHEMA   nvarchar(128)   表所有者名称     

      TABLE_NAME   nvarchar(128)   表名     

      COLUMN_NAME   nvarchar(128)   列名     

      ORDINAL_POSITION   int   列顺序位置     

     

      sysconstraints也是系统表。   

      结构   

     

      列名   数据类型   描述     

      constid   int   约束号。     

      id   int   拥有该约束的表   ID。     

      colid   smallint   在其上定义约束的列   ID,如果是表约束则为   0。     

      spare1   tinyint   保留。     

      status   int   位图指示状态。可能的值包括:     

                  1   =   PRIMARY   KEY   约束。   

                  2   =   UNIQUE   KEY   约束。   

                  3   =   FOREIGN   KEY   约束。   

                  4   =   CHECK   约束。     

                  5   =   DEFAULT   约束。   

                  16   =   列级约束。   

                  32   =   表级约束。     

      actions   int   保留。     

      error   int   保留。

    展开全文
  • 数据库自定义字段及相关检索

    千次阅读 2010-03-31 17:22:00
    应用开发过程中,有时候会有用户可以自定义字段的要求。比如我们对于人员信息的维护提供了姓名,性别,出生日期,备注等基本信息,但客户可能希望自己可以自定义一些字段来保存特定的信息,并对这些信息进行检索。这...
  • thinkPHP 查询数据库字段

    千次阅读 2017-05-04 17:44:21
    * 查询指定的字段是否存在表中 * @param type $field 字段名称 * @return void * @access protected */ protected function issetField($field){ $fields=$this->model->getDbFields(); return array_search($field,...
  • 如何得到数据库中所有表字段及字段中文描述以下资料,通过csdn的一位师兄从SQL版主那得到:sql中SELECT (case when a.colorder=1 the...
  • sql语句在数据库里面可以正常查询结果,所有字段都有值,但是在代码里面一跑,返回的数据有几个字段是null 原因: 数据库中的字段有下划线,eg:role_id 解决办法: 去掉字段的下划线就可以了 ...
  • 数据库中的表名就是这个属性的名字,但是有前提,是你没有定义@Table这个属性") 2、@Table 是用来表示这个类(实体)对应的数据库表的信息 有三个属性:1、name 2、catalog 3、schema 这三个属性都是可选的 ...
  • MYSQL数据库字段命名及设计规范

    万次阅读 2018-01-12 09:12:01
    1. 设计原则 ...简单来说,遵守3NF标准的数据库的表设计原则是:“OneFactinOnePlace”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下
  • 数据库表右键 有一个对象信息,然后点进去里面有一个DDL,点击进去就可以看到数据库表数据和数据库字段全部注解了!
  •  有时候在项目中会遇到数据库字段名称与实体类属性名称取得不一样的情况,如下:  数据库里的数据为:  此时,如果我们查询该表的某条数据,ProjectMapper.xml代码为 &lt;select id="...
  • 数据库字段命名及设计规范

    千次阅读 2015-03-17 09:26:30
    转至元数据起始 ...数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但 ...简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当
  • mysql数据库中表时间的字段的数据类型时varchar型,现在需要提取写入到数据库中的最近的50条数据,但是时间格式不一致,即有些是含有时刻信息的,有些是不含时刻只有日期的,这种不含时刻只有日期的时间表示这个日期...
  • 在MySQL数据库中查找字段所属的表

    千次阅读 2017-06-08 13:00:35
    MYSQL里面需要根据某个字段名,查询该字段名所在的表 在MYSQL 5.0之后的版本可以通过information_schema库当中的columns表来完成 如下代码来实现:use information_schema; select * from columns where column_name...
  • 无法导出字段描述。 导出成功 方法二 SAP→SE15→ABAP字典→表字段→查找表字段,输入表名后执行→完整列表→编辑→列表→导出本地文件(未转换的) 输出结果为.TXT文本文件,将文本文件导入Excel即可批量复制...
  • spring data jpa 框架在实体类中添加非数据库字段的属性 Spring-data-jpa表实体的字段和表的字段是一一对应的。比如,那么,如果我在查询时,想在表字段的基础上添加几个返回的字段,怎么办? @Transient privite ...
  • 问题描述:开发一个统计接口,里面用到了大量的sum函数,数据库中没有对应的字段,那这类值是如何通过resultMap映射呢?? 数据库有的字段,可以通过 resultMap 映射得到,只需要将数据库字段,数据类型,实体类字段...
  • 文章目录如果我们想要查看数据库里面所有的表名以及其对应的描述的话请使用:如果我们想要看哪些表里面有相关的字段名,那么请使用: 如果我们想要查看数据库里面所有的表名以及其对应的描述的话请使用: select ...
  • db2查询数据库的某个字段

    千次阅读 2017-09-06 08:46:58
    SELECT TABSCHEMA,TABNAME FROM SYSCAT.COLUMNS WHERE COLNAME='COLNAME';
  • ﹙1﹚ 问题描述:在修改了表名称或者属性名称之后再做同步经常会出现重新新建该字段,并删除原来字段的现象. 1﹚ 这样造成的结果是所有的原来的数据库中存在的值会随同这边的同步一起被删除 2﹚ 而如果是主键等字段...
  • ResultMap ---解决Mybatis中属性名和数据库字段名不一致问题
  • 最后发现是pojo实体类里面定义的该字段名与数据库中的字段名不对应。 解决办法 将pojo实体类中的字段名与数据库字段名修改至一致。 或者使用驼峰命名的规则,并在配置文件中添加开启驼峰命名的设置 ...
  • Django数据库字段类型(Field types) AutoField class AutoField(**options) 它是一个根据 ID 自增长的 IntegerField 字段。通常,你不必直接使用该字段。如果你没在别的字段上指定主键,Django 就

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 93,229
精华内容 37,291
关键字:

数据库里面的字段描述