如果您需要存储大部分(如果不是全部)小于 4K 字节的字符串,那么在 VARCHAR2 数据类型上使用 CLOB 数据类型是否有任何负面影响?
从这里
CLOB 可以存储在单独的 LOB 段中,指向 LOB 段的指针与表的其余数据一起存储在数据块中。如果使用 CREATE TABLE 语句,您可以使用 LOB 存储子句控制 LOB 段的存储位置。默认情况下,小于 4000 字节的 LOB 将以与 VARCHAR2 相同的方式存储,即与其余数据内联。
从这里:
当您创建一个带有 CLOB 列的表时,CLOB 有一个名为“启用行中存储”的选项。这决定了 CLOB 是存储在与表相同的段中,因此与表行的其余部分一起存储,还是单独存储在单独的段中。在第二种情况下,表格行将包含一个指向 CLOB 数据位置的指针。一般将CLOB与表行一起存储效率更高,但是如果CLOB超过4000个字符左右,就不能再存储在行中,不管是否启用行中存储,都存储在CLOB段中或不。
从这些语句中,在我看来,即使所有行都包含少于 4K 行,但将列声明为 CLOB 并没有任何惩罚。这是准确的吗?
我使用 Oracle 12c。我的数据库中有下表。
\n\nCREATE TABLE TEST_T (COL VARCHAR2(4000 CHAR));\nRun Code Online (Sandbox Code Playgroud)\n\n我需要在此表中插入多字节字符。该字符是3字节字符。
\n我只能在表中插入 1333 个(最多 3999 个字节)字符。\n我的期望是插入最多 1500 个多字节字符,但我得到 ORA - 01461。
\n我不想将数据类型更改为 CLOB 或 LONG。\n有没有办法使用 VARCHAR2(4000 CHAR) 来实现此目的。
下面是代码,
\n\nSET SERVEROUTPUT ON\nDECLARE\n LV_VAR CHAR(1):=\'\xe3\x83\x97\'; -- 3 byte character\n LV_STR VARCHAR2(32000) := \'\';\nBEGIN\n FOR I IN 1..1500\n LOOP\n LV_STR := LV_STR||LV_VAR;\n END LOOP;\n--\n INSERT INTO TEST_T VALUES (LV_STR);\nEND;\n/\n\n\n\nError report -\nORA-01461: can bind a LONG value only for insert into a LONG column\nORA-06512: at line 11\n01461. 00000 - …Run Code Online (Sandbox Code Playgroud) 使用VARCHAR2(1 BYTE)的效率是否低于使用CHAR(1 BYTE)?
使用VARCHAR2(2000 BYTE)的效率是否低于使用CHAR(1 BYTE),如果我从未在字段中放置任何超过一个字符的值?
**通过高效,我意味着在时间(搜索)和空间(存储)方面都很有效率.
我有一个表的varchar2数据类型,如下所示
create table t11 (aa varchar2(100),bb varchar2(100));
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试插入systimestamp上面,则会插入值:
insert into t11 values (systimestamp,systimestamp);
commit;
Run Code Online (Sandbox Code Playgroud)
问题是Oracle允许这种转换的原因.
我正在使用Oracle 11g.
我需要varchar2在teradata sql中添加一个数据类型的列,
例如
ALTER TABLE table_name ADD column_name varchar2 (20);
Run Code Online (Sandbox Code Playgroud)
但是在teradata中它并没有varchar2作为一个定义的类型名称.
这与以下问题有关:如何在Oracle 11g中存储无限制的字符?
如果我需要的最大值是8000个字符,我可以再添加3个varchar2列,这样我就会有4个列,每个列有2000个字符,以获得8000个字符.因此,当第一列填满时,值将溢出到下一列,依此类推.这个设计会有什么不好的副作用吗?请建议.
我有一个varchar栏,我想转换yyyy-mm-dd hh:mi:ss成mm-dd-yyyy hh:mi:ss扔在一个日期.怎么做到呢?
使用 PL/SQL,我希望从 select 语句中以编程方式生成 CSV 字符串/varchar 对象。所以 select 语句的输出通常是 1-n 条记录(我只需要一列)。但关键是,我不能使用循环或任何迭代过程,而且必须在不使用外部库的情况下完成。
我可以自由地将数据转换为表格或不同的数据类型,并在需要时使用更多内存。但我不能明确使用循环。
我想我正在寻找一种方法来做这样的事情:
declare
my_csv varchar2(4000);
begin
select implode(my_column,',') into my_csv
from my_table
where some_column = 'some value';
dbms_output.put_line('I got my list: ' || my_csv);
end;
Run Code Online (Sandbox Code Playgroud)
本质上,内爆理论上会像 PHP 内爆函数一样工作,而“,”逗号是我的分隔符。我可以自己定义内爆函数,但同样,我不能明确使用循环。
有任何想法吗?
在匿名块中,我有一个空/空的输入字符串,并且想要针对非空字符串进行检查。例子:
DECLARE
v_notnull varchar2(50):='this string is never null';
v_input varchar2(50):='';
BEGIN
IF trim(v_input) != trim(v_notnull) THEN
dbms_output.put_line('the strings do NOT match');
ELSE
dbms_output.put_line('the strings DO match');
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
这里的问题是,当我运行这个块时,'the strings DO match'即使我输入''与 string 不同的空字符串(又名 null),输出也始终v_input是这样'this string is never null'。如何确保 oracle 覆盖空字符串大小写?当v_input为空时我希望输出为'the strings do NOT match'.