我在跟踪文件中看到以下内容:
绑定#3 oacdty=01 mxl=128(35) mxlc=36 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=31 siz=0 off=168
kxsbbbfp=ffffffff79f139a8 bln=128 avl= 35 flg=01 value="1234 W 1234 West, West Groves City"
我想知道 mxlc 值是多少?
我引用
Bind #n
oacdty - Datatype code
mxl - Maximum length of the bind variable value (private maximum length in parentheses)
mxlc - Unknown :(
mal - array length
scl - Scale
pre - Precision
oacflg - Special flag indicating bind options
fl2 - second part of oacflg
frm - Unknown :(
csi - Unknown :(
siz - Amount of memory to be allocated for this chunk
off - Offset into this chunk for this bind buffer
kxsbbbfp- Bind address
bln - Bind buffer length
avl - actual value length
flg - bind status flag
value - Value of the bind variable
书中还引用了——
目前没有关于三个参数的信息。
分别是mxlc
、frm
和csi
。
概括
mxlc
似乎是绑定变量的最大字符数,但前提是该变量使用字符长度语义。
方法
我在 My Oracle Support 中搜索mxlc
. 几乎每篇文章都有mxlc=00
,唯一的例外涉及一个NVARCHAR
or NCHAR
。下面的代码基于文档 ID 552262.1 中的代码。我改变了变量大小(99
和123 char
),如果使用字符长度语义,每次mxlc
都设置为变量大小。
代码
create table t1(ncol1 nvarchar2(100), col1 varchar2(100));
alter session set timed_statistics = true;
alter session set statistics_level=all;
alter session set max_dump_file_size = unlimited;
alter session set events '10046 trace name context forever,level 4';
VAR nvar1 NVARCHAR2(99)
VAR var1 VARCHAR2(123 char)
EXEC :nvar1 := 'nvarchar'
EXEC :var1 := 'varchar'
SELECT * FROM T1 WHERE ncol1 = :nvar1 and col1 = :var1;
ALTER SESSION SET EVENTS '10046 trace name context off';
结果:
Bind#0
oacdty=01 mxl=2000(198) mxlc=99 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=02 csi=2000 siz=4000 off=0
kxsbbbfp=0e702edc bln=2000 avl=16 flg=05
value=0 6e 0 76 0 61 0 72 0 63 0 68 0 61 0 72
Bind#1
oacdty=01 mxl=2000(369) mxlc=123 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=873 siz=0 off=2000
kxsbbbfp=0e7036ac bln=2000 avl=07 flg=01
value="varchar"
更多问题
mxl
通常和之间的关系mxlc
是有意义的。对于NVARCHAR
我系统上的 UTF16,每个字符将有 2 个字节,即 198 和 99。我的数据库是 UTF8,一个字符最多可能占用 4 个字节。也许 Oracle 猜测平均大小是 3 个字节,因此是 123 和 369。显然它可能超过 369,也许这只是最初分配的内存,以后还会增长吗?
But your numbers, 36 and 35, don't make sense to me. Surely the number of bytes can never be LESS than the number of characters? Is Oracle making a bad guess, or is some client program sending in bad data?