精华内容
下载资源
问答
  • 数据库字段的长度 作用

    万次阅读 2017-08-04 10:09:55
    数据库字段的长度 指的是字节 作用:如果不指定长度,数据库在存储的时候都必须给每个字段预留最大的存储空间,这样极大的浪费了空间,也加大了数据库本身管理的难度。字段类型长度应设置为保证正常使用需求下的...

    数据库字段的长度    指的是字节


    作用:如果不指定长度,数据库在存储的时候都必须给每个字段预留最大的存储空间,这样极大的浪费了空间,也加大了数据库本身管理的难度。字段类型长度应设置为保证正常使用需求下的最小长度


    char、varchar、text和nchar、nvarchar、ntext的区别

    1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

     

    2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

     

    3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

     

    4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar 数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。


    char、varchar、text、ntext、bigint、int、smallint、tinyint和bit的区别及数据库的数据类型

     

    Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节

    char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!

    ntext

    可变长度 Unicode 数据的最大长度为 230 - 1 (1,073,741,823) 个字符。存储大小是所输入字符个数的两倍(以字节为单位)。ntext 在 SQL-92 中的同义词是 national text。

     

    text

    服务器代码页中的可变长度非 Unicode 数据的最大长度为 231-1 (2,147,483,647) 个字符。当服务器代码页使用双字节字符时,存储量仍是 2,147,483,647 字节。存储大小可能小于 2,147,483,647 字节(取决于字符串)。

    bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据,存储大小为 8 个字节。

     

    int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据,存储大小为 4 个字节。

     

    smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据,存储大小为 2 个字节。

     

    tinyint:从0到255的整数数据,存储大小为 1 字节。

     

    bit:1或0的整数数据,存储大小为 1 字节。

    其中常用的数字型所占用的字节数如下,根据字节数即可算出表示的范围了
    TINYINT 1 字节
    SMALLINT 2 个字节
    MEDIUMINT 3 个字节
    INT 4 个字节
    INTEGER 4 个字节
    BIGINT 8 个字节
    FLOAT(X) 4 如果 X < = 24 或 8 如果 25 < = X < = 53
    FLOAT 4 个字节
    DOUBLE 8 个字节
    DOUBLE PRECISION 8 个字节
    REAL 8 个字节
    DECIMAL(M,D) M字节(D+2 , 如果M < D)
    NUMERIC(M,D) M字节(D+2 , 如果M < D)

    日期和时间类型
    列类型 需要的存储量
    DATE 3 个字节
    DATETIME 8 个字节
    TIMESTAMP 4 个字节
    TIME 3 个字节
    YEAR 1 字节

    串类型
    列类型 需要的存储量
    CHAR(M) M字节,1 VARCHAR(M) L+1 字节, 在此L TINYBLOB, TINYTEXT L+1 字节, 在此L< 2 ^ 8
    BLOB, TEXT L+2 字节, 在此L< 2 ^ 16
    MEDIUMBLOB, MEDIUMTEXT L+3 字节, 在此L< 2 ^ 24
    LONGBLOB, LONGTEXT L+4 字节, 在此L< 2 ^ 32
    ENUM(‘value1′,’value2′,…) 1 或 2 个字节, 取决于枚举值的数目(最大值65535)
    SET(‘value1′,’value2′,…) 1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)





    展开全文
  • 数据库字段的长度设置过长

    千次阅读 2013-03-18 14:05:59
    1.长度设置过长,如果有数据就会按照实际数据的长度进行设定;如果没有数据它会自己进行一定的压缩处理,不会你设定的是多长它就占多长的 1)varchar类型没有数据会默认占用4个位置,有数据就按照长度设定的占; 2...
    1.长度设置过长,如果有数据就会按照实际数据的长度进行设定;如果没有数据它会自己进行一定的压缩处理,不会你设定的是多长它就占多长的
    1)varchar类型没有数据会默认占用4个位置,有数据就按照长度设定的占;
    2)char类型和Number类型没有数据会进行压缩处理,有数据就按照长度设定的占。
    展开全文
  • 关于数据库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] view plain copy
    1. SQL> create table test1  
    2.   2  (  
    3.   3    c1 varchar2(4000),  
    4.   4    c2 varchar2(4000),  
    5.   5    c3 varchar2(4000)  
    6.   6  )  
    7.   7  ;  
    8.    
    9. Table created  
    10. SQL> create index test1_ind1 on TEST1 (c1);  
    11.    
    12. Index created  
    13. SQL> alter index test1_ind1 rebuild online;  
    14.    
    15. alter index test1_ind1 rebuild online  
    16.    
    17. ORA-00604: error occurred at recursive SQL level 1  
    18. ORA-01450: maximum key length (3215) exceeded  
    19. SQL> create index test1_ind2 on TEST1 (c2, c3);  
    20.    
    21. create index test1_ind2 on TEST1 (c2, c3)  
    22.    
    23. ORA-01450: maximum key length (6398) exceeded  
    24.    
    25. 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
    展开全文
  • 面试问题: 商品表product,有字段 ‘productName’ 商品名,获取该字段信息中最长长度值,并展示该条数据?  mysql: select * from product where char_length(productName) = (select max(char_length...

    面试问题: 商品表product,有字段 ‘productName’ 商品名,获取该字段信息中最长长度值,并展示该条数据?

                       mysql:  select * from product where char_length(productName) = (select max(char_length(productName)) from product) 

                        char_length() 、子查询

    ()Mysql

    1length():计算字段的长度一个汉字、标点符号是算三个字符,一个数字或字母算一个字符

    2CHAR_LENGTH(str) 计算字段的长度一个汉字、标点符号是算两个字符,一个数字或字母算一个字符

     

           ()sqlserver

         1len(str):计算字段的长度一个汉字、标点符号是算两个字符,一个数字或字母算一个字符。

    展开全文
  • mysql的text字段长度 mysql数据库中text字段长度不够的问题
  • sql语句修改数据库字段的长度

    千次阅读 2016-12-28 15:45:24
     alter table tableName  alter column columnName varchar(1024)
  • Mybatis确实非常的方便,使用起来也...数据库字段和实体类字段有对应关系,这里的对应关系就是数据库字段全为大写字母且单词之间用_分隔,实体类的属性名采用小驼峰式命名,一定要保证对应,例如数据库中的USER_I...
  • mybatis+mysql数据库字段 驼峰命名问题

    千次阅读 2015-12-27 16:09:51
    在查询语句, 数据库字段名 media_id 实体属性名 mediaId 在MyBatis-config.xml 配置文件中 setting name="mapUnderscoreToCamelCase" value="true" />
  • Oracle数据库修改字段长度

    千次阅读 2015-09-01 21:12:45
    本人小菜鸟一个 闲来没事 写一点点博客 方便以后查看 alter table user_test modify pad varchar2 (200); /*修改数据库字段长度*/ user_test 为数据库表 pad为表中的字段
  • 使用mybatis框架时不能避免数据字段有时为sql关键字,只要修改bean中@Column注解,将(name =“字段名”)改为(name ="字段名")即可解决,即在字段名称外加上英文波浪线。 ...
  • 数据库字段,做唯一性约束

    千次阅读 2015-12-28 15:35:42
    今天同事问到,要把一个超长的字段做一个唯一性约束,text类型和大于varchar(255)类型,都无法用unique。 经过Google后,得到一个很好的思路:就是新建一个字段,和这个超长的字段对应,运用加密方式将原字段内容...
  • 数据库建表时字段长度

    千次阅读 2016-05-04 21:57:00
    数据库建表时字段长度
  • mysql修改数据库字段长度

    千次阅读 2009-01-20 10:51:00
    alter table 表名 modify column 字段名 类型;例如数据库中user表 name字段是varchar(30)可以用alter table user modify column name varchar(50) ;这样就修改了
  • 字段类型是在定义模型时, 对每个 Column 的类型约定. 不同类型的字段类型在输入输出上, 及支持的操作方面, 有所区别. ... 但是这些类型并不一定在所有数据库中都有支持. 除此而外, SQLAlchemy 也支
  • 通用Mapper实体类映射数据库字段问题 最近再做项目时遇到了一个小坑, 删除某个表格行时报错了, Unknown column ‘kind_id’ in ‘where clause’. 显示我的sql语句DELETE FROM tb_app_leave WHERE kind_id = 4, 当时...
  • 数据库字段区分大小写问题

    千次阅读 2017-04-27 16:36:26
    数据库字段为latin1型时,设置latin_general-cs的校对方式是区分大小写的,当字段值相等时,只会查询到与之大小写完全匹配的记录, 设置latin_general_ci时,不区分大小写,当字段值大小写不分时,会查到所有是该值...
  • sqlite数据库字段类型

    千次阅读 2020-03-25 14:30:39
    数据库字段类型: 字符型字段 topic=models.CharField(max_length=)#需要传入参数,设置字符串的最长长度 email=models.EmailTield()#电子邮箱字段,在CharField基础上,增加了邮箱的正则验证 a=models.SlugField()#...
  • 关于数据库字段长度设置的建议

    万次阅读 2017-01-13 10:06:55
    对于任何字段长度都不应该过于小气,否则...1、对于开关型字段建议number(1,0) 而不是varchar2(1),避免用户错误保存Y/N,而不是1/0,这样可能会引入大小写问题    2、对于数据字典编码字段,不要小气的确定为3位,最好统
  • 数据库字段加密

    千次阅读 2019-04-26 09:33:18
    数据库database中,为表a_table添加name、mobile、idNo三个字段,便于直观查询数据。 alter table a_table add name varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', add mobile varchar(16) NOT NULL ...
  • java字段与数据库字段映射

    千次阅读 2016-05-27 16:26:04
    * 将以下划线分隔的数据库字段转换为驼峰风格的字符串 *  * @param columnName * @return */ public static String changeColumnToFieldName(String columnName) { String[] array = columnNa
  • 使用框架自动生成了前端页面和controller层、entity层等代码后,发现数据库中对name设置的字段长度不统一,想要将长度为255的name字段统一变为80。 这就在考虑一个问题,修改字段长度会不会影...
  • 数据库字段值为汉字时的长度

    千次阅读 2018-12-17 22:29:50
    用图来说话,如下: 不用多说,自己看吧。数据库字段值为汉字时,查出来的长度竟然是汉字个数,问问自己,你注意到了吗?
  • mybatis使用的时候如果实体类字段名与数据库字段名不匹配,不匹配的那些字段值将是null。 这个问题现在我所知道有两种解决方法, 1、在*Mapper.xml中修改sql se
  • 问题 驼峰命名会被自动转成数据库下划线命名,指定@Column的name也不起作用 @Column(name = ...数据库字段branch_syncId,实体字段branchSyncId会被转换成branch_sync_id 解决 配置文件添加 spring.jpa.hibern...
  • 在mybatis-plus中,数据库字段为first_char,而实体类中为firstChar,不用在mapper中配置ResultMap,也能自动映射,不过记得加上get和set方法,或者使用@Data注解进行配置 demo 看到了嘛? 在mapper中,没有配置...
  • Oracle数据库字段问题

    千次阅读 2016-08-23 12:00:56
    Oracle数据库字段问题问题描述:字段内容长度超4000最近项目中存在用某些字段存预处理sql语句,最初,项目此类型字段用varchar2(4000),但随着项目跟进到二期,牵连的表越来越多,存在预处理索引,中间临时表的...
  • (请放大观看)
  • 当我们定义数据库字段时,可能会在不经意间定义了和数据库关键字名相同的字段,这时我们在对该字段进行操作时,常会发生错误。例如我在表中定义了一个from字段,我们知道 from值mysql的关键字,所以我们在执行查询...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,173,015
精华内容 469,206
关键字:

数据库字段过长问题