【问题标题】:Oracle - How to encode a string as a number and retrieve the original string from that numberOracle - 如何将字符串编码为数字并从该数字中检索原始字符串
【发布时间】:2017-03-20 09:30:12
【问题描述】:

我想将字符串编码为数字并使用另一个函数从该数字中检索原始字符串。它只需要支持 0 到 255 之间的 ascii 字符,而不是 unicode。数字可以是整数或浮点数。

正在考虑将 ascii 值乘以位置和 256,然后将结果相加,但不确定这是否可行。

字符串的长度最多为 240 个字符。

预期用途是将字符串值转换为数字值以用于机器学习算法;因为很多机器学习算法需要一个数值而不是一个字符串值。

【问题讨论】:

  • 你为什么要这样做?在任何情况下,每个字符都需要一个字节。用这种方法你不会走得太远。
  • 需要一个快速函数将字符串转换为数字以用于机器学习。
  • xyproblem.info。我建议关闭这个问题并打开一个包含真正问题的新帖子。
  • 根据 cmets 提供的附加信息。
  • @Superdooperhero:请阅读thisthis

标签: sql oracle plsql


【解决方案1】:
function str2num
(
   p_string in varchar2
)  return number is

l_i      number(15);
l_c      number(15);
l_answer number(38);

begin

   l_answer := 0;
   for l_i in 1..length(p_string) loop
      l_c := ascii(substr(p_string, l_i, 1));
      l_answer := l_answer + (l_c * power(2, (l_i - 1) * 8));
   end loop;

   return l_answer;

end str2num;

只能处理 52 个字符,但已经足够了。现在的问题是,相反的功能是什么。

【讨论】:

  • 假设你的字符串是:ABC A=65, B=66, C = 67 CodeNum = 65+66*256+67*256*256=4407873 4407873/(256*256) = 67 - ---> C 4407873 % (256*256) = 16961 16961 / 256 = 66 ---> B 16961 % 256 = 65 ---> A 正如我之前告诉你的,我认为你不能“编纂”超过 4 或 5 个字符(溢出数字)
  • 以这种方式编码的 240 个字符的字符串将远远超过 Oracle NUMBER 的容量。 240^256 ~= 7e+608.
【解决方案2】:

假设起始位置为1:

ASCII 值 * 256^(位置 - 1)

字符串可以有多长?数值可能会非常高!

如果您正在谈论的字符串是“有限的”(数量)和重复的(例如单词或句子),您可以将它们写在表中(id bigint,descr VARCHAR(240))并使用 id 作为数字.你怎么看?

【讨论】:

  • 字符串长度可以是240个字符
  • 你可以想象,这个数字可能太大了!
  • 将它写入表格正是我想要避免的。
  • 我认为 etsa 可能在这里有所作为,除了公式可能是 ASCII_VALUE*2^(Position - 1)
  • @Superdooper:我认为它是 256^ 而不是 2^(在二进制位置数字系统中它是 2^,但在这种情况下它就像一个 256 数字系统,即具有 256 个不同符号的系统. 在有十个不同符号的系统中,你有 10^ - 我们通常的十进制数字系统)
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2014-05-09
  • 2021-05-21
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多