当你有一个固定长度的字符列,但不知道列有多大时,你如何有效地使用OracleCommand和Parameters从Oracle DB中获取数据?
让我们假设我们想要得到一个名为IID的ID,它是一个固定的char(5字节)。
OracleCommand myCommand1;
myCommand1.CommandText = "SELECT * FROM IDS WHERE IID = :IID";
myCommand1.Parameters.AddWithValue("IID", "1234");
不会返回一个项目,但
myCommand1.Parameters.AddWithValue("IID", "1234 ");
因为它与数据库中的5个字节匹配
也可以指定空间
myCommand1.Parameters.Add("IID", OracleDbType.Char, 5).Value = "1234";
但在我的例子中,只是假设程序员并不总是知道数据库中定义的字符大小的确切数量(如果它有意义或没有)。我使用德瓦特,但我认为这是一个更普遍的问题。如何在不使用填充的情况下传递“1234”参数?
先谢谢你了
1条答案
按热度按时间xghobddn1#
在数据类型比较规则文档中:
空白填充和非填充比较语义
使用空白填充语义,如果两个值的长度不同,则Oracle首先将空白添加到较短的值的末尾,以便它们的长度相等。Oracle然后逐字符比较这些值,直到第一个不同的字符。在第一个不同位置具有较大字符的值被认为是较大的。如果两个值没有不同的字符,则认为它们相等。此规则意味着如果两个值仅在尾随空格数上不同,则它们相等。仅当比较中的两个值都是数据类型
CHAR
、NCHAR
、文本文字的表达式或USER
函数返回的值时,Oracle才使用空白填充比较语义。使用非填充语义时,Oracle逐字符比较两个值,直到第一个不同的字符为止。在该位置具有较大字符的值被视为较大。如果两个不同长度的值直到较短的值的末尾都是相同的,则较长的值被认为是较大的。如果两个长度相等的值没有不同的字符,则认为这两个值相等。只要比较中的一个或两个值具有
VARCHAR2
或NVARCHAR2
数据类型,Oracle就使用非填充比较语义。如果你有两个
CHAR
值,那么Oracle应该使用Blank-Padded Comparison Semantics,并向字符串中添加空格,直到它们的长度相等。如果您有一个或多个
VARCHAR2
值,则Oracle将使用Non-Padded Comparison Semantics。这意味着你应该能够传递任何长度的
CHAR
,它将在适当的长度进行比较:CHAR
,而应使用VARCHAR2
。