为什么在 oracle 中尝试保存连字符 (-) 时会保存反转问号 (¿)?如何摆脱这个?



每当我尝试在 oracle 中保存任何在句子中间带有连字符的记录时,它都会在 oracle 中保存为倒置问号。仅当我执行此插入查询并组合使用SQL加应用程序一次执行所有查询时,才会发生这种情况。但是当我使用 SQL 开发人员单独执行插入查询时,不会发生这种情况。为什么会发生这种情况,解决方案是什么。?

SQL

Developer是基于Java的,它不使用NLS_LANG设置,但SQL*Plus使用,因此您必须正确设置NLS_LANG

您没有告诉我们您使用哪个连字符,请参阅MT0的答案。在您的问题中,您选择了 ASCII 格式U+002D (CHR(45)) - 当然这确实会产生任何问题。

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

C:>chcp 1252
Active code page: 1252
C:>set NLS_LANG=.WE8MSWIN1252
C:>sqlplus ...
SQL> SELECT UNISTR( '02D' ) 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>

您会看到 CP1252 不支持 FigureDash、HorizontalBar 和 HyphenBullet,根据您的要求,您必须选择其他字符集,例如 UTF-8

C:>chcp 65001
Active code page: 65001
C:>set NLS_LANG=.AL32UTF8
C:>sqlplus ...

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

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

SELECT UNISTR( '02D' ) 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

只有-(CHR(45)(在基本ASCII字符集中。如果您的列仅支持此功能,则扩展字符集中的字符可能无法正确显示。

检查数据库使用的字符集,您可能需要:

  • 将数据库的字符集更改为支持您正在使用的字符的内容;或
  • 使用 NVARCHAR2 数据类型而不是VARCHAR2
  • 仅在输入中使用支持的字符(并拒绝扩展字符集中包含聊天者的任何字符串(。

最新更新