更新 table 时如何在 oracle 上转义破折号

How to escape dash on oracle when updating table

乍一看这似乎是一个重复的问题,但我已经尝试了我找到的所有选项,但没有一个对我有用。

这是我正在尝试的声明示例 运行:

UPDATE table_name SET column_name = 'REER – montant minimum'

ON SELECT 我得到:REER ¿ montant minimum

问题可能是您无法查看您的客户端 NLS 设置不支持的某些字符。您需要将客户端字符集设置为与数据库相同。

更新语句应该正常工作:

CREATE TABLE t(
a VARCHAR2(50)
);

INSERT INTO t(a) VALUES ('Hello - blah blah');
UPDATE t SET a = 'REER – montant minimum';
SELECT * FROM t;

A                                                 
------------------------
REER – montant minimum

如果您无法查看字符,那么您的特定于区域设置的 NLS 设置 无法显示该字符。您可以通过将输出假脱机到 HTML 文件并在浏览器中打开来验证它,因为大多数浏览器都支持全球化:

sqlplus user@pass/service
SET MARKUP HTML ON SPOOL ON
SPOOL C;\your_directory\output.html
SELECT column_name FROM table_name;
SPOOL OFF
SET MARKUP HTML OFF

现在在浏览器中打开output.html文件,看看数据是否正确显示。

如果你有数据:

CREATE TABLE table_name (
  id NUMBER,
  column_name VARCHAR2(50)
);

INSERT INTO table_name
SELECT 1, '1' FROM DUAL UNION ALL
SELECT 2, '2' FROM DUAL;

那么如果我 copy/paste 你的更新:

UPDATE table_name
SET column_name = 'REER – montant minimum'
WHERE  id = 1;

如果我手动输入,那么:

UPDATE table_name
SET column_name = 'REER - montant minimum'
WHERE  id = 2;

然后:

SELECT id, column_name, DUMP(column_name)
FROM table_name;

输出:

ID | COLUMN_NAME              | DUMP(COLUMN_NAME)                                                                                                            
-: | :----------------------- | :----------------------------------------------------------------------------------------------------------------------------
 1 | REER ??? montant minimum | Typ=1 Len=30: 82,69,69,82,32,239,191,189,239,191,189,239,191,189,32,109,111,110,116,97,110,116,32,109,105,110,105,109,117,109
 2 | REER - montant minimum   | Typ=1 Len=22: 82,69,69,82,32,45,32,109,111,110,116,97,110,116,32,109,105,110,105,109,117,109                                 

db<>fiddle here

-有什么区别?

  • 第一个是扩展字符集中的一个字符,DUMP 为该字符输出 239,191,189,239,191,189,239,191,189(9 个字节);而
  • 第二个是基本 ASCII 字符集中的一个字符,DUMP 为该字符输出 45(1 个字节)。

如果您想从一个更改为另一个,则:

UPDATE table_name
SET column_name = REPLACE( column_name, '–', '-' );

db<>fiddle here