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
这是用 ?对于所有带有“撇号”
的名称
实际:
- 是
- 那是
结果:
- 它?s
- 那?s
生成文件(假脱机结果)后,我尝试了这种方式“sed "s/?/'/g" ${TEMP_FILE}" -- 这不起作用,也可以替换“?”在列值中,例如“你叫什么名字?”到“你叫什么名字”。
您可能没有直单引号 '
(ASCII 36),但有左单引号 ‘
(Unicode 145) 或右单引号 ’
(统一码 146).
您可以使用 DUMP
或 ASCII
:
查看您拥有的内容
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
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
这是用 ?对于所有带有“撇号”
的名称实际:
- 是
- 那是
结果:
- 它?s
- 那?s
生成文件(假脱机结果)后,我尝试了这种方式“sed "s/?/'/g" ${TEMP_FILE}" -- 这不起作用,也可以替换“?”在列值中,例如“你叫什么名字?”到“你叫什么名字”。
您可能没有直单引号 '
(ASCII 36),但有左单引号 ‘
(Unicode 145) 或右单引号 ’
(统一码 146).
您可以使用 DUMP
或 ASCII
:
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