oracle给not null约束指定名称

一般我们建表结构的时候都是使用以下的形式:

create table test(
    menuid number(8) default '0'; not null,
    name varchar2(40) not null,
    id_parent number(10) not null,
    url varchar2(300) null,
    constraint pk_test primary key(menuid)
    );

执行后,查看这个test表的所有约束:

select constraint_name,table_name from user_constraints

发现命名都是SYS_CXXXXXX(XXXXXX表示数字),这些是oracle自动给约束的命名,我感觉为了提高以后数据库的可维护性,还是需要给not null约束指定名称,语法很简单:

create table test(
    menuid number(8) default '0' constraint menuid_nn not null,
    name varchar2(40) constraint name_nn not null,
    id_parent number(10) constraint id_parent_nn not null,
    url varchar2(300) null,
    constraint pk_test primary key(menuid)
    )

参考

oracle没有create or replace table

Oracle数据库和其他数据库(比如MySQL)在新建数据表的时候有一下区别:

SQL> create or replace table testTb;
create or replace table testTb
ORA-00922: 选项缺失或无效

只能使用先drop再create来代替

drop table testTb;
create teble testTb(
    fid   varchar2(4),
    fname   varchar2(10)
);

可以用create or replace的对象有:functions, procedures, packages, types, synonyms, trigger and views,就是没有table,也没有sequence。 drop掉一个并不存在的表报错:

SQL> drop table non_exists;
drop table non_exists
ORA-00942: 表或视图不存在

drop table容错的方法是:

BEGIN
  DROP TABLE non_exists_table;
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/

错误代码:-0942

    • *drop sequence容错的方法是:
BEGIN
  DROP SEQUENCE non_exists_sequence;
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -2289 THEN RAISE; END IF;
END;
/

错误代码:-2289 参考

#167 codeigniter oci8 database driver do not support setting charset and session_mode while ocilogon() to oracle db

system/database/drivers/oci8/oci8_driver.php line 80 db_connect() function did not support set the charset and session mode while connecting to oracle db.

function db_connect()
    {
        return @ocilogon($this->username, $this->password, $this->hostname);
    }
function db_pconnect()
    {
        return @ocilogon($this->username, $this->password, $this->hostname);
    }

here is the prototype of oci_connect( ocilogon improved version )

resource oci_connect ( string $username , string $password [, string $db [, string $charset [, int $session_mode ]]] )

codeigniter最新的2.0.1太蛋疼鸟。system/database/drivers/oci8/oci8_driver.php里面的db_connect()和db_pconnect()函数尽然不支持连接的时候设定字符集,因为函数的原形ocilogon(被oci_connect代替)支持设定charset和session_mode。还有codeigniter为啥要使用@ocilogon而非oci_connect呢?php官方说5.0.0以前的版本才使用ocilogon,codeigniter为了使用ocilogon不报warning还前面加上了”@”符号。但是codeigniter声称是支持php 5.1.6以及以后版本的php框架。有点搞不懂codeigniter的想法了。 没有版本,这个问题,只有通过hard coding修改oci8_driver.php文件的db_connect()和db_pconnect()函数为:

function db_connect()
    {
        return @ociplogon($this->username, $this->password, $this->hostname, $this->char_set);
    }
function db_pconnect()
    {
        return @ociplogon($this->username, $this->password, $this->hostname, $this->char_set);
    }

已经将这个问题提交到

bitbucket

codeigniter配置oracle数据库连接

Connection Parameters

Not all of the parameters in application/config/database.php are used as one might expect.  Namely, $db[‘default’][‘database’] isn’t used at all.  The value used for $db[‘default’][‘hostname’] depends on whether the Oracle client’s tnsnames.ora file exists and contains information about the database to be used.  If the file exists and is configured for the intended database, this parameter should be set to the symbolic name.  Otherwise, it should be set to a single string of the connection parameters that tnsmames.ora would normally contain.

An example of connection parameters for the latter case:

$db['default']['hostname'] = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SID=orcl)))';
$db['default']['username'] = 'dbuser';
$db['default']['password'] = 'dbpassword';
$db['default']['database'] = ''; // not used by this Oracle driver
$db['default']['dbdriver'] = 'oci8';

In this case, the appropriate values need to be set for the HOST, PORT, and SID keywords in the hostname parameter.

CodeIgniter字符集编码问题

codeigniter里面的php文件都是ansi编码,其实我们在添加controller,model,view等php文件的时候,php文件的编码成了一个问题。其实这个关系不大。 如果真个项目采用utf-8,那么就将php文件的编码设置为utf-8 without bom,然后html模板文件meta写成:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

mysql数据库统一字符集utf-8,校队:utf8_general_ci 就可以了,系统可以在“标准规范模式”正常浏览不出现乱码。 可能在后期处理上传的ms office文档的时候有转码的需要。

