Chinaunix

标题: MySQL中的"地雷"!!! [打印本页]

作者: jinbsd    时间: 2006-12-31 14:37
标题: MySQL中的"地雷"!!!
这个由于是不熟悉MYSQL中的SQL造成,这个应该算我自己的问题。
简单地说

update xxx表 set xxx列=xxx列+'xxx字符串' ...

这个你要是知道错什么地方了,证明你对mysql语法和特性比较熟了。
如果还不知道,那就的真的好好向下看看了。

update xxx表 set xxx列=concat(xxx列+'xxx字符串') ...

这条语句的错误有一点隐蔽!

比较正确的写应该为:

update xxx表 set xxx列=concat(ifnull(xxx列,'')+'xxx字符串')  ...

希望大家注意点,我...:(,错已成往事。
作者: afdlove    时间: 2006-12-31 16:14
要我写,我会写CONCAT,IFNULL估计我不会写。
作者: ttvast    时间: 2007-01-01 16:29
因该是你不熟悉mysql的结构。
mysql所有字段都应该应用not null。 要养成所有字段都有默认值的习惯。
null值会给你基于mysql的开发带来无穷无尽的麻烦。
作者: lvscluster    时间: 2007-01-02 11:12
原帖由 ttvast 于 2007-1-1 16:29 发表
因该是你不熟悉mysql的结构。
mysql所有字段都应该应用not null。 要养成所有字段都有默认值的习惯。
null值会给你基于mysql的开发带来无穷无尽的麻烦。




放屁!
作者: ttvast    时间: 2007-01-02 16:50
原帖由 lvscluster 于 2007-1-2 11:12 发表




放屁!


我fp你为何要跟在后面闻味道?你有这种癖好?
作者: zhanglp888    时间: 2007-01-03 18:20
经验值加1了!
作者: qlks    时间: 2007-01-03 19:15
原帖由 ttvast 于 2007-1-1 16:29 发表
因该是你不熟悉mysql的结构。
mysql所有字段都应该应用not null。 要养成所有字段都有默认值的习惯。
null值会给你基于mysql的开发带来无穷无尽的麻烦。


说一点的没错
说放屁的是自己修养不够
作者: yueliangdao0608    时间: 2007-01-04 09:26
MM的贴!
作者: 清汤挂面    时间: 2007-01-04 21:51
原帖由 jinbsd 于 2006-12-31 14:37 发表
这个由于是不熟悉MYSQL中的SQL造成,这个应该算我自己的问题。
简单地说

update xxx表 set xxx列=xxx列+'xxx字符串' ...

这个你要是知道错什么地方了,证明你对mysql语法和特性比较熟了。
如果还不知道, ...


能否具体解释一下?
作者: jinbsd    时间: 2007-01-08 14:47
update xxx表 set xxx列=xxx列+'xxx字符串'

本意打算为相应的列加上(连接)'xxx字符串',可是在MYSQL中两个列做'+'连接,其结果为!!!
0
:(
说实在的很是不理解为什么这样?同样的操作在MSSQL和ORACLE中都可以。

查找手册后发现有(其实这个是SQL99标准中定义的)个concat函数可以做N个字符串连接操作。故如下
update xxx表 set xxx列=concat(xxx列+'xxx字符串')
--修改上一句,笔误(盘误)=都为手误
update xxx表 set xxx列=concat(xxx列,'xxx字符串')


可是在SQL标准中,如果xxx列为空那么与任何字符串在一起连接其结果还是空。所以,为了达到想要求的效果要检测xxx列是否为null了。

[ 本帖最后由 jinbsd 于 2007-1-15 01:24 编辑 ]
作者: mannerboy    时间: 2007-01-08 15:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: raid_fifa    时间: 2007-01-08 17:40
似乎语句中的加号应该改成逗号,象这样:
update xxx表 set xxx列=concat(ifnull(xxx列,''),'xxx字符串') where ...

我的环境:
Linux: kernel-2.6.9 for i386
MySQL: 5.1.11-beta
作者: jinbsd    时间: 2007-01-15 01:24
是地
作者: jingzhi    时间: 2007-01-15 11:10
其实mysql还有一个函数作为CONCAT的特例,那就是CONCAT_WS

CONCAT(str1,str2,...)
将参数连接成字符串返回。如果有任何一个参数为 NULL,返回值也为 NULL。可以有超过 2 个的参数。数字参数将被转换为相等价的字符串形式:
mysql> SELECT CONCAT('My', 'S', 'QL');
        -> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
        -> NULL
mysql> SELECT CONCAT(14.3);
        -> '14.3'

CONCAT_WS(separator, str1, str2,...)
CONCAT_WS() 支持 CONCAT 加上一个分隔符,它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间:
mysql> SELECT CONCAT_WS(",","First name","Second name","Last Name");
       -> 'First name,Second name,Last Name'
mysql> SELECT CONCAT_WS(",","First name",NULL,"Last Name");
       -> 'First name,Last Name'

另外对ttvast对待出言不逊者的态度表示赞赏.
卑鄙是卑鄙者的墓志铭.
作者: jinbsd    时间: 2007-01-27 13:47
建议大家在做字符串连接时候,还是要用ifnull函数!
以免意外!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2