每当我尝试在 oracle 中保存任何在句子中间带有连字符的记录时,它都会在 oracle 中保存为倒置问号。仅当我执行此插入查询并组合使用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
- 仅在输入中使用支持的字符(并拒绝扩展字符集中包含聊天者的任何字符串(。