将 varchar 转换为 md5
converting varchar to md5
我在 oracle 客户端 11g 中有以下 sql 代码。我想将 "ssno" 转换为 md5 散列。我读过其他帖子,但其中 none 明确说明了代码的放置位置。谢谢!
SELECT FS_HIRES."rsa",
FS_HIRES."ssno",
FS_HIRES."lname",
FS_HIRES."series",
FS_HIRES."grade",
FS_HIRES."pos_title",
FS_HIRES."ethnicity",
FS_HIRES."disability",
FS_HIRES."type_appt",
FS_HIRES."Perm_Temp",
FS_HIRES."gender",
FS_HIRES."age",
FS_HIRES."age_categories",
FS_HIRES."los",
FS_HIRES."date_apnt",
FS_HIRES."mm_apnt",
FS_HIRES."yy_apnt",
FS_HIRES."apnt_noa",
FS_HIRES."apnt_auth",
FS_HIRES.L2_DESC,
FS_HIRES.L3_DESC,
FS_HIRES.L4_DESC,
FS_HIRES.L5_DESC,
FS_HIRES."fy"
FROM FS_HIRES
试试这个:
select
'123456789' as ssno,
rawtohex(
DBMS_CRYPTO.Hash (
UTL_I18N.STRING_TO_RAW ('123456789', 'AL32UTF8'),
2)
) as ssno_md5
from dual;
输出:
SSNO SSNO_MD5
123456789 25F9E794323B453885F5181F1B624D0B
HASH_MD5
常量不能直接从 SQL 引用,所以像这样的语句:
SELECT FS_HIRES."rsa",
DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(FS_HIRES."ssno", 'AL32UTF8'),
DBMS_CRYPTO.HASH_MD5),
...
会得到类似 "ORA-06553: PLS-221: 'HASH_MD5' is not a procedure or is undefined" 的错误。您可以使用该常量的内部值,即 2:
SELECT FS_HIRES."rsa",
DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(FS_HIRES."ssno", 'AL32UTF8'), 2),
...
或者,如果您不想依赖可能在未来版本中发生变化的常量,请定义您自己的函数:
create or replace function my_md5(p_str varchar2) return raw is
begin
return dbms_crypto.hash(utl_i18n.string_to_raw(p_str, 'AL32UTF8'),
dbms_crypto.hash_md5);
end my_md5;
/
...然后调用它:
SELECT FS_HIRES."rsa",
MY_MD5(FS_HIRES."ssno", 'AL32UTF8') AS "ssno",
...
如果你的数据库字符不是 AL32UTF8,你可能需要做更多的转换as mentioned in the documentation,而且在函数中隐藏它也会更容易。
我在 oracle 客户端 11g 中有以下 sql 代码。我想将 "ssno" 转换为 md5 散列。我读过其他帖子,但其中 none 明确说明了代码的放置位置。谢谢!
SELECT FS_HIRES."rsa",
FS_HIRES."ssno",
FS_HIRES."lname",
FS_HIRES."series",
FS_HIRES."grade",
FS_HIRES."pos_title",
FS_HIRES."ethnicity",
FS_HIRES."disability",
FS_HIRES."type_appt",
FS_HIRES."Perm_Temp",
FS_HIRES."gender",
FS_HIRES."age",
FS_HIRES."age_categories",
FS_HIRES."los",
FS_HIRES."date_apnt",
FS_HIRES."mm_apnt",
FS_HIRES."yy_apnt",
FS_HIRES."apnt_noa",
FS_HIRES."apnt_auth",
FS_HIRES.L2_DESC,
FS_HIRES.L3_DESC,
FS_HIRES.L4_DESC,
FS_HIRES.L5_DESC,
FS_HIRES."fy"
FROM FS_HIRES
试试这个:
select
'123456789' as ssno,
rawtohex(
DBMS_CRYPTO.Hash (
UTL_I18N.STRING_TO_RAW ('123456789', 'AL32UTF8'),
2)
) as ssno_md5
from dual;
输出:
SSNO SSNO_MD5
123456789 25F9E794323B453885F5181F1B624D0B
HASH_MD5
常量不能直接从 SQL 引用,所以像这样的语句:
SELECT FS_HIRES."rsa",
DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(FS_HIRES."ssno", 'AL32UTF8'),
DBMS_CRYPTO.HASH_MD5),
...
会得到类似 "ORA-06553: PLS-221: 'HASH_MD5' is not a procedure or is undefined" 的错误。您可以使用该常量的内部值,即 2:
SELECT FS_HIRES."rsa",
DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(FS_HIRES."ssno", 'AL32UTF8'), 2),
...
或者,如果您不想依赖可能在未来版本中发生变化的常量,请定义您自己的函数:
create or replace function my_md5(p_str varchar2) return raw is
begin
return dbms_crypto.hash(utl_i18n.string_to_raw(p_str, 'AL32UTF8'),
dbms_crypto.hash_md5);
end my_md5;
/
...然后调用它:
SELECT FS_HIRES."rsa",
MY_MD5(FS_HIRES."ssno", 'AL32UTF8') AS "ssno",
...
如果你的数据库字符不是 AL32UTF8,你可能需要做更多的转换as mentioned in the documentation,而且在函数中隐藏它也会更容易。