上周在小组例会中,提到了不同数据库中的大小写敏感问题。问题很小,但是如果不注意,尤其是在非标准的开发场景下,很容易出问题。首先,让我们看一下Oracle中大小写的处理。比如用小写的test1创建,但是我们在user_objects中找不到根据小写的test1的记录,只能根据大写的TEST1查找,SQL>createtabletest1(idnumber);Tablecreated.SQL>selectobject_namefromuser_objectswhereobject_name='test1';norowsselectedSQL>selectobject_namefromuser_objectswhereobject_name='TEST1';OBJECT_NAME------------------------------------------------------------------------------TEST1这次我们使用标有的小写test2双引号,和上面的正好相反。使用大写的TEST2找不到记录,使用小写的test2可以找到,SQL>createtable"test2"(idnumber);Tablecreated.SQL>selectobject_namefromuser_objectswhereobject_name='TEST2';norowsselectedSQL>selectobject_namefromuser_objectswhereobject_name='test2';OBJECT_NAME-------------------------------------------------------------------------------test2应该区分大小写。这个参数算一个,sec_case_sensitive_logon,会控制用户密码是否区分大小写。在11g中,默认为true,密码区分大小写。如果改为false,则不敏感。SQL>showparametersensitiveNAMETYPEVALUE-------------------------------------------------------------------------sec_case_sensitive_logonbooleanTRUE如果使用orapwd创建密码文件。有一个参数ignorecase可以指定密码的大小写。功能同上。此外,其他对象、字段、视图、索引、序列等,都是不区分大小写的。如果我们在开发代码中,不要刻意使用""双引号来标示对象的大小写。与数据库交互时,会自动转为大写。当然是特意写成大写的,效果一样。至于小写,在数据库引擎中转换为大写的操作是有些消耗的,但是在目前主流的硬件环境下,我觉得几乎可以忽略不计。因此,对于使用Oracle数据库的应用程序,避免在程序中使用""双引号来标示对象的大小写,这是开发中应该遵循的准则。但是,对于其他一些数据库,有些是区分大小写的,有些则习惯于使用大小写混合定义。在迁移这些数据库的时候,一定要注意程序中的大小写问题,以免造成不必要的麻烦。本文转载自微信公众号“bisal的个人杂货店”,作者bisal。转载本文请联系bisal的个人杂货店公众号。
