注意:我无法更改列
的数据类型我想将一个字符存储到一个具有数字数据类型列的表中。
我发现的工作是将字符值转换为ASCII,当从数据库中检索它时,将其转换回字符。
我使用了几个函数ASCII和ASCIISTR,但这些函数的限制是它们只转换字符串的第一个字符。
所以我使用了转储功能
for (int i = 0; i < Screen.Width; i +=sizeOfCube)
{
Instantiate(cube, new vector3(i, 10, 0));
}
结果:Typ = 96 Len = 15:80,117,110,101,101,116,95,107,117,115,104,119,97,104,49
此函数给出所有字符的ASCII值。然后我执行以下查询
select dump('Puneet_kushwah1') from dual;
结果:80 117 110 101 101 116 95 107 117 115 104 119 97 104 49
然后我使用了一个特殊字符来填充空格,这样我就可以在从数据库中检索时替换它。
select replace(substr((DUMP('Puneet_kushwah1')),(instr(DUMP('Puneet_kushwah1'),':')+2 )),',',' ') from dual;
表格定义:
select replace(substr((DUMP('Puneet_kushwah1')),(instr(DUMP('Puneet_kushwah1'),':')+2 )),',','040') from dual;
Result: 80040117040110040101040101040116040950401070401170401150401040401190409704010404049
然后我将其插入表格
create table test (no number);
问题1 : 当我执行
INSERT into test SELECT replace(substr((DUMP('Puneet_kushwah1')),(instr(DUMP('Puneet_kushwah1'),':')+2 )),',','040') from dual;
我得到了
结果:8.004011704011E82
我想将其转换为数字。与我插入的完全相同。
问题2:
然后当我执行select时,我希望它返回确切的字符串。
请帮助我尝试了很多功能。
提前致谢。
答案 0 :(得分:5)
您无法获得确切的字符串,因为Oracle数字最多只能存储38位精度。
所以,如果你运行这个:
select cast(no as varchar2(100))
from test;
你会得到:
80040117040110040101040101040116040950400000000000000000000000000000000000000000000
答案 1 :(得分:3)
虽然我建议不要这样做,因为这可能会导致错误和可能的维护噩梦,我确实喜欢挑战,并且自己也被迫做一些棘手的事情,以便让一些供应商的奇怪做事工作方式对我们来说,如果是这样我会同情你。所以,为了它的乐趣,请检查出来。
转换为十六进制,然后转换为十进制并插入数据库(x_test有一个NUMBER列),然后选择,转换回来:
SQL> insert into x_test
2 select to_number(rawtohex('Puneet_kushwah1'), rpad('X', length(rawtohex('Puneet_kushwah1')), 'X')) from dual;
1 row created.
SQL> select * from x_test;
col1
----------
4.1777E+35
SQL> SELECT utl_raw.cast_to_varchar2(hextoraw(trim(to_char(col1, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'))))
2 FROM x_test;
UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW(TRIM(TO_CHAR(col1,'XXXXXXXXXXXXXXXXXXXXXXXXXXXX
--------------------------------------------------------------------------------
Puneet_kushwah1
SQL>
答案 2 :(得分:2)
虽然这是一个可怕的想法和一个可怕的数据模型,但可以通过将原始表示转换为数字来将某些字符串转换为数字:
create or replace function string_to_number(p_string varchar2)
return number as
l_raw raw(40);
l_number number;
begin
l_raw := utl_i18n.string_to_raw(data => p_string, dst_charset => 'AL32UTF8');
l_number := to_number(rawtohex(l_raw), 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
return l_number;
end;
/
又回来了:
create or replace function number_to_string(p_number number)
return varchar2 as
l_raw raw(40);
l_string varchar2(20);
begin
l_raw := hextoraw(to_char(p_number, 'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'));
l_string := utl_i18n.raw_to_char(data => l_raw, src_charset => 'AL32UTF8');
return l_string;
end;
/
您可以将其用作:
insert into test (no) values (string_to_number('Puneet_kushwah1'));
1 row inserted.
select * from test;
NO
---------------------------------------
417765537084927079232028220523112497
select number_to_string(no) from test;
NUMBER_TO_STRING(NO)
--------------------------------------------------------------------------------
Puneet_kushwah1
你真的不需要功能,你可以在线进行转换;但是这使得发生的事情变得更加清晰。
但是你受到数字类型精度的限制。我认为你只限于20个字符,但它将取决于实际字符串及其十六进制表示。
(我不赞同这种做法,这只是一个有趣的问题)。