DM数据库中针对特殊字符的转义
DM数据库中针对特殊字符的转义
前言
在实际生产环境中密码通常会设置的较为复杂,其中可能会出现各种特殊字符。特殊字符在操作系统中需要被特殊处理。不同的操作系统,书写方式不同。同时在DM数据库中对特殊字符处理上也有自己的要求,例如在使用disql或者dexp和dimp等命令连接数据库时,以下会介绍操作系统和数据库相结合下特殊字符的书写规范。
1、对双引号的转义
无论是操作系统还是数据库再做转义时都会遇到使用双引号的时候,具体的会在下面说明。在此基础上,操作系统和数据库相结合下,就会遇到对双引号本身做转义的情况,对此有以下常用的规范:
- disql 的要求使用双引号对双引号内的双引号转义;
- WINDOWS 命令行,使用双引号或者反斜杠对双引号内的双引号转义;
- LINUX 命令行,使用反斜杠对双引号内的双引号转义。
2、操作系统和数据库相结合下的转义
2.1 Linux系统下
2.1.1 操作系统要求
bash 的引号设计为:在单引号中,所有的特殊字符都失去其特殊含义;在双引号中,特殊字符包括:美元符($)、反引号(`)、转义符()、感叹号(!)。
-
如果密码中没有单引号,那只需要在密码外面添加单引号即可;
假设密码为:$`!123
-
如果密码中有单引号没有上述四种特殊符号,那只需要在密码外面添加双引号即可;
假设密码为:'123'
-
如果密码中既有单引号又有上述四种特殊符号,则需要在密码外面添加双引号同时对特殊字符进行转义;
假设密码为:123'\123
2.1.2 数据库对关键字符和双引号的要求
-
有关键字符时,需要对连接串中的包含关键字的密码用双引号括起来;
如密码为:123@123
,则需要书写成:"123@123"
-
有双引号时,需要用引号括起来,同时需要用双引号对双引号进行转义;
如密码为:123"@123
,则需要书写成:"123""@123"
2.1.3 两者相结合
对于密码来说,经常会直接在操作系统上写入连接字符串中,如使用disql登录数据库时:disql SYSDBA/SYSDBA@localhost:5236
,此时密码中包含数据库关键字符、特殊字符、单引号和双引号时就需要特别注意。
-
密码中只有数据库关键字符或特殊字符,例如假设SYSDBA的密码为:
123@123
时,数据库要求需要添加双引号即"123@123"
,再结合操作系统要求,此时字符串中没有单引号,则只需要再添加单引号即'"123@123"'
,所以最终写法:disql SYSDBA/'"123@123"'
;
-
密码中有双引号和数据库关键字符或特殊字符时,例如假设SYSDBA的密码为:
123"@123
时,数据库要求添加双引号,同时对双引号要用双引号进行转义即"123""@123"
,再结合操作系统的要求,此时字符串中没有单引号,则只需要再添加单引号即'"123""@123"'
,所以最终写法:disql SYSDBA/'"123""@123"'
;
-
密码中有单引号和数据库关键字时,例如假设SYSDBA的密码为:
123'@123
时,数据库要求添加双引号即"123'@123"
,再结合操作系统的要求,此时字符串既有单引号又有双引号,但是没有操作系统的特殊字符,需要在字符串外添加双引号,同时根据系统规则对里面的双引号进行转义,即是"\"123'@123\""
,所以最终写法:disql SYSDBA/"\"123'@123\""
;
-
密码中有单引号和系统特殊字符串,例如假设SYSDBA的密码为:
123'$123
时,disql在读取密码识别时对此字符串无特殊要求,则只需要靠操作系统的要求,需要添加双引号且对特殊字符进行转义即"123'\$123"
,所以最终写法:disql SYSDBA/"123'\$123"
;
[NOTE]
这里是说的disql在读取字符串是对上面情况无要求,但是在SQL语句中书写上面的密码还是需要用双引号整个括起来,需要区别开,例如alter user SYSDBA identified by 123'$123;这个语句是会报错的。 -
密码中既有单引号又有双引号,例如假设SYSDBA的密码为:
123'"123
时,数据库要求用双引号括起来且对其内的双引号用双引号进行转义即"123'""123"
,再结合操作系统的要求,此时字符串内有单引号和双引号,但是没有特殊字符,需要在字符串外添加双引号,同时根据系统规则对里面的双引号进行转义,即是"\"123'\"\"123\""
,所以最终写法是:disql SYSDBA/"\"123'\"\"123\""
;
-
以上规则举例相互组合要根据规范仔细区分,可以假设最复杂的情况,即密码中包含单引号、双引号、数据库关键字符和操作系统特殊字符,例如假设SYSDBA的密码为:
123'"@$123
时,先根据数据库的要求得到所需字符"123'""@$123"
,然后结合操作系统的要求得到字符"\"123'\"\"@\$123\""
,所以最终写法是:disql SYSDBA/"\"123'\"\"@\$123\""
;
2.2 WINDOWS系统下
-
密码包含关键字符或特殊字符,假设密码为:
aaa/aaa
,数据库要求下得到"aaa/aaa"
,Windows系统要求对双引号需要用双引号括起来同时用双引号对双引号进行转义,所以最终是:disql SYSDBA/"""aaa/aaa"""
; -
密码中包含空格,假设密码为:
aaa aaa
,数据库中SQL书写时需要用双引号括起来作为一个整体,但是在disql识别时无需,结合系统要求用双引号括起来,所以最终是:disql SYSDBA/"aaa aaa"
; -
密码中包含双引号,假设密码为:
aaa"aaa
,数据库要求下得到"aaa""aaa"
,结合Windows系统要求下得到"""aaa""""aaa"""
,所以最终是:disql SYSDBA/"""aaa""""aaa"""
;
更多的内容可以登录达梦的社区进行查看:https://eco.dameng.com