更新 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
根据 Oracle 文档,我有两种转义特殊字符的方法:
{} 转义一串字符或符号
\ 转义单个字符或符号(我的情况,但我也试过 {} 以防万一)
ON SELECT 我得到:REER \¿ montant minimum
或 REER {¿} montant minimum
我也试过 SET ESCAPE ON 但我得到一个错误:
ORA-00922: 选项缺失或无效
在别处找到并尝试了'||'-'||'
不用说,没用。
ON SELECT 我得到:'||'-'||'
问题可能是您无法查看您的客户端 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
乍一看这似乎是一个重复的问题,但我已经尝试了我找到的所有选项,但没有一个对我有用。
这是我正在尝试的声明示例 运行:
UPDATE table_name SET column_name = 'REER – montant minimum'
ON SELECT 我得到:REER ¿ montant minimum
根据 Oracle 文档,我有两种转义特殊字符的方法:
{} 转义一串字符或符号
\ 转义单个字符或符号(我的情况,但我也试过 {} 以防万一)
ON SELECT 我得到:
REER \¿ montant minimum
或REER {¿} montant minimum
我也试过 SET ESCAPE ON 但我得到一个错误:
ORA-00922: 选项缺失或无效
在别处找到并尝试了'||'-'||'
不用说,没用。
ON SELECT 我得到:
'||'-'||'
问题可能是您无法查看您的客户端 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