Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串用于非字符串特定数据的缺点是什么?_Java_Types - Fatal编程技术网

Java 将字符串用于非字符串特定数据的缺点是什么?

Java 将字符串用于非字符串特定数据的缺点是什么?,java,types,Java,Types,我知道这可能是一个“愚蠢”的问题。我以前创建过软件应用程序,基本上将所有变量初始化为字符串,并将它们作为VARCHARs保存在数据库中。然后,我会从数据库中收集它们,并根据需要进行转换。是否有任何原因表明这不是一种初始化变量并将其保存在数据库中的有效方法 我知道,对于非常大的应用程序,这可能会导致计算时间问题,因为我不必要地转换本来可以初始化为适当类型的变量。但是,对于较小的应用程序,这样做“可以”吗?有一些原因。例如,考虑搜索时间范围。使用datetime字段很容易找到。但使用字符串并不容易,

我知道这可能是一个“愚蠢”的问题。我以前创建过软件应用程序,基本上将所有变量初始化为字符串,并将它们作为VARCHARs保存在数据库中。然后,我会从数据库中收集它们,并根据需要进行转换。是否有任何原因表明这不是一种初始化变量并将其保存在数据库中的有效方法


我知道,对于非常大的应用程序,这可能会导致计算时间问题,因为我不必要地转换本来可以初始化为适当类型的变量。但是,对于较小的应用程序,这样做“可以”吗?

有一些原因。例如,考虑搜索时间范围。使用datetime字段很容易找到。但使用字符串并不容易,因为您必须在应用程序中执行此操作

另一点是,varchar上的排序与int类型字段不同。在varchar中,10在2之前,但在int中,它在2之后。

使用正确类型的一些原因 1。毫不奇怪。如果开发人员打算从您的数据库中获取数字数据,他们会发现您将其存储为字符串很奇怪

2。开发人员方便。另一个麻烦是每次都必须将数据解析为正确的类型。如果您只是将其存储为正确的类型,那么您就可以省去人们不得不放置的麻烦

int age = 0;
try {
  age = Integer.parseInt(ageStr);
} catch (NumberFormatException e) {
  throw new RuntimeException(e);
}
所有的代码

3。数据质量。上面的代码示例提示了第三个问题。现在有人可以在列中存储“no_age”或“foo”之类的内容,这是一个数据质量问题。处理错误的最好方法是首先让错误变得不可能

4。存储效率。存储效率也是一个因素。不同类型的数据有不同的编码方式,字符串不是存储数字、位等的有效方式

5。网络效率。如果您以浪费的格式存储数据,那么这通常会转化为不必要的网络利用率。这就是为什么二进制格式通常比JSON或XML等文本格式更有效。但是web服务通常不会将网络效率视为驱动工程问题

6。处理效率。如果数据本身就是数字,那么强制所有人解析它会导致处理成本

7。不同的类型支持不同的规则。在他的回答中,Hightower提出了一个很好的观点,即不同的类型对排序有特殊的规则,这会影响范围和排序。我喜欢这一点,因为它会影响实际的程序行为,而我上面提到的问题对于只有一个开发人员的小型应用程序来说可能更具学术性

举例说明效率效益 假设您要存储八位。如果要将其存储为字符串,则可能有“TFFTFFTF”,在UTF-8和ASCII下,它需要64位(每个字符8个字符x 8位)来存储8位实际信息。相对而言,这是一个很大的区别

顺便说一句,例如,即使您的数据是数字的,也不能只使用
BIGINT
。数据库中不同类型的整数有不同的存储要求,因此您应该考虑实际需要的位数,如果合适,使用无符号表示(没有理由在不能为负的数字上浪费符号位),等等。当您创建新的外键时,错误的选择往往会迅速增加,这些外键现在必须是bigint,新行都有一堆bigint,等等。您的存储和备份需求最终会变得不必要

所以是否可以使用字符串? 这些效率问题对于一些小事情可能根本不重要,这正是你所要求的。或者,正如我上面的JSON/XML示例所示,可能有理由选择效率较低的格式,而不是效率更高的格式。至于它是否“OK”,我无法回答,但希望上面的考虑能给你一些工具,让你自己做出决定


尽管如此,我还是会努力养成使用正确类型的习惯,而且我肯定不会无缘无故地把东西存储为字符串。在位集的情况下,我可以看到避免处理位操作的可能性,在掌握窍门之前,这可能会很棘手。(但有些数据库有特殊的位集类型。)您提到不知道类型,在某些情况下这可能是一个合理的原因,尽管我在这里更倾向于重构。

有什么理由这样做吗?“过度严格类型的代码通常很难理解,并在运行时引发编译器通常会发现的错误。”我以前做过,但这是因为我必须为我制作的应用程序创建一个命令列表。因此,用户必须输入字符串ofc,然后我将使用regex确保输入的格式正确,具体取决于所查询的命令类型。因此,在本例中,我实际上需要使用字符串,但随后将每个标记转换为它的实际类型,并调用用户首先需要调用的命令。这是一个有一定潜力的问题,但现在它的措辞过于宽泛。我想说的是,讨论这样做是否“好”可能不是全部问题;您想知道数据库建模和将正确类型的数据存储到数据库中。我会改写一下标题,但我想让你把问题的主体部分整理一下。这可能会造成完全不必要的混乱。您将失去编程语言和数据库的大部分功能和灵活性。为什么要这样做?很好的例子说明了使用错误类型的行为后果。是的,非常好的例子。谢谢你。你做了一些很棒的工作