DB2 错误 字符串列、主变量、常量或函数的使用不当
Posted
技术标签:
【中文标题】DB2 错误 字符串列、主变量、常量或函数的使用不当【英文标题】:DB2 error Improper use of a string column, host variable, constant, or function 【发布时间】:2013-04-01 10:15:18 【问题描述】:我正在尝试在所有表和列中搜索某个值,并且我正在使用 php 连接到 IBM DB2 数据库。我想知道这个错误是否是由于多次使用联合造成的。
这是我的错误信息:
Improper use of a string column, host variable, constant, or function "NAMABARANG". SQLSTATE=42907 SQLCODE=-134
这是我的代码:
$keyword=$_GET['keyword'];
$query="SELECT * FROM INVENTORY WHERE NAMABARANG LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE ARRIVALDATE LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE PAPERNUMBER LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE SERIALNUMBER LIKE '%".$keyword."%'".
" UNION SELECT * FROM INVENTORY WHERE CONDITION LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE LOCATION LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE CONFIRMATIONDATE LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM INVENTORY WHERE BARCODE LIKE '%".$keyword."%'".
" UNION ALL SELECT * FROM USERANDPASSWORD WHERE USERNAME LIKE '%".$keyword."%'";
" UNION ALL SELECT * FROM USERANDPASSWORD WHERE ACCESS LIKE '%".$keyword."%'";
【问题讨论】:
在您的上下文中,Namabaran 是什么?您是否尝试过按“部分”执行查询,每个选择单独执行,然后仅按对执行联合,等等。 Namabarang 是一个字段名 【参考方案1】:查看有关该错误消息 here 的信息。问题似乎是NAMABARANG
是长字符/ clob 类型之一,在执行分组的查询中使用它是非法的。此查询执行分组,因为其中一个子查询使用UNION
而不是UNION ALL
。 UNION
删除重复行时的分组。
这样的查询可能不会返回所有列 (SELECT *
)。相反,只返回你真正需要的东西。可能是一个 ID 列,可以识别匹配的每一行,以及匹配的列和表的名称。这将消除错误。
其他几点:
您的代码非常不安全!您直接从表单中获取参数并将其插入 SQL。有人可以用它来做各种邪恶的事情,甚至从你的数据库中删除表。请查看the first answer to this question,了解在查询中使用用户输入数据的安全方式。 您正在合并来自两个不同表的行USERANDPASSWORD
是否具有与 INVENTORY
完全相同的列?否则,这个工会将无法运作。通过不选择 *
来解决此问题,而是从每个表中选择一组相似的列。
UNION 或 UNION ALL? 如果不止一列包含搜索字符串,是否要从单行返回多个匹配项?如果是这样,请使用UNION ALL
。否则,请使用 UNION
删除重复项。
【讨论】:
非常感谢您的帮助,现在错误已解决。我想删除多个匹配记录,但我在位置和条件字段中使用了 long varchar,除了编辑字段数据类型还有其他方法吗? @StephenAdipradhana,long varchar
在最近的 DB2 版本中已弃用。你可能不应该使用它。在最近的版本中,常规的varchar
可以容纳 32K 字节(与 long varchar 一样多)。有关详细信息,请查看特定版本的手册。
我尝试使用 Data Studio 3.2 将表更改为 varchar(100),但失败了,错误消息是:ALTER TABLE "DB2ADMIN.INVENTORY" 为列 "NAMABARANG" 指定的属性不是与现有列兼容.. SQLCODE=-190, SQLSTATE=42837, DRIVER=3.64.106
@StephenAdipradhana,也许你有超过 100 个字符的数据?或者也许它根本不允许您将列从 long varchar 更改为其他内容?另一种选择是创建一个新列,然后通过更新复制值,然后删除旧列,然后重命名新列。
我通过将 long varchar 更改为 char(100) 找到了解决方案,似乎不允许将 long varchar 更改为 varchar。感谢您的帮助。以上是关于DB2 错误 字符串列、主变量、常量或函数的使用不当的主要内容,如果未能解决你的问题,请参考以下文章