最近由于工作需要,要将BIEE与公司现有的ERP系统做集成,使用外部表的方式。mssql2008 base64
现有系统基于.Net平台,为SQL Server 2008 R2,用户密码采用先算MD5在转Base64的方式存于中。
代码逻辑如下
byte[] byteString = null; MD5 md5 = MD5.Create(); byteString = md5.ComputeHash(Encoding.Unicode.GetBytes(Str)); md5.Clear(); string NewStr = Convert.ToBase64String(byteString);
Encoding.Unicode.GetBytes(Str)这句为最关键的部分,其作用是把Str转换成了Unicode字节数组,正是这里给整个工作带来了困难!因为本人不懂C#,所以不知道C#里的Unicode是使用的UTF16LE(小头),而非常见的UTF16BE(大头)。SQL Server 里的Nvachr应该也是采用的是UTF16LE,而Oracle里的NVarchar2则是采用的UTF16BE,正是因为这点导致MD5出来的串不一致!
对于qaz123三者的输出分别为:
Oracle:
SQL> select utl_raw.cast_to_varchar2(utl_encode.base64_encode(GET_MD5('qaz123'))) from dual;
UTL_RAW.CAST_TO_VARCHAR2(UTL_E
--------------------------------------------------------------------------------
NPhcqA7DU9MFK4otOXOgxQ==
SQL Server:
select dbo.f_ToBase64(hashbytes('MD5',convert(NVARCHAR,'qaz123')))
LwUQYUuskyOhnZXD8WUh8Q==
C#:
LwUQYUuskyOhnZXD8WUh8Q==
Oracle的字符集为AL32UTF8、SQL Server的字符集为GBK
由于qaz123在UTF8和UTF16下的编码都一样所以就算我在Oracle下把qaz123转换成UTF16,其最终结果还是不是预期的,如下:
select utl_raw.cast_to_varchar2(utl_encode.base64_encode(GET_MD5(N'qaz123'))) from dual; UTL_RAW.CAST_TO_VARCHAR2(UTL_E -------------------------------------------------------------------------------- NPhcqA7DU9MFK4otOXOgxQ==
直到我把其转为UTF16LE,结果才和C#中的一样
注:Oracle中的UTF16默认为UTF16BE
select utl_raw.cast_to_varchar2(utl_encode.base64_encode(GET_MD5(convert('qaz123','AL16UTF16LE')))) from dual;
UTL_RAW.CAST_TO_VARCHAR2(UTL_E
--------------------------------------------------------------------------------
LwUQYUuskyOhnZXD8WUh8Q==
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-53637-1.html
我身边成千上万的企业退休老人都和我一样