Oracle

  • 本文纯属八卦,基本没有任何实用价值。Oracle总是都会通过SQL_ID来标志一个唯一的SQL。SQL_ID与SQL_TEXT一一对应。如果两个SQL文本有任何不同,包括空格等任何不可见字符,都会导致SQL_ID不同。本文八卦的内容是:Oracle如何根据SQL_TEXT内容散列成一个13位的字符串。为什么这个字符串会是13位?为什么这个字符经常以数字开头?

    本文参考TANEL PODER和Slavik的两篇介绍(12),详细介绍转换原理,顺便给出PHP/Perl实现代码。

    0. 概述

    Oracle先计算SQL_TEXT的md5散列值;取散列值的低64位(bits),每次取5位(最后一次4位),使用Base32将其依次转换成可见字符,就是你最终看到的SQL_ID。原理就是这样。

    不过实际转换过程中有一些要注意的事项:

    (a) Oracle在计算md5散列时,会在SQL_TEXT末尾加一个不可见字符\0,AWR报表中经常有这样的SQL_TEXT

    (b) 注意little-endian的问题

    (c) Base32转码的可见字符为0123456789abcdfghjkmnpqrstuvwxyz

    (d) 编写程序的时候需要注意大数精度的问题,本文中Perl/PHP程序都使用了数学大数处理函数[……]

    Read more

  • PHP连接Oracle数据库

    ·

    一般大家不这么做。

    不难,和连接MySQL差不多。php需要使用OCI8扩展来连接Oracle,可以使用phpinfo来查看你是否已经安装了该扩展。关于OCI8的详细使用可以直接参考php的Manual OCI8,本文仅做一个入门介绍。

    1. 使用什么帐号连接
    $ora_host = "172.19.*.259"; $ora_port="1521"; $ora_sid = "orasid"; $ora_username = "orauser"; $ora_password = "orapwd"; $charset = "UTF8"; ### zhs16gbk ###

    [……]

    Read more