oracle sqlplus select 带撇号的查询转换为?

oracle sqlplus select query with apostrophe converts to?

sqlplus -s ${uidpwd} > ${TEMP_FILE} 2>${LOG_FILE} << EOF

SET LINESIZE 32767
SET PAGESIZE 0
set long 2000000000
set longchunksize 10000000

SET TRIMSPOOL ON
SET RECSEP OFF
SET HEADSEP OFF
SET HEADING OFF
SET FEEDBACK OFF
SET SERVEROUTPUT ON
SET ECHO OFF
SET VERIFY OFF

whenever oserror exit 9
whenever sqlerror exit sql.sqlcode
Select description from table;
exit;
EOF

这是用 ?对于所有带有“撇号”

的名称

实际:

结果:

生成文件(假脱机结果)后,我尝试了这种方式“sed "s/?/'/g" ${TEMP_FILE}" -- 这不起作用,也可以替换“?”在列值中,例如“你叫什么名字?”到“你叫什么名字”。

您可能没有直单引号 ' (ASCII 36),但有左单引号 (Unicode 145) 或右单引号 (统一码 146).

您可以使用 DUMPASCII:

查看您拥有的内容
SELECT value,
       quote,
       ASCII( SUBSTR( value, 3, 1 ) ) AS ascii,
       DUMP( value ) AS dump
FROM   table_name;

其中,对于数据:

CREATE TABLE table_name ( value, quote ) AS
SELECT UNISTR( 'it[=11=]27s' ), 'straight single quote' FROM DUAL UNION ALL
SELECT UNISTR( 'it[=11=]60s' ), 'backtick'              FROM DUAL UNION ALL
SELECT UNISTR( 'it[=11=]91s' ), 'opening single quote'  FROM DUAL UNION ALL
SELECT UNISTR( 'it[=11=]92s' ), 'closing single quote'  FROM DUAL;

输出:

VALUE | QUOTE                 | ASCII | DUMP                                
:---- | :-------------------- | ----: | :-----------------------------------
it's  | straight single quote |    39 | Typ=1 Len=8: 0,105,0,116,0,39,0,115 
it`s  | backtick              |    96 | Typ=1 Len=8: 0,105,0,116,0,96,0,115 
it?s  | opening single quote  |   145 | Typ=1 Len=8: 0,105,0,116,0,145,0,115
it?s  | closing single quote  |   146 | Typ=1 Len=8: 0,105,0,116,0,146,0,115

db<>fiddle here


如果要将扩展字符集 opening/closing 单引号转换为基本字符集直单引号 ' 则只需使用 TRANSLATE 交换字符:

SELECT TRANSLATE( value, UNISTR( '[=12=]91[=12=]92' ), '''''' ) AS value
FROM   table_name

输出:

| VALUE |
| :---- |
| it's  |
| it`s  |
| it's  |
| it's  |

db<>fiddle here