有关Oracle区分单引号和不区分单引号的问题

lgq_0714 2011-08-24 05:30:52

我们原来的服务器上的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;


求教

...全文
246 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgq_0714 2011-08-29
  • 打赏
  • 举报
回复
谢各位了
coolkisses 2011-08-25
  • 打赏
  • 举报
回复
有可能是上面说的原因
最终,还是书写不规范造成的。
楼主最好把书写规范一下吧。
luoyoumou 2011-08-25
  • 打赏
  • 举报
回复
-- 最后一个查询语句:会先将 work_id 字段隐式转换为 number 类型,
-- 但是:当 work_id 字段的数据中,
-- 有不能转换为 number 类型的数据
-- (某个 work_id 字段的数据中含有字符串,导致隐式转换过程失败)时,查询出错!
luoyoumou 2011-08-25
  • 打赏
  • 举报
回复
-- 给个例子给你,你可能就明白啦:

scott@TBWORA> create table tb(work_id varchar2(20));

表已创建。

scott@TBWORA> insert into tb(work_id) values('20');

已创建 1 行。

scott@TBWORA> insert into tb(work_id) values('30');

已创建 1 行。

scott@TBWORA> select * from tb where work_id=20;

WORK_ID
----------------------------------------
20

scott@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 字段的数据中函数字符串,导致隐式转换过程失败)时,查询出错!


-- 同理:无效字符!


hanzs 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lgq_0714 的回复:]
现在是一台服务器上可以不加单引号另外一台服务器上可以,这样导致一台服务器的有些功能不可用,

这个隐式转换是在什么地方配置的吗?

谢谢
[/Quote]

隐式转换不是配置的,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)
007-x 2011-08-25
  • 打赏
  • 举报
回复
LZ说一台服务器可以一台不行, 这里的服务器是指DB Server还是AP Server, 如果是AP Server的话就是要看用的是什么provider, 如果是DB Server,可能是数据不同. 不管怎么说这样的情况还是建议改写SQL.
改成加单引号的SQL: select * from M_PROJECT_WORK where work_id='20'
阿坚87 2011-08-25
  • 打赏
  • 举报
回复
接分.
Rotel-刘志东 2011-08-25
  • 打赏
  • 举报
回复
--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()函数了。

ylp198296 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luoyoumou 的回复:]
-- 最后一个查询语句:会先将 work_id 字段隐式转换为 number 类型,
-- 但是:当 work_id 字段的数据中,
-- 有不能转换为 number 类型的数据
-- (某个 work_id 字段的数据中含有字符串,导致隐式转换过程失败)时,查询出错!
[/Quote]还是罗老湿牛!顶
yixilan 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 lgq_0714 的回复:]
我们原来的服务器上的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……
[/Quote]
两个服务器ORACLE的版本不一致吧?
高版本的可以支持类型自动转换,低的不行。
lgq_0714 2011-08-24
  • 打赏
  • 举报
回复
现在是一台服务器上可以不加单引号另外一台服务器上可以,这样导致一台服务器的有些功能不可用,

这个隐式转换是在什么地方配置的吗?

谢谢
hanzs 2011-08-24
  • 打赏
  • 举报
回复
你这不是区分单引号与不区分的问题,是书写不规范

明显 work_id=20 两边类型不一样!!!

你这样写要oracle给你进行隐式转换,把整数20转换换字符串
areswang 2011-08-24
  • 打赏
  • 举报
回复
不是引号的问题,是数据类型隐型转换的问题。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