(8.0.29)
OSメモリ = 2GB
ディスク = 60GB
select @@max_allowed_packet;
vi /etc/my.cnf
max_allowed_packet = 1073741824
longtext最大サイズ = 4GB
drop table tab1 ;
create table tab1(col1 longtext, col2 longtext);
insert into tab1 values('A','あ');
update tab1 set col1 = concat(col1,col1,col1);
update tab1 set col2 = concat(col2,col2,col2);
→ ERROR 2013 (HY000): Lost connection to MySQL server during query
select char_length(col1),length(col1),char_length(col2),length(col2) from tab1;
+-------------------+--------------+-------------------+--------------+
| char_length(col1) | length(col1) | char_length(col2) | length(col2) |
+-------------------+--------------+-------------------+--------------+
| 129140163 | 129140163 | 43046721 | 129140163 |
+-------------------+--------------+-------------------+--------------+
→ 実際の上限 = 123MB
select substring(col1,10000,10),substring(col2,10000,10) from tab1;
+--------------------------+--------------------------------+
| substring(col1,10000,10) | substring(col2,10000,10) |
+--------------------------+--------------------------------+
| AAAAAAAAAA | ああああああああああ |
+--------------------------+--------------------------------+
(19c)
OSメモリ = 4GB
ディスク = 100GB
clob最大サイズ = (4GB - 1)×DB_BLOCK_SIZE初期化パラメータの値
( DB_BLOCK_SIZE=8kの場合、約32TB )
drop table tab1 purge;
create table tab1(col1 clob, col2 clob);
insert into tab1 values('A','あ');
commit;
update tab1 set col1 = col1||col1||col1;
update tab1 set col2 = col2||col2||col2;
commit;
→ ORA-01691: LOBセグメントTEST.SYS_LOB0000025529C00001$$を1024(表領域USERS)で拡張 できません
select lengthb(col1),lengthb(col2) from tab1;
→ ORA-22998: マルチバイトの文字セットのCLOBまたはNCLOBはサポートされていません
select length(col1),length(col2) from tab1;
LENGTH(COL1) LENGTH(COL2)
------------ ------------
3486784401 3486784401
→ 実際の上限 = 10GB
select dbms_lob.substr(col1,10,10000),dbms_lob.substr(col2,10,10000) from tab1;
AAAAAAAAAA
ああああああああああ
select substr(col1,10000,10),substr(col2,10000,10) from tab1;
AAAAAAAAAA
ああああああああああ
(15)
OSメモリ = 2GB
ディスク = 60GB
text最大サイズ = 1GB
drop table tab1 ;
create table tab1(col1 text,col2 text);
insert into tab1 values('A','あ');
update tab1 set col1 = col1||col1||col1;
update tab1 set col2 = col2||col2||col2;
→ ERROR: invalid memory alloc request size 1162261471
select char_length(col1),octet_length(col1),char_length(col2),octet_length(col2) from tab1;
char_length | octet_length | char_length | octet_length
-------------+--------------+-------------+--------------
387420489 | 387420489 | 129140163 | 387420489
select substr(col1,10000,10),substr(col2,10000,10) from tab1;
substr | substr
------------+----------------------
AAAAAAAAAA | ああああああああああ
(2019)
OSメモリ = 4GB
ディスク = 60GB
varchar(max)最大サイズ = 2GB
drop table tab1 ;
create table tab1(col1 varchar(max), col2 varchar(max));
insert into tab1 values('A','あ');
update tab1 set col1 = col1+col1+col1;
update tab1 set col2 = col2+col2+col2;
→ LOB のサイズを、許容最大サイズ 2147483647 バイトを超えて拡大しようとしています。
select len(col1),datalength(col1),len(col2),datalength(col2) from tab1;
1162261467 1162261467 387420489 774840978
select substring(col1,10000,10),substring(col2,10000,10) from tab1;
AAAAAAAAAA ああああああああああ