在oracle中尝试保存连字符(-)时,为什么要保存倒置的问号?如何摆脱这个?

在oracle中尝试保存连字符(-)时,为什么要保存倒置的问号?如何摆脱这个?,oracle,oracle11g,Oracle,Oracle11g,每当我尝试用语句中的连字符保存Oracle中的任何记录时,保存为Oracle中的倒置问号。只有当我将此插入查询与其他查询合并执行时才会发生这种情况,并使用SQL plus应用程序一次执行所有查询。但当我使用SQLDeveloper单独执行insert查询时,这种情况不会发生。为什么会发生这种情况,解决方法是什么?有多个不同的连字符/破折号/减号: SELECT UNISTR( '\002D' ) AS HyphenMinus, UNISTR( '\2010' ) AS Hyphen

每当我尝试用语句中的连字符保存Oracle中的任何记录时,保存为Oracle中的倒置问号。只有当我将此插入查询与其他查询合并执行时才会发生这种情况,并使用SQL plus应用程序一次执行所有查询。但当我使用SQLDeveloper单独执行insert查询时,这种情况不会发生。为什么会发生这种情况,解决方法是什么?

有多个不同的连字符/破折号/减号:

SELECT UNISTR( '\002D' ) AS HyphenMinus,
       UNISTR( '\2010' ) AS Hyphen,
       UNISTR( '\2011' ) AS NonBreakingHyphen,
       UNISTR( '\2012' ) AS FigureDash,
       UNISTR( '\2013' ) AS EnDash,
       UNISTR( '\2014' ) AS EmDash,
       UNISTR( '\2015' ) AS HorizontalBar,
       UNISTR( '\2043' ) AS HyphenBullet
FROM   DUAL
只有-CHR45在基本ASCII字符集中。如果您的列仅支持此功能,则扩展字符集中的字符可能无法正确显示

您可能需要:

指向支持您正在使用的字符的内容;或 使用NVARCHAR2数据类型而不是VARCHAR2 仅在输入中使用支持的字符,并拒绝扩展字符集中包含ChatActer的任何字符串。
有多个不同的连字符/破折号/减号字符:

SELECT UNISTR( '\002D' ) AS HyphenMinus,
       UNISTR( '\2010' ) AS Hyphen,
       UNISTR( '\2011' ) AS NonBreakingHyphen,
       UNISTR( '\2012' ) AS FigureDash,
       UNISTR( '\2013' ) AS EnDash,
       UNISTR( '\2014' ) AS EmDash,
       UNISTR( '\2015' ) AS HorizontalBar,
       UNISTR( '\2043' ) AS HyphenBullet
FROM   DUAL
只有-CHR45在基本ASCII字符集中。如果您的列仅支持此功能,则扩展字符集中的字符可能无法正确显示

您可能需要:

指向支持您正在使用的字符的内容;或 使用NVARCHAR2数据类型而不是VARCHAR2 仅在输入中使用支持的字符,并拒绝扩展字符集中包含ChatActer的任何字符串。
SQL Developer是基于Java的,它不使用NLS_-LANG设置,但SQL*Plus使用,因此您必须正确设置NLS_-LANG

您没有告诉我们您使用的是哪一个连字符,请参阅MT0的答案。在你的问题中,你采用了U+002D CHR45,它是ASCII格式的-这肯定会产生任何问题

SQL*Plus从调用命令行继承字符集,您必须相应地设置NLS_LANG,例如:

C:\>chcp 1252
Active code page: 1252

C:\>set NLS_LANG=.WE8MSWIN1252

C:\>sqlplus ...

SQL> SELECT UNISTR( '\002D' ) AS HyphenMinus,
  2         UNISTR( '\2010' ) AS Hyphen,
  3         UNISTR( '\2011' ) AS NonBreakingHyphen,
  4         UNISTR( '\2012' ) AS FigureDash,
  5         UNISTR( '\2013' ) AS EnDash,
  6         UNISTR( '\2014' ) AS EmDash,
  7         UNISTR( '\2015' ) AS HorizontalBar,
  8         UNISTR( '\2043' ) AS HyphenBullet
  9  FROM   DUAL;

H H N F E E H H
- - - - - - - -
- - - ¿ – — ¿ ¿

SQL>
您可以看到FigureDash、HorizontalBar和HyphenBullet不受支持,根据您的要求,您必须选择另一个字符集,例如UTF-8

C:\>chcp 65001
Active code page: 65001

C:\>set NLS_LANG=.AL32UTF8
C:\>sqlplus ...

查看以获取有关NLS语言设置的更多信息。

SQL Developer基于Java,不使用NLS语言设置,但SQL*Plus使用,因此您必须正确设置NLS语言

您没有告诉我们您使用的是哪一个连字符,请参阅MT0的答案。在你的问题中,你采用了U+002D CHR45,它是ASCII格式的-这肯定会产生任何问题

SQL*Plus从调用命令行继承字符集,您必须相应地设置NLS_LANG,例如:

C:\>chcp 1252
Active code page: 1252

C:\>set NLS_LANG=.WE8MSWIN1252

C:\>sqlplus ...

SQL> SELECT UNISTR( '\002D' ) AS HyphenMinus,
  2         UNISTR( '\2010' ) AS Hyphen,
  3         UNISTR( '\2011' ) AS NonBreakingHyphen,
  4         UNISTR( '\2012' ) AS FigureDash,
  5         UNISTR( '\2013' ) AS EnDash,
  6         UNISTR( '\2014' ) AS EmDash,
  7         UNISTR( '\2015' ) AS HorizontalBar,
  8         UNISTR( '\2043' ) AS HyphenBullet
  9  FROM   DUAL;

H H N F E E H H
- - - - - - - -
- - - ¿ – — ¿ ¿

SQL>
您可以看到FigureDash、HorizontalBar和HyphenBullet不受支持,根据您的要求,您必须选择另一个字符集,例如UTF-8

C:\>chcp 65001
Active code page: 65001

C:\>set NLS_LANG=.AL32UTF8
C:\>sqlplus ...

查看以获取有关NLS_LANG设置的更多信息。

对于dual中的select“-”结果,您在SQLPlus中得到了什么;命令您的默认转义可能存在一些问题,我认为,默认情况下连字符不应该是特殊字符。当我尝试在sql plus中使用“-”获取结果时,它将返回0条记录。您键盘上的连字符是ASCII 45,所有字符集都支持连字符。您必须粘贴扩展连字符或其他有趣的内容。输入上述选择不应获得0条记录,双do有一条记录。键入该命令,您必须获得一个结果行;命令您的默认转义可能存在一些问题,我认为,默认情况下连字符不应该是特殊字符。当我尝试在sql plus中使用“-”获取结果时,它将返回0条记录。您键盘上的连字符是ASCII 45,所有字符集都支持连字符。您必须粘贴扩展连字符或其他有趣的内容。输入上述选择不应获得0条记录,双do有一条记录。键入正确的命令,您必须得到一个结果行。因为SQL Developer正确插入字符,所以第1个和第2个建议应该无效。显然,数据库和使用的数据类型正确地支持所需的字符。因为SQL Developer正确地插入了字符,所以第一个和第二个建议应该无效。显然,数据库和使用的数据类型正确地支持所需的字符。