使用mybatis将string转为blob存入数据库时出现ora-01465异常,无效的十六进制转换!求解,求解
oracle中用于保存位串的数据类型是RAW,LONGRAW(推荐使用BLOB)。
RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。
LONGRAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节
RAW类型的好处就是:在网络中的计算机之间传输RAW数据时,或者使用Oracle实用程序将RAW数据从一个数据库移到另一个数据库时,Oracle服务器不执行字符集转换。存储实际列值所需要的字节数大小随每行大小而异,最多为2,000字节。可能这样的数据类型在数据库效率上会提高,而且对数据由于字符集的不同而导致的不一致的可能性在这边也排除了。
下面是官方的定义:
Note:
TheLONGRAWdatatypeisprovidedforbackwardcompatibilitywithexistingapplications.Fornewapplications,usetheBLOBandBFILEdatatypesforlargeamountsofbinarydata.
TheRAWandLONGRAWdatatypesareusedfordatathatisnottobeinterpreted(notconvertedwhenmovingdatabetweendifferentsystems)byOracle.Thesedatatypesareintendedforbinarydataorbytestrings.Forexample,LONGRAWcanbeusedtostoregraphics,sound,documents,orarraysofbinarydata.Theinterpretationdependsontheuse.
RAWisavariable-lengthdatatypeliketheVARCHAR2characterdatatype,exceptOracleNetServices(whichconnectsusersessionstotheinstance)andtheImportandExportutilitiesdonotperformcharacterconversionwhentransmittingRAWorLONGRAWdata.Incontrast,OracleNetServicesandImport/ExportautomaticallyconvertCHAR,VARCHAR2,andLONGdatabetweenthedatabasecharactersetandtheusersessioncharacterset(setbytheNLS_LANGUAGEparameteroftheALTERSESSIONstatement),ifthetwocharactersetsaredifferent.
WhenOracleautomaticallyconvertsRAWorLONGRAWdatatoandfromCHARdata,thebinarydataisrepresentedinhexadecimalformwithonehexadecimalcharacterrepresentingeveryfourbitsofRAWdata.Forexample,onebyteofRAWdatawithbits11001011isdisplayedandenteredas'CB.'
LONGRAWdatacannotbeindexed,butRAWdatacanbeindexed.
常用于操作raw类型的函数:UTL_RAW.CAST_TO_RAW,hextoraw.
RAW保存的为16进制数。当使用HEXTORAW时,会把字符串中数据当作16进制数。而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中。
下面是常用到了两个函数:
utl_raw.cast_to_raw([varchar2]);--将varchar2转换为raw类型
utl_raw.cast_to_varchar2([raw]);--将raw转换为varchar2类型
这里varchar2的字符集一般是GB2312。
因为RAW保存的为16进制数。故下面的SQL会报错:insertintotest_rawvalues(hextoraw('hh'))
insertintotest_rawvalues(hextoraw('hh'))
ERROR位于第1行:
ORA-01465:无效的十六进制数字
raw类型数据列常用的位操作:
utl_raw.bit_or();
utl_raw.bit_and();
utl_raw.bit_xor();
在mybatis的sql配置文件中怎样使用like并防止sql注入攻击
#{xxx},使用的是PreparedStatement,会有类型转换,所以比较安全;
${xxx},使用字符串拼接,可以SQL注入;
like查询不小心会有漏动,正确写法如下:
Mysql:select*fromt_userwherenamelikeconcat('%',#{name},'%')
Oracle:select*fromt_userwherenamelike'%'||#{name}||'%'
SQLServer:select*fromt_userwherenamelike'%'+#{name}+'%'
本回答由提问者推荐