精华内容
下载资源
问答
  • ORACLE VARCHAR2最大长度问题

    千次阅读 2019-04-25 15:53:08
    VARCHAR2数据类型的最大长度问题,是一个让人迷惑的问题,因为VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型。简单的说,要看你在什么应用场景下,否则难以回答VARCHAR2数据类型的...

    VARCHAR2数据类型的最大长度问题,是一个让人迷惑的问题,因为VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型。简单的说,要看你在什么应用场景下,否则难以回答VARCHAR2数据类型的最大长度问题。

    ORACLE数据库字段类型

    关于Oracle Database中的字段的VARCHAR2类型的最大长度,我们先看下面的例子:

    SQL> create table test ( name varchar2(4001) );
    create table test ( name varchar2(4001) )                                  *
    ERROR at line 1:
    ORA-00910: specified length too long for its datatype
    
    SQL> create table test ( name varchar2(4000) ); 
    
    Table created.

    clip_image001

    如上所示,在Oracle Database中,VARCHAR2字段类型,最大值为4000,SQL参考手册中也明确指出VARCHAR2的最大大小为4000,注意此处的最大长度是指字节长度,而不是指字符个数。这个跟参数NLS_LENGTH_SEMANTICS有一定关系,如下所示,当参数NLS_LENGTH_SEMANTICS为字节时,定义的变量长度为字节长度

    如下所示,本数据库NLS_CHARACTERSET值为AL32UTF8,一个汉字占三个字节

    SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE; 
    
    Session altered 
    
    SQL> DROP TABLE TEST PURGE; 
    
    Table dropped 
    
    SQL> CREATE TABLE TEST ( NAME VARCHAR2(7)); 
    
    Table created 
    
    SQL> INSERT INTO TEST VALUES ('字'); 
    
    1 row inserted 
    
    SQL> COMMIT; 
    SQL> INSERT INTO TEST VALUES('字字字'); 
    
    INSERT INTO TEST VALUES('字字字') 
    
    ORA-12899: value too large for column "SYSTEM"."TEST"."NAME" (actual: 9, maximum: 7) 
    
    SQL> SELECT LENGTH(NAME), LENGTHB(NAME) FROM TEST; 
    
    LENGTH(NAME) LENGTHB(NAME) 
    
    ------------ ------------- 
    
    1 3 

    如果将参数NLS_LENGTH_SEMANTICS,则定义VARCHAR2(7)表示

    SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR; 
    
    Session altered 
    
    SQL> DROP TABLE TEST; 
    
    Table dropped 
    
    SQL> CREATE TABLE TEST ( NAME VARCHAR2(7)); 
    
    Table created 
    
    SQL> INSERT INTO TEST VALUES ('字'); 
    
    1 row inserted 
    
    SQL> COMMIT; 
    
    Commit complete 
    
    SQL> INSERT INTO TEST VALUES('字字字'); 
    
    1 row inserted 
    
    SQL> COMMIT; 
    
    Commit complete 
    SQL> SELECT LENGTH(NAME), LENGTHB(NAME) FROM TEST; 
    
    LENGTH(NAME) LENGTHB(NAME) 
    
    ------------ ------------- 
    
    1                 3 
    
    3                 9 
    
    Commit complete 
    

    不管参数NLS_LENGTH_SEMANTICS取值为字符或字节,其所能容纳的字符串的字节数都不能超过4000.

     

    PL/SQL变量类型:

    接下来我们看看PL/SQL中VARCHAR2变量类型,如下官方文档所示,它的最大字节长度为32767,所能容纳的字符个数取决于字符集。

     

    Declaring Variables for Multibyte Characters

    The maximum size of a CHAR or VARCHAR2 variable is 32,767 bytes, whether you specify the maximum size in characters or bytes. The maximum number of characters in the variable depends on the character set type and sometimes on the characters themselves:

    Character Set Type

    Maximum Number of Characters

    Single-byte character set

    32,767

    n-byte fixed-width multibyte character set (for example, AL16UTF16)

    FLOOR(32,767/n)

    n-byte variable-width multibyte character set with character widths between 1 and n bytes (for example, JA16SJIS or AL32UTF8)

    Depends on characters themselves—can be anything from 32,767 (for a string containing only 1-byte characters) through FLOOR(32,767/n) (for a string containing only n-byte characters).

    When declaring a CHAR or VARCHAR2 variable, to ensure that it can always hold n characters in any multibyte character set, declare its length in characters—that is, CHAR(n CHAR) or VARCHAR2(n CHAR), where n does not exceed FLOOR(32767/4) = 8191.

    可以通过下面一个PL/SQL代码来验证一下,如下所示,可以定义一个VARCHAR2类型的变量,给其赋值6000个字符串。

     
    DECLARE
        V_OUT VARCHAR2(32767);
    BEGIN
         V_OUT := RPAD('T', 6000, 'M');
         DBMS_OUTPUT.PUT_LINE(LENGTH(V_OUT));
    END;

    如果给VARCHAR2类型变量赋值超过23767,就会报PLS-00215: String length constraints must be in range (1 .. 32767)错误。

    DECLARE
        V_OUT VARCHAR2(32768);
    BEGIN
         V_OUT := RPAD('T', 5000, 'M');
         DBMS_OUTPUT.PUT_LINE(LENGTH(V_OUT));
    END;

    clip_image002

    展开全文
  • 比如常见写法varchar2(10) 代表只接收最大10字节长度 这种定义情况下10字节只能插入3个汉字,(数字字母只占一字节,汉字占三字节) 如果插入4个汉字会报ORA-12899错误,提示超过长度 其实我们在Oracle中也...

    Oracle中varchar2类型的字段长度单位默认是按照byte来定义,

    比如常见写法varchar2(10)  代表只接收最大10字节长度

    这种定义情况下10字节只能插入3个汉字,(数字字母只占一字节,汉字占三字节)

    如果插入4个汉字会报ORA-12899错误,提示超过长度

     

    其实我们在Oracle中也可以用字符为单位来定义varchar2字段的长度,这个时候需要注意在建表时像下面这样写成VARCHAR2(10 char):

    --测试建表语句
    CREATE TABLE tUsers1(
         UserName VARCHAR2(10 char)
     ); 
    
    --插入测试数据
    INSERT INTO tUsers1(UserName) VALUES('我是中国人我是中国人');
    INSERT INTO tUsers1(UserName)VALUES('你好123');
     
    --查询长度会发现oracle中一个汉字占用3个字节
     SELECT lengthb(username),username  FROM tUsers1	
     

    测试效果如下:我们可以看见字段定义为varchar(10 char) 可以插入10个字符(包括汉字),占用最多到30 byte!

    另附:

    查询字符集:select * from v$nls_parameters t where t.PARAMETER='NLS_CHARACTERSET';

    Length与LengthB比较
    lengthb(string)计算string所占的字节长度

    length(string)计算string所占的字符长度

    MySql
    5.X 以上的版本的定义中表示的字符长度,如上varchar(20)你既可以添加20个英文字符,也可以添加二十个中文字符.

    4.X 的版本表示的是字节长度,会根据字符集转变内容字节长度存储。

    int(2) 中的2 ,表示的并非是int类型只能输入2位数字,而是只能显示2位数字范围,可以添加11位的int的任何数字。

    SqlServer
    2008中

    select len('深圳市中民时代广场B座九楼')   --13
    select datalength('深圳市中民时代广场B座九楼')  --25

     

     

    展开全文
  • MySQL数据库varchar最大长度是多少?其实这不是一个固定的数字,varchar的长度是有限制规则的。本文我们就来介绍一下MySQL数据库varchar的限制规则,并以一个实际的例子对限制规则进行了说明,接下来就让我们一...
  • 需要向数据库中保存数据,但某个字段内容长度过长(有中文、符号、英文),应该根据字符串内容与数据库存储上限合理设置储存方式。 解决思路 分条存储,即多条数据前n个字段一致,最后内容字段不同,下方代码可高效...

    问题描述

    需要向数据库中保存数据,但某个字段内容长度过长(有中文、符号、英文),应该根据字符串内容与数据库存储上限合理设置储存方式。

    解决思路

    分条存储,即多条数据前n个字段一致,最后内容字段不同,下方代码可高效利用数据库空间!

    代码如下

    
    public class StringSavingUtils {
        /**
         * 根据参数length,将String类型对象,进行截取
         * 用于将长字符串,存入数据库中
         * 避免过长 数据库保存失败
         * 避免直接写死长度 产生不必要数据
         * 前提:一个汉字 占3个字节
         *      一个英文 占1个字节
         * @param content 需要截取的字符串
         * @param lengthMax 数据库中存储的最大长度
         * @param lengthCN 汉字占的字节数
         * @return List<String>
         */
        public static List<String> getList(String content,int lengthMax,int lengthCN) {
            List<String> resultList = new ArrayList<>();
            if (StringUtils.isEmpty(content) || lengthMax <= 0 || lengthCN <= 0 || (lengthMax <=lengthCN)) {
                throw new RuntimeException("参数非法");
            }
            try {
                while(true) {
                    //最好情况:content即使都是中文,也 <= lengthMax
                    if (content.length() <= lengthMax / lengthCN) {
                        resultList.add(content);
                        break;
                    }
                    //有超长的可能
                    else {
                        int lenStart = 0;
                        //截取到lengthMax / lengthCN,计算总长度
                        for (int i = 0; i < lengthMax / lengthCN; i++) {
                            //获取每个c的长度+++
                            String c = content.substring(i,i+1);
                            lenStart += c.getBytes("UTF-8").length;
                        }
                        StringBuilder builder = new StringBuilder(content.substring(0, (lengthMax / lengthCN)));
                        //循环:当达到最大能储存的最大值 或者 剩下的content取完
                        int i = lengthMax / lengthCN;
                        while (lenStart <= lengthMax && i < content.length()) {
                            String c = content.substring(i,i+1);
                            lenStart += c.getBytes("UTF-8").length;
                            builder.append(c);
                            i++;
                        }
                        //应清楚:当因为达到上限跳出循环时,while循环中的所有操作都是多余的
                        // 包括:i++ -> bug01
                        // 包括:builder最后一次append -> bug02
                        //为何退出循环?
                        // 1:加到content结束,没有达到lengthMax->直接add到resultList
                        // 2:达到了上限->content被赋值成后半段
                        if (lenStart <= lengthMax) {
                            resultList.add(content);
                            break;
                        }else {
                            //bug01
                            content = content.substring(i-1);
                            String line = builder.toString();
                            //bug02
                            resultList.add(line.substring(0,line.length()-1));
                        }
                    }
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return resultList;
        }
    
    }
    

    最后

    根据方法返回的list,list.forEach(),循环构造实体+调用save方法!

    转载于:https://www.cnblogs.com/kangkaii/p/8780888.html

    展开全文
  • 嵌入式 mysql数据库中text最大长度

    千次阅读 2014-03-04 16:42:41
    mysql中text 最大长度为65,535(2的16次方–1)字符的TEXT列。 如果你觉得text长度不够,可以选择 MEDIUMTEXT最大长度为16,777,215。 LONGTEXT最大长度为4,294,967,295 Text主要是用来存放非二进制的文本。 需要...

    mysql中text 最大长度为65,535(2的16次方–1)字符的TEXT列。
    如果你觉得text长度不够,可以选择
    MEDIUMTEXT最大长度为16,777,215。
    LONGTEXT最大长度为4,294,967,295
    Text主要是用来存放非二进制的文本。

    需要弄清楚的是text 和 char varchar blob搜索这几种类型的区别。
    详细用法可查看手册
    http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#column-type-overview

    例子:


    #define CRETAE_JMS_PICTURE_TABLE  "create table IF NOT EXISTS %s(\
     %s char(32),\
     %s INT,\
     %s char(32),\
     %s char(32),\
     %s TEXT\
    );"

    展开全文
  • 1.CHAR的长度是固定的,而VARCHAR2长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当...
  • Oracle中 varchar2 varchar2(50) 表示该字段bai类型...varchar2最大长度是4000。 Oracle中 varchar varchar 存贮为定长 varchar2与varchar的区别在于 如果定义了一个字段为varchar(10),那么存贮到这个字段的值,不
  • 1.CHAR的长度是固定的,而VARCHAR2长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当...
  • varchar2长度的意义

    2010-06-08 15:56:00
    干脆都用最大长度比如说一个Currency字段,我可以把它设为varchar2(3),我也可以设为最大长度varchar2(4000),请问一下设为长度3有什么好处?唯一可以想到的是,前一种方式限制了可以输入的值的范围,但是也留下了...
  • show parameter MAX_STRING_SIZE ... extended:代表12c 32k strings新特性,varchar2、nvarchar2、raw最大长度是32767,即32kb 由数据库参数max_string_size默认是standard,所以需要修改该参数值为extended,...
  • Oracle 字符串(varchar2) 长度限制详解

    千次阅读 2020-07-24 01:46:46
    oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串... 首先,我们要时刻记清:无论是varchar2还是nvarchar2,最大字节数都是4000。 varchar2(byte):就是默认的表示方式,比如我们写成:v...
  • 1.CHAR的长度是固定的,而VARCHAR2长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当...
  • VARCHAR2(50 char)这种类型的字段最多放50个...varchar2是变长字符串,与CHAR类型不同,它不会使用空格填充至最大长度VARCHAR2最多可以存储4,000字节的信息。 转载于:https://www.cnblogs.com/xinxin1994/p/651...
  • Oracle的varchar2最大长度,编码问题

    千次阅读 2017-02-27 13:40:50
    今天数据库有改动,需要备份数据库的表结构和数据 导出的时候,遇到有clob类型的字段不能导出
  • ORACLE varchar2 长度问题整体

    千次阅读 2013-11-12 12:38:35
    oracle中,数据库表的varchar2类型和pl/sql中varchar2类型长度是不等的。 varchar2类型的表的列最大长度:4000字节 而 pl/sql中varchar2类型的变量最大长度:32767   网络上关于varchar2类型问题整理: 问题: ...
  • 字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。 oracle中varchar2型与...
  • 1. varchar/varchar2用于存储可变长度的字符串 比如 varchar(20),存入字符串'abc', 则数据库中该字段只占3个字节,而不是20个字节 2. size 的最大值是 4000,而最小值是 1,其值表示字节数, 比如 varchar...
  • Oracle数据库中的varchar2和char区别

    千次阅读 2018-05-29 21:34:40
    varchar2长度是可变的,例如char(10)、varchar(10),如果存储一个汉字“是”,char(10)则存储占10个字节,3个字节是汉字后面7个字节用空格补齐,varchar(10),存储长度3个字节,后面的7个字节不用空格补齐,10...
  • oracle数据库相信大家都比较熟悉,数据库中有一种非常常用的数据类型:字符串型。 对应该类型,在oracle中有三种比较常用的类型:varchar2(byte)、... 首先,我们要时刻记清:无论是varchar2还是nvarchar2,最大字节...
  • 1.CHAR(size)和VARCHAR(size)的区别 CHAR为定长的字段,最大长度为2K字节; VARCHAR为可变长的字段,最大长度为4K字节; 2.CHAR(size)和NCHAR(size)的...3.VARCHAR(size)和VARCHAR2(size)的区别 在现在的版本中,两者
  • 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度... VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 626
精华内容 250
关键字:

数据库varchar2最大长度