【问题标题】:ORA-01756: quoted string not properly terminated, do i need to add quote on the phone number, why?ORA-01756: 引号字符串未正确终止,我需要在电话号码上添加引号,为什么?
【发布时间】:2019-07-22 17:15:26
【问题描述】:
SQL> create table customer(
  2  customer_ID number(3) primary key,
  3  customer_Name varchar2(26),
  4  contact_Name  varchar2(26),
  5  phone number(10));

Table created.

SQL> desc customer
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CUSTOMER_ID                               NOT NULL NUMBER(3)
 CUSTOMER_NAME                                      VARCHAR2(26)
 CONTACT_NAME                                       VARCHAR2(26)
 PHONE                                              NUMBER(10)
SQL> insert into customer 
        (customer_ID, customer_Name, contact_Name, phone) 
        values (23, 'Dave's Sub Shop', 'David Logan', 555-333-4545);
ERROR:
ORA-01756: quoted string not properly terminated

谁能帮我解释一下这个错误?

【问题讨论】:

  • 它是:'Dave's Sub Shop' 你在引用的字符串中有一个引号,导致它认为 Dave 是你试图为 customer_Name 插入的内容

标签: sql string oracle sql-insert create-table


【解决方案1】:

您需要避开 Dave's Sub Shop 中的撇号。

【讨论】:

    【解决方案2】:

    这里有两个问题:

    • 您正在插入一个包含嵌入式单引号的字符串:'Dave's Sub Shop'。该故障出现在任何体面的文本编辑器(包括 SO)中。您需要转义引用:'Dave''s Sub Shop'

    • phone_number 列被声明为number(10),但是您尝试插入的内容看起来不像:555-333-4545。您应该将列 datatpe 更改为 varchar(12)。然后您需要引用您插入的值。

    Demo on DB Fiddle

    create table customer(
        customer_ID number(3) primary key,
        customer_Name varchar2(26),
        contact_Name  varchar2(26),
        phone varchar(12));
    
    insert into customer 
            (customer_ID, customer_Name, contact_Name, phone) 
            values (23, 'Dave''s Sub Shop', 'David Logan', '555-333-4545');
    
    1 rows affected
    
    select * from customer;
    
    CUSTOMER_ID | CUSTOMER_NAME   | CONTACT_NAME | PHONE       
    ----------: | :-------------- | :----------- | :-----------
             23 | Dave's Sub Shop | David Logan  | 555-333-4545
    

    NB:另一种解决方案是在插入之前将电话号码转换为数字数据类型(例如,通过删除嵌入的 -),但我不推荐它,因为电话号码实际上是 not 数字:它们可能有有意义的前导零,并且可能包含非数字字符(()+、...)

    【讨论】:

    • 谢谢,它可以工作,但是号码'555-333-4545'不需要报价,添加报价将是另一个错误。我想让电话号码变成(555)333-4545,我试试这个也显示错误。
    • @YongmingLiu - “引用值”表示将其括在引号中;在这种情况下单引号。 555-333-4545 不是数字;您必须将其或 (555)333-4545 视为字符串 - 通过将它们放在单引号中,并确保您存储它们的列是 varchar2 并且足够大以容纳您可能想要存储的最长值。您的新值现在是 13 个字符,因此您至少需要 varchar2(13)
    • 我明白了,非常感谢。
    • 我只想将我的大拇指添加到@GMB 关于不将电话号码存储为 NUMBER 的评论。在阅读他的内容之前,我已经对此发表了评论。我们的生活(和数据)充满了不是数字的“数字”——电话、社会保障、车辆识别。我的经验法则是,“如果对其进行算术运算是不合逻辑的,那么它就不是一个数字,所以将它声明为 varchar2 并这样对待它。”
    • 感谢@EdStevens 的评论!
    【解决方案3】:

    你想要:

    insert into customer (customer_ID, customer_Name, contact_Name, phone) 
        values (23, 'Dave''s Sub Shop', 'David Logan', '555-333-4545');
    

    您的错误是由于“Dave's Sub Shop”造成的。第一个引号作为字符串的结尾,所以错误出现在s

    555-333-4545 不一定会产生错误。但它会产生数字 -4323,这不是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多