我们原来的服务器上的Oracle是不区分单引号的现在的表结构是:
create table M_PROJECT_WORK
(
WORK_ID VARCHAR2(31) not null,
AUDITTYPE_CODE VARCHAR2(15),
WORK_URL VARCHAR2(255),
WORK_ORDER INTEGER,
WORK_IFNEEDS CHAR(1),
WORK_ITEM_ID VARCHAR2(31),
AUDITTYPE CHAR(2)
)现在用一下的两条语句查出来的结果都是一样的
select * from M_PROJECT_WORK where work_id='20';
select * from M_PROJECT_WORK where work_id=20;
换了新的服务器之后执行以下的语句直接报:无效的字符select * from M_PROJECT_WORK where work_id=20;
求教
---select * from M_PROJECT_WORK where work_id=20;
work_id='20'认为字符串类型的与定义的类型相匹配而第二个
work_id=20 整数型的与实际定义的数据类型是不相匹配的,所以要进行数据类型
转化为字符串类型要用到to_char()函数了。
改成加单引号的SQL: select * from M_PROJECT_WORK where work_id='20'
隐式转换不是配置的,oracle本身就有的功能,但是尽量不要用,类型不一致的地方,要用显式转换。select * from M_PROJECT_WORK where work_id=20; 表中定义work_id为varchar2,那你等号右边就得用字符,不能用数字,这是规范。像这样的语句你可以改成:select * from M_PROJECT_WORK where work_id='20' 或 select * from M_PROJECT_WORK where work_id=to_char(20)
----------------------------------------
20scott@TBWORA> insert into tb(work_id) values('T40');已创建 1 行。scott@TBWORA> select * from tb where work_id=20;
ERROR:
ORA-01722: 无效数字未选定行-- 最后一个查询语句:会先将 work_id 字段隐式转换为 number 类型,
-- 但是:当 work_id 字段的数据中,
-- 有不能转换为 number 类型的数据
-- (某个 work_id 字段的数据中函数字符串,导致隐式转换过程失败)时,查询出错!
-- 同理:无效字符!
-- 但是:当 work_id 字段的数据中,
-- 有不能转换为 number 类型的数据
-- (某个 work_id 字段的数据中含有字符串,导致隐式转换过程失败)时,查询出错!
高版本的可以支持类型自动转换,低的不行。