And*_*ili 18 sql oracle varchar sqldatatypes
我不是这样database,我有以下疑问.
我知道我可以varchar2使用它可以包含的char的数量声明一个字段.
但是Oracle在我正在处理的数据库中,我发现一个字段(名为PDF)定义为:
VARCHAR2(1 BYTE)
究竟意味着什么?它包含多少人?
另一个疑问是:VARCHAR场和VARCHAR2场之间究竟有什么区别?
TNX
Ren*_*ene 22
您可以将列/变量声明为varchar2(n CHAR)和varchar2(n byte).
n CHAR表示变量将包含n个字符.在多字节字符集中,您并不总是知道要存储多少字节,但您确实希望保留一定数量字符的存储空间.
n个字节仅表示要存储的字节数.
varchar已弃用.不要使用它. varchar和varchar2有什么区别?
Wer*_*eit 12
我不知道VARCHAR和之间的确切区别,VARCHAR2但答案很简单:不要使用VARCHAR2,只能使用US7ASCII.
如果您的数据库在单字节字符集(例如WE8MSWIN1252,WE8ISO8859P1或VARCHAR2(x BYTE))上运行,则无论您使用VARCHAR2(x CHAR)还是使用它都没有任何区别AL32UTF8.
当您的数据库在多字节字符集(例如AL16UTF16或VARCHAR2(1 CHAR))上运行时,它只会有所不同.你可以在这个例子中看到它:
CREATE TABLE my_table (
    VARCHAR2_byte VARCHAR2(1 BYTE), 
    VARCHAR2_char VARCHAR2(1 CHAR)
);
INSERT INTO my_table (VARCHAR2_char) VALUES ('€');
1 row created.
INSERT INTO my_table (VARCHAR2_char) VALUES ('ü');
1 row created.
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€');
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€')
Error at line 10
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 3, maximum: 1)
INSERT INTO my_table (VARCHAR2_byte) VALUES ('ü')
Error at line 11
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 2, maximum: 1)
VARCHAR2(1 BYTE)意味着你可以存储多达1个字符,无论它有多少字节.在Unicode的情况下,一个字符可能占用最多4个字节.
BYTE意味着你可以存储一个占据最大值的角色.1个字节.
如果您未指定任何一个CHAR,NLS_LENGTH_SEMANTICS则默认值来自MAX_STRING_SIZE=EXTENDEDsession参数.
除非你有Oracle 12c,你可以设置VARCHAR2(4000 CHAR)限制VARCHAR2(4000 CHAR)
但是,€并不意味着您可以保证最多可存储4000个字符.限制仍然是4000 字节,因此在最坏的情况下,您可以在此类字段中最多存储1000个字符.
看这个例子(VARCHAR在UTF-8中占用3个字节):
CREATE TABLE my_table2(VARCHAR2_char VARCHAR2(4000 CHAR));
BEGIN
    INSERT INTO my_table2 VALUES ('€€€€€€€€€€');
    FOR i IN 1..7 LOOP
        UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;
    END LOOP;
END;
/
SELECT LENGTHB(VARCHAR2_char) , LENGTHC(VARCHAR2_char) FROM my_table2;
LENGTHB(VARCHAR2_CHAR) LENGTHC(VARCHAR2_CHAR)
---------------------- ----------------------
                  3840                   1280
1 row selected.
UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;
UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char
Error at line 1
ORA-01489: result of string concatenation is too long
另请参见BYTE和CHAR语义用法的示例和限制(NLS_LENGTH_SEMANTICS)(文档ID 144808.1)
要回答第一个问题:
是的,这意味着1个字节分配给1个字符.看看这个例子
SQL> conn / as sysdba
Connected.
SQL> create table test (id number(10), v_char varchar2(10));
Table created.
SQL> insert into test values(11111111111,'darshan');
insert into test values(11111111111,'darshan')
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column
SQL> insert into test values(11111,'darshandarsh');
insert into test values(11111,'darshandarsh')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TEST"."V_CHAR" (actual: 12,
maximum: 10)
SQL> insert into test values(111,'Darshan');
1 row created.
SQL> 
并回答你的下一个:varchar2和之间的区别varchar:
VARCHAR可以存储多达2000 bytes多个字符,同时VARCHAR2可以存储多达4000 bytes多个字符.VARCHAR那么它将占用空间NULL values,如果是VARCHAR2数据类型,它将not占用任何空间.| 归档时间: | 
 | 
| 查看次数: | 85765 次 | 
| 最近记录: |