十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
第一个问题,VARCHAR2是变长,不会补,但是CHAR会补。所以VARCHAR2的'SDF'跟'SDF
创新互联建站,专注为中小企业提供官网建设、营销型网站制作、成都响应式网站建设公司、展示型成都网站建设、成都网站设计等服务,帮助中小企业通过网站体现价值、有效益。帮助企业快速建站、解决网站建设与网站营销推广问题。
'记录不一样。
第二个问题,你那个where
name
=
'变量值'就搜的是变量值靠左的,对于CHAR类型ORACLE会自动截掉后面的空格,对于VARCHAR2类型不会截。
具体的匹配是什么算法我太知道,不过猜想WHERE的时候CHAR类型是截掉后面的空格,前面的不会截。如果你用CHAR类型,'JOHN'
跟'JOHN
'是一样的记录,本身CHAR会自动用空格填补后面的位置
字符分好几种,
char型是定长,假如长度是20,你里边的内容如果是000,那么系统将给这个000补充17位的空格
varchar2是不定长,就是假如长度是20,那么最大不能超过20,如果是000,你取下length,它就是3
trim是左右都去空格,rtrim是右去空格,还有个ltrim是左去空格,这里觉得你还是用trim函数比较好
-----------补充----------
那就有可能不是空格,有可能是换行符或者其他好像空格的符号
-----------补充2----------
update 表名 set 字段名=replace(字段名,chr(10),char(13));
先用上边的把换行符转成空格
可以用几个Oracle的系统函数联合完成。语句如下:SELECT SUBSTR('AHS1234 3232',0,INSTR('AHS1234 3232',' ')-1) str FROM dual; 结果是:AHS1234
instr函数是查找空格在字符串中的位置,SUBSTR函数是截取字符串,从字符串开始截取到空格的位置的前一位(例:空格的位置是8,截取8-1=7位字符)
sql中判断非空不能用等号,因为null在sql中被看作特殊符号,必须使用关键字 is和not
select * from A where info is not null
如果表中主键为一列,假设列明为 a
select * from table_name where a like '% %';
如果表中主键是多列组成的联合主键,假设列明为 a,b,c
select * from table_name where a like '% %' or b like '% %' or c like '% %';
另外,这个条件中不建议使用函数,因为条件项为主键,如果使用函数,有些情况是不会走索引的,会影响效率。
以上,仅供参考。
1.首先是去除空格在进行比较(比如,把姓名中的所有空格去除):
Update table_name set xm=replace(xm , ' ') ;
如果要查找哪些记录含有' ',可用相关的语句查找。
然后可进行比较。
2.但是我们可能会发现,有些姓名中间或末尾还有类似空格的字符没被去掉,但它们显然已经不是一般的空格了,那么怀疑是Tab健作怪。于是参照网上说的去掉TAB键的办法来处理,用chr(9)来替代空格键(TAB键的ASCII值为9)。先取一条带有类空格字符的记录来做实验:
SELECT replace(xm, chr(9) ) from table_name where bh=’xxx’;
用这个办法会去掉一些真正的Tab键空格,然后采取批量更新的办法。
3.但我遇到的情况没有这么幸运,没能去掉类空格键。怎么办呢?我决定尝试先取得这个类空格键的ASCII码值,然后再用chr(ASCII码值)的方法来处理。
①.取得含类空格键整个字符串的长度 length(),从而确定出类空格键在字符串中的起始位置、类空格键的长度。
②.求出类空格键的ASCII码值:ascii(substr(xm,n,m)); n为类空格键的起始位置;m为长度。
③.SELECT replace(xm, chr(第②步求得的ASCII码值) ) from table_name where bh=’xxx’;
问题得以解决。但我发现,上述第②步求得的ASCII码值为41377,这应该是一个汉字的ASCII码值,看起来又像空格,于是我怀疑,会不会是中文状态下的空格键、TAB键?尝试之后发现不是。我又怀疑,是不是全角、半角的区别?因为我们一般输入字符,是在半角下输入的。我按照第一步“1.首先是去除空格在进行比较……”尝试,输入全角下的空格,进行查找,结果惊喜出现,原来所有未剔除掉的类空格,是全角状态下输入的空格,并接证实了全角下输入的空格,其ASCII码值为41377。