ORACLE 进阶(十四)转义字符讲解
一、前言
在 DAO 层,与实体类相关的 SQL 语句通常配置在 XML 文件中,如下 SQL 语句配置:
被![CDATA[]]
这个标记所包含的内容将表示为纯文本,比如![CDATA[]]
表示文本内容“<
”。
此标记用于 xml 文档中,我们先来看看使用转义符的情况。我们知道,在 xml 中,”<”、”>”、”&”等字符是不能直接存入的,否则 xml 语法检查时会报错,如果想在 xml 中使用这些符号,必须将其转义为实体,如”<
”、”>
”、”&
”,这样才能保存进 xml 文档。
在使用程序读取的时候,解析器会自动将这些实体转换回”<”、”>”、”&”。举个例子:
二、注意
转义序列字符之间不能有空格;
转义序列必须以”
;
”结束;单独出现的”
&
”不会被认为是转义的开始;区分大小写。
在 XML 中,需要转义的字符有:
但是严格来说,在 XML 中只有”<
”和”&
”是非法的,其它三个都是可以合法存在的,但是,把它们都进行转义是一个好的习惯。
不管怎么样,转义前的字符也好,转义后的字符也好,都会被 xml 解析器解析,为了方便起见,使用![CDATA[]]
来包含不被 xml 解析器解析的内容。但要注意的是:
此部分不能再包含”
]]>
”;不允许嵌套使用;
”
]]>
”这部分不能包含空格或者换行。
最后,说说![CDATA[]]
和 xml 转移字符的关系,它们两个看起来是不是感觉功能重复了?
三、应用场景和需求
![CDATA[]]
不能适用所有情况,转义字符可以;对于短字符串
![CDATA[]]
写起来啰嗦,对于长字符串转义字符写起来可读性差;![CDATA[]]
表示 xml 解析器忽略解析,所以更快。
四、拓展阅读 DELETE 和 TRUNCATE 的区别
4.1 语法
4.2 区别
delete from
后面可以写条件,truncate
不可以。
delete from
记录是一条条删的,所删除的每行记录都会进日志,而truncate
一次性删掉整个页,因此日至里面只记录页释放,简言之,delete from
更新日志,truncate
基本不,所用的事务日志空间较少。
delete from
删空表后,会保留一个空的页,truncate
在表中不会留有任何页。当使用行锁执行
DELETE
语句时,将锁定表中各行以便删除。truncate
始终锁定表和页,而不是锁定各行。如果有
identity
产生的自增 id 列,delete from
后仍然从上次的数开始增加,即种子不变,而truncate
后,种子会恢复初始。
truncate
不会触发delete
的触发器,因为truncate
操作不记录各个行删除。
4.3 总结
truncate
和delete
只删除数据,不删除表的结构(定义);drop
语句将删除表的结构被依赖的约束(constrain
),触发器(trigger
),索引(index
); 依赖于该表的存储过程/函数将保留,但是变为invalid
状态。delete
语句是dml
,这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的trigger
,执行的时候将被触发;truncate
,drop
是ddl
, 操作立即生效,原数据不放到rollback segment
中,不能回滚,操作不触发trigger
。delete
语句不影响表所占用的extent
, 高水线(high watermark)保持原位置不动;显然drop
语句将表所占用的空间全部释放。truncate
语句缺省情况下将空间释放到minextents
个 extent,除非使用 reuse storage;truncate
会将高水线复位(回到最开始)。速度,一般来说:
drop> truncate > delete
。安全性:小心使用
drop
和truncate
,尤其没有备份的时候,否则哭都来不及。使用上,想删除部分数据行用
delete
,注意带上where
子句。 回滚段要足够大;想删除表。当然用drop
;想保留表而将所有数据删除。如果和事务无关,用truncate
即可。 如果和事务有关,或者想触发trigger
,还是用delete
;如果是整理表内部的碎片,可以用truncate
跟上 reuse stroage,再重新导入/插入数据。
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/9798c9d68854df7c9df4f4606】。文章转载请联系作者。
评论