转换为Unicode后计算数据库大小

时间:2018-11-03 18:21:43

标签: oracle unicode character-encoding

我们要从以下字符集转换数据库(oracle 11g):ISO-8859-8

此字符集:AL32UTF8。

新模式需要支持欧洲字符等。

这些语言可以出现在很多表格中。

我想对表\整个数据库的新大小进行一些估算

根据当前数据。

有什么好方法吗?

2 个答案:

答案 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)而不是字节组织的。

由于性能原因,您应该只在一个代表性表上而不是整个模式上运行查询。