我们要从以下字符集转换数据库(oracle 11g):ISO-8859-8
此字符集:AL32UTF8。
新模式需要支持欧洲字符等。
这些语言可以出现在很多表格中。
我想对表\整个数据库的新大小进行一些估算
根据当前数据。
有什么好方法吗?
答案 0 :(得分:0)
我不认为会改变很多。我假设您的VARCHAR2
列当前定义为VARCHAR2(30)
,默认情况下是VARCHAR2(30 BYTE)
。转换后,该值将保持不变。如果将它们定义为VARCHAR2(30 CHAR)
,则不确定会发生什么。当您定义带有字符含义的列时,我认为Oracle会保留可能需要的空间,对于AL32UTF8,每个字符4个字节。
答案 1 :(得分:0)
我不明白您为什么如此担心尺寸。也许数据库会大几个百分点!,您很可能不会注意到任何差异。
无论如何,此PL / SQL应该对大小有所了解:
declare
iso_size number;
utf8_size number;
iso_size_sum number := 0;
utf8_size_sum number := 0;
begin
for aCol in (select table_name, column_name from user_tab_cols where data_type = 'VARCHAR') loop
iso_size.extend;
utf8_size.extend;
execute immediate
'select sum(LENGTH('||aCol.column_name||')),
sum(LENGTHB(convert('||aCol.column_name||', ''AL32UTF8'')))
from '||aCol.table_name INTO iso_size, utf8_size;
iso_size_sum := iso_size_sum + iso_size;
utf8_size_sum := utf8_size_sum + utf8_size ;
end loop;
dbms_output.put_line('Current size: '||to_char(iso_size_sum/1024/1024))||' MiByte');
dbms_output.put_line('Estimated UTF-8 size: '||to_char(utf8_size_sum/1024/1024))||' MiByte');
end;
这两个数字应给您一个指示(!),数据库将增长多少。请注意,Oracle中的数据是按块(通常为8 kiBytes)而不是字节组织的。
由于性能原因,您应该只在一个代表性表上而不是整个模式上运行查询。