4次重装oracle的教训(OracleDBConsoleORCL启动错误:系统错误3)

  • 安装前请确定机子的ip不是dhcp获取的,否则当重新获得了ip,就无法连接,就杯具了。
  • 最好是拔点网线,然后停用vmware的所有虚拟网站和无线网卡

4次重装oracle的教训(OracleDBConsoleORCL启动错误:系统错误3)

  • D:oracleproduct10.2.0db_1 目录下有个x.x.x.x_orcl目录,那个x.x.x.x就是你安装时候oracle获取你的主机ip,如果获取的是dhcp ip就杯具了。如果是主机名_orcl或者是localhost_orcl就ok。不过我估计即便是被dhcp悲剧了也能手动修改回来的,我也尝试了,但是失败,应该还有我没有触及到的神秘文件。

CodeIgniter用Xdebug调试的问题:The URI you submitted has disallowed characters.

The URI you submitted has disallowed characters.

最近玩codeigniter,使用netbeans写代码,调试器使用xdebug(貌似netbeans不支持zend debugger?之前用过的zend studio支持zend debugger),写了一个demo,然后ctrl+F5调试的时候,进过(F8)了几步之后出现如图上的问题:”The URI you submitted has disallowed characters.”,因为codeigniter对$_GET、$_POST等外来参数有一个“白名单”的机制来加强了安全性,如果你的参数没有加入“白名单”,那肯定是有问题了。 而xdebug调试的时候自动加上了参数 XDEBUG_SESSION_START,所以肯定报错。

http://ci-study/index.php?XDEBUG_SESSION_START=tun-xdebug An Error Was Encountered The URI you submitted has disallowed characters.

在CI 2.0的/application/config/config.php Line 112有以下内容:

/*
|————————————————————————–
| Allowed URL Characters
|————————————————————————–
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs.  When someone tries to submit a URL with disallowed
| characters they will get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters — but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
$config['permitted_uri_chars'] =’a-z 0-9~%.:_\-‘;

CI采用了正则表达式的方式来匹配白名单,尽量少的匹配字符串意味着更高的安全性,默认是白名单正则表达式为a-z 0-9~%.:_-

解决方法1

放弃netbeans,使用eclipse+PDT、zend studio等可以使用zend debugger的PHP IDE。(为了一个小问题换IDE有点蛋疼的说)

解决方法2:

$config['permitted_uri_chars'] =’a-z 0-9~%.:_\-‘;

修改为:

$config['permitted_uri_chars'] =’a-z A-Z 0-9~%.:_\-‘;

实际production环境中最好还原到默认的permitted_uri_chars,提高安全性。

javascript类数组对象 array-like Object

类数组对象中的“类”不是class的意思,而是like,类似的意思。

var a = {};  // Start with a regular empty object
// Add properties to make it "array-like"
var i = 0;
while(i < 10) {
    a[i] = i * i;
    i++;
}
a.length = i;
// Now iterate through it as if it were a real array
var total = 0;
for(var j = 0; j < a.length; j++)
    total += a[j];

以上例子来自《Javascript : The Definitive Guide》7章8节。 a先是一个空数组,通过往里面填充数据,最后填写length使之成为array-like object 。 Javascript数据的特点是length随着新元素的添加,length自动增长,设定length会使javascript数组扩展或缩小,也就是length可以控制javascript数组的大小。 Javascript中的参数对象(Argument Object)也是一个array-like object。

firefox 4终于发布鸟

firefox 4终于发布鸟

升级到4后发现UI更加的舒服,不过这个时候没有惊奇,因为之前使用过firefox 4 alpha beta rc版本。

看上图“关于”对话框都都变成“宽屏”了,由小家碧玉已经变为了霸气外露的铁血纯爷们儿鸟。

扩展、插件管理界面没有使用对话框了,而是直接嵌入到网页中,ctrl+shift+A可以直接调用出来,方便扩展、插件的管理。

以前地址栏右边的搜索栏的右击菜单“清空搜索历史”快捷键是C,现在变成H了。

右键点击标签栏部分“标签页置顶”、甚至底部“附件组件栏”都可以决定是否开启。界面灵活性大大提高鸟。

另外主菜单多了一个“Web开发人员”菜单,除了firefox 3中已经存在的“错误控制台”(Ctrl+Shift+J)现在多出了一个“Web控制台”可以实时显示网页加载的信息,css、js代码警告、错误、http request和response、cookie等信息。这些功能算是firebug和web developer扩展中的部分功能吧。

扩展兼容性,firebug 1.6.2不兼容,不过getfirebug.com最新的1.7已经compatible with firefox 4 , alpha版本甚至兼容到ff的未来版本。
autoproxy还暂时不兼容firefox 4,不过心急的哥可以采用“强制安装法”(update:经过试验,发现autoproxy强制在firefox 4上安装无法正常使用!)

猛击这里查看firefox 4的实时下载统计,相当给力!

ps: 3.14的时候ie9正式版发布了,可惜哥的winxp表示鸭梨很大。

其他方面还在体验中…