【问题标题】:Why can I insert a number into a VARCHAR2 column?为什么我可以在 VARCHAR2 列中插入一个数字?
【发布时间】:2016-06-01 17:01:13
【问题描述】:

我的表格有一个奇怪的问题,我正在向表格中插入行,现在我正在尝试对其进行测试,在我的一个测试中,它允许一个它不应该输入的条目。

我的表定义:

CREATE TABLE ITEMS(
ITEM_NUMBER VARCHAR2(3)
CONSTRAINT ITEMS_ITEM_NUMBERf_PK PRIMARY KEY,
ITEM_DESCRIPTION VARCHAR2(30),
ITEM_SIZE VARCHAR2(2),
ITEM_COST NUMBER(30,0),
ITEM_QTY NUMBER(2,0),
ORDER_NUMBER VARCHAR2(4));

当我尝试通过输入 number 来测试 ITEM_SIZE 列时,它只是插入它。

INSERT INTO ITEMS VALUES ('I32', 'Leather blazer', 'L', 14.00, 1, 'O114');
INSERT INTO ITEMS VALUES ('I33', 'Fleece vest', 'L', 28.00, 1, 'O128');
INSERT INTO ITEMS VALUES ('I34', 'Khaki pants', 'S', 22.00, 3, 'O122');
INSERT INTO ITEMS VALUES ('I35', 'Muscle Tee', 'M', 12.99, 1, 'O122');
INSERT INTO ITEMS VALUES ('I36', 'Trench Coat', 'M', 03.00, 1, 'O133');
INSERT INTO ITEMS VALUES ('I37', 'Crewneck sweater', 'XL', 07.00, 1,   'O107');
INSERT INTO ITEMS VALUES ('I38', 'Varsity Sweater', 'M', 08.99, 1, 'O108');
INSERT INTO ITEMS VALUES ('I39', 'CROOK', 'M', 12.00, 1, 'O112');

//--测试者--//

INSERT INTO ITEMS VALUES ('I49', 'bROOK', 10, 12.00, 1, 'O112');

在上面的语句中,我将数字 10 插入到ITEM_SIZE VARCHAR2(2)。我怎样才能避免这种情况?

【问题讨论】:

  • 只是一个未成年人,您输入了 ITEM_SIZEf 而不是 ITEM_SIZE(可能)
  • 是的,我很抱歉之前测试过我的桌子
  • 但仍有问题
  • 我不明白你的问题,请解释清楚
  • 创建检查约束。

标签: sql oracle oracle11g casting insert


【解决方案1】:

正如@kevinsky 所说,Oracle is doing implicit data conversion 在插入时从数字到字符串。

如果您想限制可以放入列中的值,则可以添加a check constraint

alter table items add constraint items_size_chk
  check (item_size in ('XXS','XS','S','M','L','XL','XXL','XXXL'));

Table ITEMS altered.

INSERT INTO ITEMS VALUES ('I49', 'bROOK', 10, 12.00, 1, 'O112');

SQL Error: ORA-02290: check constraint (SCHEMA.ITEMS_SIZE_CHK) violated
02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named check

如果你想要不同的限制,你可以改变检查的方式;例如,您可以进行正则表达式检查以排除数字但允许任何字符。在这种情况下,您似乎更有可能希望允许使用特定值的列表。

请注意,当添加新的有效尺寸时,您必须修改检查约束;并且任何项目都允许使用这些尺寸值中的任何一个。

如果有效大小来自另一个表,那么您可以改用外键约束。您可能确实需要对每个项目有效的尺寸(或其他属性)列表,因此您的数据模型可能需要一些充实。

【讨论】:

  • Alex 在最后一段中所说的是此类问题的正确解决方案。
【解决方案2】:

Oracle 正在将数字 10 隐式转换为 varchar2 字符串 '10'。

这是另一个隐式转换

SELECT item_size + 1  FROM items;

Oracle 11g 中的结果是

11

我不确定这在构建解析器时是否会有所帮助,但它确实会引起很多混乱。但是 Oracle 不会将字母字符隐式转换为数字。它会失败。

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2013-03-22
    • 1970-01-01
    • 2010-09-27
    • 2016-08-19
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多