1
DECLARE
  l_string  NVARCHAR2(600) := '123456';
  checksum  NVARCHAR2(600);

BEGIN

   DBMS_OUTPUT.DISABLE;
   DBMS_OUTPUT.ENABLE(1000000);

   DBMS_OBFUSCATION_TOOLKIT.md5 (input_string  => l_string, checksum_string => checksum);

   DBMS_OUTPUT.PUT_LINE(RAWTONHEX(utl_raw.cast_to_raw(checksum)));

END;

期望值:e10adc3949ba59abbe56e057f20f883e

但它返回:FFFD00390049FFFD0059FFFDFFFD0056FFFD000FFFFD003E

注意我想维护 nvarchar2 数据类型。校验和变量的值存储在 nvarchar2 类型的列中。

我知道 md5 接受并返回 varchar2 中的数据。但是,如果有人可以使用 nvarchar2 数据类型帮助我解决这个问题,那就太好了。

NLS_CHARACTERSET = AL32UTF8

4

1 回答 1

0

以下应该通过 dbms_crypto 使用 hash()

declare
  l_src nvarchar2(100) := '123456';
  l_raw_hash raw(100);
begin
  l_raw_hash := dbms_crypto.hash(to_clob(l_src), dbms_crypto.HASH_MD5);
  dbms_output.put_line(l_raw_hash);
end;

结果:E10ADC3949BA59ABBE56E057F20F883E

l_raw_hash 将是原始格式。您可以使用 UTL_RAW 将其转换为另一种数据类型。只需确保您的显示器显示正确的字符集,否则看起来会很有趣。

于 2012-06-18T17:01:36.040 回答