将字符插入数字数据类型列

时间:2015-05-07 14:25:35

标签: sql database oracle oracle11g type-conversion

注意:我无法更改列

的数据类型

我想将一个字符存储到一个具有数字数据类型列的表中。

我发现的工作是将字符值转换为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时,我希望它返回确切的字符串。

请帮助我尝试了很多功能。

提前致谢。

3 个答案:

答案 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个字符,但它将取决于实际字符串及其十六进制表示。

(我不赞同这种做法,这只是一个有趣的问题)。