123
返回列表 发新帖
楼主: bisal

[讨论] 一张表有多个VARCHAR2类型

[复制链接]
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
21#
发表于 2014-9-23 21:27 | 只看该作者
Thanks for the update. Looks like "Even if a VARCHAR2(2000) column only contains 1 character, this is treated as if you're using a LONG" is correct. What a nasty bug!

使用道具 举报

回复
论坛徽章:
7
茶鸡蛋
日期:2013-06-14 13:16:17优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:022015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31ITPUB社区OCM联盟徽章
日期:2016-07-13 18:10:08
22#
 楼主| 发表于 2014-9-24 09:14 | 只看该作者
Yong Huang 发表于 2014-9-23 21:27
Thanks for the update. Looks like "Even if a VARCHAR2(2000) column only contains 1 character, this i ...

呵呵,不知道为什么有这种限制。

使用道具 举报

回复
论坛徽章:
7
茶鸡蛋
日期:2013-06-14 13:16:17优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:022015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31ITPUB社区OCM联盟徽章
日期:2016-07-13 18:10:08
23#
 楼主| 发表于 2014-9-25 09:04 | 只看该作者
Yong Huang 发表于 2014-9-23 21:27
Thanks for the update. Looks like "Even if a VARCHAR2(2000) column only contains 1 character, this i ...

Bug 1400539 : GETTING ORA-1461 WHEN INSERTING INTO A VARCHAR FIELD
最后几行说:”My ct discovered this bug can be reproduced with only a single column (varchar2(4000))in the table.“,但实际只有一个VARCHAR2(4000)时是不会出现这个bug的。

使用道具 举报

回复
论坛徽章:
7
茶鸡蛋
日期:2013-06-14 13:16:17优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:022015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31ITPUB社区OCM联盟徽章
日期:2016-07-13 18:10:08
24#
 楼主| 发表于 2014-9-25 09:19 | 只看该作者
Yong Huang 发表于 2014-9-23 21:27
Thanks for the update. Looks like "Even if a VARCHAR2(2000) column only contains 1 character, this i ...

有尝试了下:
create table TBL_LV1
(
  A LONG,
  B VARCHAR2(10)
);

proc可以插入,符合说的:
The same table either has another LONG column or at least 1 other VARCHAR2 with a length over 1333 bytes.
这种情况下会出现这个bug的问题

使用道具 举报

回复
论坛徽章:
7
茶鸡蛋
日期:2013-06-14 13:16:17优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:022015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31ITPUB社区OCM联盟徽章
日期:2016-07-13 18:10:08
25#
 楼主| 发表于 2014-9-25 09:23 | 只看该作者
Yong Huang 发表于 2014-9-23 21:27
Thanks for the update. Looks like "Even if a VARCHAR2(2000) column only contains 1 character, this i ...

Problem symptoms
(1) Using PRO*C or OCI.
(2) Database character set is set a multibyte character set. For example UTF8, AL32UTF8, JA16SJIS or JA16EUC.
(3) Trying to insert a VARCHAR2 into a column that is defined with a length of more than 1333 bytes.
(4) The same table either has another LONG column or at least 1 other VARCHAR2 with a length over 1333 bytes.
(5) NLS_LANG is set to a single-byte character set. For example american_america.WE8ISO8859P1

MOS说的5个情况,所以我觉得(3)是有问题的,至少单独有这个条件是不会出现问题的,除非两个以上的LONG或VARCHAR2(>1333)字段,此时INSERT插入两个以上的场景下,才会有这个问题。

使用道具 举报

回复
论坛徽章:
7
茶鸡蛋
日期:2013-06-14 13:16:17优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:022015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31ITPUB社区OCM联盟徽章
日期:2016-07-13 18:10:08
26#
 楼主| 发表于 2014-9-25 11:18 | 只看该作者
Yong Huang 发表于 2014-9-22 23:46
> 但如果向A和B同时插入,则会报这个错误。

So, even if column b takes a single character, it won't  ...

CREATE TABLE tbl_lv (a LONG, b VARCHAR2(2000));
很是奇怪,我刚执行了但没有报错,只有当有两个或以上VARCHAR2,且INSERT两个或两个以上VARCHAR2时会报错:
create table TBL_LV1
(
  A LONG,
  B VARCHAR2(2000),
  C VARCHAR2(2000)
);

使用道具 举报

回复
论坛徽章:
7
茶鸡蛋
日期:2013-06-14 13:16:17优秀写手
日期:2013-12-18 09:29:112014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:022015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31ITPUB社区OCM联盟徽章
日期:2016-07-13 18:10:08
27#
 楼主| 发表于 2014-9-25 13:48 | 只看该作者
Yong Huang 发表于 2014-9-22 23:46
> 但如果向A和B同时插入,则会报这个错误。

So, even if column b takes a single character, it won't  ...

貌似找到原因了。

proc中如果用:
EXEC SQL INSERT INTO TBL_LV1(A, B) VALUES('a', 'b');
不报错,即使AB是VARCHAR2(10)或VARCHAR2(4000)

proc中如果用:
EXEC SQL INSERT INTO TBL_LV1(A, B) VALUES(:a, :b);
报错,即使AB是VARCHAR2(10)或VARCHAR2(4000)

其中a,b的定义:
char a[4001], b[4001];
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
strcpy(a, "a");
strcpy(b, "b");

因此很可能是proc中使用char数组插入VARCHAR2类型会出现问题,若使用varchar的proc类型,可能就可以,但奇怪的是proc服务器字符集是AMERICAN_AMERICA.ZHS16CGB231280,数据库服务器字符集是ZHS16GBK,BGK都是双字符集吧,我插入a一个字符,也不存在>4000的可能呢?

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
28#
发表于 2014-9-25 21:38 | 只看该作者
This is still the problem in 9i only. Correct? I'd just upgrade the database. It's sooooooooooo historical!

> proc中如果用:
> EXEC SQL INSERT INTO TBL_LV1(A, B) VALUES(:a, :b);
> 报错,即使AB是VARCHAR2(10)或VARCHAR2(4000)

Looks like using bind variables makes the case worse.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表