MySQL字符串比较函数学习(二) -- 比较函数 (MySQL学习)
发布于 2008-10-09 12:15 阅读:46236 评论:0 标签: MySQL 字符串比较

      字符串比较函数函数在手册:这里。比较函数主要有三类:一个是用like子句;二是使用正则表达式的like子句;三是STRCMP函数了。前两者感觉更侧重搜索,第三个有大小的比较在里面。

      字符串比较中有以下四个规则

      1:MySQL 会自动将数字转化为字符串,反之亦然。 
      2:若想要将数字明确地转化为字符串,可使用 CAST()或 CONCAT()函数。
      3:若已经对一个字符串函数给定一个二进制字符串作为参数, 则所得到的结果字符串也是一个二进制字符串。
      4:一般而言, 若字符串比较中任意一个表达式是区分大小写的,则执行比较时也区分大小写。

      下面根据以上说的三类进行学习:

      一:使用like子句

  • expr LIKE pat [ESCAPE 'escape-char']

      模式匹配,使用SQL简单正规表达式比较。返回1 (TRUE) 0 (FALSE)。 若 expr pat 中任何一个为 NULL,则结果为 NULL

      模式不需要为文字字符串。例如,可以被指定为一个字符串表达式或表列。

      在模式中可以同LIKE一起使用以下两种通配符:

字符

说明

%

匹配任何数目的字符,甚至包括零字符 

_

只能匹配一种字符

以下是代码片段:

mysql> SELECT 'David!' LIKE 'David_';
       
-> 1

mysql> SELECT 'David!' LIKE '%D%v%';
       
-> 1

      若要对通配符的文字实例进行检验, 可将转义字符放在该字符前面。如果没有指定 ESCAPE字符, 则假设为‘\’。这个和一般的编程语言是一样的。

字符串

说明

\%

匹配一个  %’字符

\_

匹配一个 ‘_’ 字符

以下是代码片段:

mysql> SELECT 'David!' LIKE 'David\_';
       
-> 0

mysql> SELECT 'David_' LIKE 'David\_';
       
-> 1

      也可以指定一个不同的转义字符,需使用ESCAPE语句:

以下是代码片段:

mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
        -> 1

      以下两个语句举例说明了字符串比较不区分大小写,除非其中一个操作数为二进制字符串

以下是代码片段:

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1

mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0

      在MySQL, LIKE 允许出现在数字表达式中 (这是标准SQL LIKE 的延伸)

以下是代码片段:

mysql> SELECT 10 LIKE '1%';
        -> 1

      注释由于 MySQL在字符串中使用 C转义语法(例如, 用‘\n’代表一个换行字符),在LIKE字符串中,必须将用到的‘\’双写。例如, 若要查找 ‘\n, 必须将其写成 ‘\\n’。而若要查找 ‘\, 则必须将其写成 it as \\\\;原因是反斜线符号会被语法分析程序剥离一次,在进行模式匹配时,又会被剥离一次,最后会剩下一个反斜线符号接受匹配。

      二:使用正则表达式的like子句

  • expr REGEXP pat expr RLIKE pat

      执行字符串表达式 expr 和模式pat 的模式匹配。该模式可以被延伸为正则表达式。正则表达式的语法在附录G:MySQL正则表达式中有详细讨论。若expr 匹配 pat则返回 1; 否则返回0。若 expr pat 任意一个为 NULL, 则结果为 NULL RLIKE REGEXP的同义词, 作用是为mSQL 提供兼容性。

      模式不需要为文字字符串。例如,可以被指定为一个字符串表达式或表列。

      注释由于在字符串中, MySQL使用 C 转义语法 (例如, 用‘\n’来代表换行字符 ),REGEXP字符串中必须将用到的‘\’ 双写。

      REGEXP 不区分大小写, 除非将其同二进制字符串同时使用

以下是代码片段:

mysql> SELECT 'Monty!' REGEXP 'm%y%%';
        -> 0

mysql> SELECT 'Monty!' REGEXP '.*';
        -> 1

mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';
        -> 1

mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
        -> 1  0

mysql> SELECT 'a' REGEXP '^[a-d]';
        -> 1

      在确定字符类型时,REGEXP RLIKE 使用当前字符集 (默认为cp1252 Latin1 )警告:这些操作符不支持多字节字元。

       三:使用函数:STRCMP

  • STRCMP(expr1,expr2)

      若所有的字符串均相同,则返回0;若根据当前分类次序,第一个参数小于第二个,则返回  -1,其它情况返回 1

以下是代码片段:

mysql> SELECT STRCMP('text', 'text2');
        -> -1

mysql> SELECT STRCMP('text2', 'text');
        -> 1

mysql> SELECT STRCMP('text', 'text');
        -> 0

      在执行比较时,STRCMP() 使用当前字符集。这使得默认的比较区分大小写,当操作数中的一个或两个都是二进制字符串时除外。

      说明:对于前两个都有其反操作。见下

  • expr NOT LIKE pat [ESCAPE 'escape-char']

          这相当于 NOT (expr LIKE pat [ESCAPE 'escape-char'])

  • expr NOT REGEXP pat expr NOT RLIKE pat

          这相当于NOT (expr REGEXP pat)

展开全文  
收起全文  
思考:中国房地产与美百位经济学家联署质疑金融救援计划 (随便说说)
发布于 2008-09-26 17:36 阅读:58361 评论:0 标签: 房价 金融 生活

      美国最近的金融危机是世界关注的焦点,我对经济的知识只限于大学选修的《市场营销》专业课程,以及三个月前读的《长尾理论》。仅这些知识不足以让我关注这场危机,至少我对这场危机无任何抵抗能力,不想也罢。

      但是引起我关注的是两个文章,一个新浪网报道的《美百位经济学家联署公开信 质疑金融救援计划》;二是新浪名博牛刀写的《122位美国学者让中国经济学家汗颜》。

      美经济学家联署公开信的英文版在:英文版

      看到新闻让我想起2001年美国准备取消遗产税,结果《美国120位最有钱的富翁要求保留遗产税》,你不得不承认物质文明对精神文明的影响。如果我有盖茨的财富,我也会很乐意分享我的财富的,呵呵。

      在这里要推荐牛刀的博文,链接在上面。里面谈及了现在中国所谓经济学家是做什么勾当了:

以下是引用片段:

      仔细看看我们的舆论,为什么一些地产商的老板为了明显的个人私利,不断的推出一些误导市场的观点,而这些观点在他们控制的网络、媒体大行其道,主要原因就是中国的专家们在金钱面前的表现实在不敢恭维,有的奴颜婢膝,有的唯唯诺诺,更有甚者,一给钱就胡说,不惜充当经济泡沫的帮凶,两极分化的吹鼓手。
 
      中央政府一开始宏观调控,专家董藩就说,无论怎么调控,房价都会永远上涨;任志强一说只为富人盖房子,很快就有专家说为富人说话,末了还有一句,为穷人办事;开发商们在无锡抛出臭名昭著的猪坚强观点,立马就有专家大呼救市;北京房价刚刚开始滞涨,就有专家说见底;……很多混帐的胡话,一查都是出自一些著名的经济学家之口,不能不让人齿寒。

      我为什么要推荐呢,因为我实在是对现在的房价看不下去了......牛刀在博文提出的观点,让我很受用:

以下是引用片段:

      你既然做了开发商,享受着巨额无比的暴利,那同样要承担风险。你在疯狂的把购房者的财富拼命装进自己的腰包时,一个子儿也不肯吐出来,当你要亏本的时候,却要政府来补贴,这是多么荒唐的一件事啊。而我们的一些经济学家,却在帮着开发商向政府施压说,放松银根吧,救救开发商,挽救开发商就是挽救中国经济,开发商破产房价会暴涨。

      顺便推荐美经济学家的呼吁信:

以下是引用片段:

  致众议院议长与参议院临时议长:

  作为经济学家,我们要向国会表达:对于财政部长保尔森所提出的金融危机应对计划,我们深感忧虑。我们清楚地知道当前金融形势有多么困难,我们也认为需要采取果敢行动才能确保金融体系继续运转。然而,我们认为目前提出的计划存在三个致命的缺陷:

  1.不公平。该计划是在用纳税人的钱补贴投资者。那些为了利益铤而走险的投资者也必须承受损失才行。并非每一桩投资失败都会引发系统性风险。即使不救援那些自己决策失误的投资者和机构,政府也能确保金融业正常运行,向可信的借款者发放新的贷款。

  2.含糊不清。该计划拟议成立一个新机构,但是其使命和监督机制都不清楚。如果要纳税人从陷入困境的卖家手中购买缺乏流动性和透明度的资产,那么这些购买交易的条款、时机和操作方法都必须是事先彻底透明、事后得到妥善监督的。

  3.长期效应堪忧。假如该计划投入实施,其效应将会持续一代人的时间。尽管最近麻烦重重,美国的富有活力和创新精神的私人资本市场毕竟为这个国家创造了前所未有的繁荣。为了平息短期干扰而从根本上削弱那些市场是极其短视的做法。

  由于这些原因,我们呼吁国会不要匆忙决策,要进行适当的听证,仔细考虑什么才是正确的行动路径,为美国金融业和美国经济的未来作出明智的决定。

     参考文章:

以下是引用片段:

1:美百位经济学家联署公开信 质疑金融救援计划

2:美经济学家联署公开信译文

3:美经济学家联署公开信英文版

4:牛刀:122位美国学者让中国经济学家汗颜

展开全文  
收起全文  
国家不强大就会有汉奸 (随便说说)
发布于 2008-09-25 10:50 阅读:10755 评论:0 标签: 汉奸

      这新闻看得让人真不平静啊!

      国家不强大就会有汉奸,请看新闻:《李登辉拜访冲绳称钓鱼岛以前就属于日本》。真是人至贱则无敌啊!这样弄得自己人也没面子:《李登辉发表媚日言论 台“驻日代表处”回应》。

      台湾民主后,选出的前两个领导人最终证明都不是什么好货色:《陈水扁洗钱案发生串供 检方可能强制处分》,现在这个还需再观察。

      希望台湾民主制度越来越好,给天朝做个好榜样。

展开全文  
收起全文  
拜牛人--牛人谈“选择起薪10w的工作还是读浙大计算机研究生?” (随便说说)
发布于 2008-09-23 12:45 阅读:18870 评论:0 标签: 职业规划

      未来的路怎么走?

      考虑中国的国情,你应该是相信自己的实力、社会公平性的不断发展,走自己想走的路;还是向现实妥协,依托家族的力量、顺应和谐社会潜规则?

      人总是在变,也许你今天豪气冲天,明天就会因为无力改变现状而苦恼,黯然神伤,准备退而其次;又或许你今天选择安逸、追求平淡、舒坦的生活,明天就有可能为自己那一点可能存在的才华而叹息。

      今天,我在CSDN的一个帖子里面:选择起薪10w的工作还是读浙大计算机研究生?。看见一牛人gzlucky给出了强解:

以下是引用片段:

你的确需要规划一下你的人生.

        毕业    继续深造
读研究生 ----*-----*--> 在国内读博士? ( 傻了, 赶快赚钱吧, 还读,等毕业,IT换了好几代了)
            |          |
            |          *--> 到国外深造 --> 留洋/海归 --> .....
            |
            *--> 找外企实现价值(不找外企,你会后悔当初没入电力局)---*--> 职业经理人,CIO,C?O 
                                  | 
                                  *--> 自己创业 
                                  | 
                                  *--> 碌碌无为,后悔当初没选择电力局 
      

                        深暗官场之道?
电力局  ---> 结婚 ---> 生子 ------*-Yes--> 处级,局级,....... 
                                    | 
                                    *-No---> 科员,科级,后悔当初没读书!


开开玩笑,轻松轻松.

    看后,不禁嘘嘘。一篇名为《HP大中华区总裁孙振耀退休十五天后九大感言》的文章,提出了一个观点:

以下是引用片段:

  你工作快乐么?你的工作好么?

  有没有觉得干了一段时间以后工作很不开心?有没有觉得自己入错了行?有没有觉得自己没有得到应有的待遇?有没有觉得工作像一团乱麻每天上班都是一种痛苦?有没有很想换个工作?有没有觉得其实现在的公司并没有当初想象得那么好?有没有觉得这份工作是当初因为生存压力而找的,实在不适合自己?你从工作中得到你想要得到的了么?你每天开心么?

  天涯上愤怒的人很多,你有没有想过,你为什么不快乐?你为什么愤怒?

  其实,你不快乐的根源,是因为你不知道要什么!你不知道要什么,所以你不知道去追求什么,你不知道追求什么,所以你什么也得不到。

    以此共勉!

展开全文  
收起全文  
MySQL字符串比较函数学习(一) (MySQL学习)
发布于 2008-09-22 22:23 阅读:29208 评论:0 标签: MySQL 字符串比较

       通览了一下手册,发现MySQL的字符串函数和PHP的函数在功能还是有很多地方相似的,很多都能在php中找到对应的函数。所以在这里,要向大家推荐一个文章:PHP 中执行排序与 MySQL 中排序。作者:明灵(dragon) , Fenng 。地址:http://www.dbanotes.net/arch/php_mysql_sort.html

      好,回到本文。先说两个特别的地方:

      1:函数中,假如结果的长度大于 max_allowed_packet 系统变量的最大值时,字符串值函数的返回值为NULL。请参见7.5.2节,“调节服务器参数”(http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#server-parameters)。

      2:和PHP等编程语言不同,对于在字符串位置操作的函数,第一个位置的编号为 1。

      下面开始函数学习:

      1:字符串连接函数

      CONCAT(str1,str2,...)

      返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。或许有一个或多个参数。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)

以下是代码片段:

mysql> SELECT CONCAT('My', 'S', 'QL');
        -> 'MySQL'

mysql> SELECT CONCAT('My', NULL, 'QL');
        -> NULL

mysql> SELECT CONCAT(14.3);
        -> '14.3'

      下面这个concat_ws是concat的变体:

      CONCAT_WS(separator,str1,str2,...)

      CONCAT_WS() 代表 CONCAT With Separator ,是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'


      CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。

      这个函数和php的explode和implode、list、extract相似了。有兴趣的可以看看php的手册。

      2:字符串剪接函数

      INSERT(str,pos,len,newstr)

      这个函数,mysql中文手册翻译得太烂了,还是偶自己来吧:

      这个函数返回一个字符串:

      A:str字符串从位置pos(从1开始计算)开始(含第pos位),之后的pos位被字符串newstr取代;
      B:如果pos大于str的长度,则从str后面开始衔接;
      C:如果因len超出余后的长度,则位置pos之后(含第pos位)全被取代;
      D:如果pos为负数,返回str;
      E:如果len为负数,则情同len超出余后的长度,这和php的substr之类的函数不一样。

以下是代码片段:

mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
        -> 'QuWhattic'

mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
        -> 'Quadratic'

mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
        -> 'QuWhat'


      这个函数支持多字节字元。


      3:进制转换函数

      CONV(N,from_base,to_base)

      不同数基间转换数字。返回值为数字的N字符串表示,由from_base基转化为 to_base 基。如有任意一个参数为NULL,则返回值为 NULL。自变量 N 被理解为一个整数,但是可以被指定为一个整数或字符串。最小基数为 2 ,而最大基数则为 36。 If to_base 是一个负数,则 N 被看作一个带符号数。否则, N 被看作无符号数。 CONV() 的运行精确度为 64比特。

以下是代码片段:

mysql> SELECT CONV('a',16,2);
        -> '1010'
mysql> SELECT CONV('6E',18,8);
        -> '172'
mysql> SELECT CONV(-17,10,-18);
        -> '-H'
mysql> SELECT CONV(10+'10'+'10'+0xa,10,10);
        -> '40'

      请看PHP的:

      base_convert ― 在任意进制之间转换数字

      说明:
      string base_convert ( string $number , int $frombase , int $tobase )
      返回一字符串,包含 number 以 tobase 进制的表示。number 本身的进制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之间(包括 2 和 36)。高于十进制的数字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。

      MySQL的进制转换函数还有一个,是一个为16进制而定义的函数:

      HEX(N_or_S)

      如果N_OR_S 是一个数字,则返回一个 十六进制值 N 的字符串表示,在这里,   N 是一个longlong (BIGINT)数。这相当于 CONV(N,10,16)。

      如果N_OR_S 是一个字符串,则返回值为一个N_OR_S的十六进制字符串表示, 其中每个N_OR_S 里的每个字符被转化为两个十六进制数字。

以下是代码片段:

mysql> SELECT HEX(255);
        -> 'FF'
mysql> SELECT 0x616263;
        -> 'abc'
mysql> SELECT HEX('abc');
        -> 616263

      4:字符查找定位函数

      ELT(N,str1,str2,str3,...)

      若N = 1,则返回值为  str1 ,若N = 2,则返回值为 str2 ,以此类推。   若N 小于1或大于参数的数目,则返回值为 NULL 。 ELT() 是  FIELD()的补数。

以下是代码片段:

mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
        -> 'ej'
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
        -> 'foo'

      看见上面这个函数,还以为主要起逻辑判断用的,如:

以下是代码片段:

mysql> SELECT ELT(if(1, 2, 3), 'ej', 'Heja', 'hej', 'foo');      
+----------------------------------------------+
| ELT(if(1, 2, 3), 'ej', 'Heja', 'hej', 'foo') |
+----------------------------------------------+
| Heja                                         |
+----------------------------------------------+
1 row in set (0.00 sec)

      但是一看下面的函数,才明白不仅仅如此:

      FIELD(str,str1,str2,str3,...)

      返回值为str1, str2, str3,……列表中的str 指数。在找不到str 的情况下,返回值为 0 。

      如果所有对于FIELD() 的参数均为字符串,则所有参数均按照字符串进行比较。如果所有的参数均为数字,则按照数字进行比较。否则,参数按照双倍进行比较。

      如果str 为NULL,则返回值为0 ,原因是NULL不能同任何值进行同等比较。FIELD() 是ELT()的补数。

以下是代码片段:

mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 2
mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 0

      这个函数与php中的array_search和array_key_exists、in_array、isset还是有相似作用的。

      再看一下下面这个,不禁拍案叫绝了,直接就是in子句了:

      FIND_IN_SET(str,strlist)

      假如字符串str 在由N 子链组成的字符串列表strlist 中, 则返回值的范围在 1 到 N 之间 。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则   FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。 这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。 

以下是代码片段:

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
        -> 2

      5:数字格式化函数

      FORMAT(X,D)

      将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。

以下是代码片段:

mysql> SELECT FORMAT(12332.123456, 4);
        -> '12,332.1235'
mysql> SELECT FORMAT(12332.1,4);
        -> '12,332.1000'
mysql> SELECT FORMAT(12332.2,0);
        -> '12,332'

      php中类似的函数是:number_format

展开全文  
收起全文  
MySQL的timestamp类型自动更新问题 (MySQL学习)
发布于 2008-09-12 20:23 阅读:77533 评论:1 标签: MySQL timestamp

    注:本文讨论的范围为未启用MAXDB模式的表!

    今天建了一个表,里面有一个列是timestamp类型,我本意是在数据更新时,这个字段的时间能自动更新。岂知对这个类型的值还不甚了解,导致出错。发现这个字段只是在这行数据建立的时候有值,在更新的却无变化。

    查找资料,发现是我建表的语句有问题:

以下是代码片段:

CREATE TABLE `test` (
  `t1` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `ww` varchar(5) NOT NULL
) ENGINE=MyISAM ;

    而实际上,以下两个建表语句的效果是一样的:

以下是代码片段:

CREATE TABLE `test` (
`t1` TIMESTAMP NOT NULL ,
`ww` VARCHAR( 5 ) NOT NULL
) ENGINE = MYISAM

CREATE TABLE `test` (
  `t1` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `ww` varchar(5) NOT NULL
) ENGINE=MyISAM ;

    比较之下,我的语句少了“on update CURRENT_TIMESTAMP”或多了“default CURRENT_TIMESTAMP”。如此一来,这个timestamp字段只是在数据insert的时间建立时间,而update时就不会有变化了。当然,如果你就是想达到这个目的倒也无所谓。

    查找英文手册(http://dev.mysql.com/doc/refman/5.1/en/timestamp.html),得到更详细的解说,翻译如下:

-----------------------------------翻译开始--------------------------------

    在CREATE TABLE语句中,第1个TIMESTAMP列可以用下面的任何一种方式声明:

    1: 如果定义时DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句都有,列值为默认使用当前的时间戳,并且自动更新。

    2: 如果不使用DEFAULT或ON UPDATE子句,那么它等同于DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

    3: 如果只有DEFAULT CURRENT_TIMESTAMP子句,而没有ON UPDATE子句,列值默认为当前时间戳但不自动更新。

    4: 如果没用DEFAULT子句,但有ON UPDATE CURRENT_TIMESTAMP子句,列默认为0并自动更新。

    5: 如果有一个常量值DEFAULT,该列会有一个默认值,而且不会自动初始化为当前时间戳。如果该列还有一个ON UPDATE CURRENT_TIMESTAMP子句,这个时间戳会自动更新,否则该列有一个默认的常量但不会自动更新。

    换句话说,你可以使用当前的时间戳去初始化值和自动更新,或者是其中之一,也可以都不是。(比如,你在定义的时候可以指定自动更新,但并不初始化。)下面的字段定义说明了这些情况:

以下是代码片段:

自动初始化和更新:
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

只自动初始化:
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP

只自动更新
ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP

只是给一个常量(注:0000-00-00 00:00:00)
ts TIMESTAMP DEFAULT 0

-----------------------------------翻译结束--------------------------------

    上面我用红色字体标出了"第1个TIMESTAMP列",这是因为,一个表有多个timestamp列的话,定义起来是不一样的。

    比如上面的第二条:“如果不使用DEFAULT或ON UPDATE子句,那么它等同于DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。”如果是第二个timestamp列就不一样了,请看:

以下是代码片段:

CREATE TABLE `test` (
`ww` VARCHAR( 9 ) NOT NULL ,
`t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`t2` TIMESTAMP NOT NULL
) ENGINE = MYISAM

    这个情况下,数据插入时,t1会记录当前时间,t2为默认值(0000-00-00 00:00:00),等同下面的语句:

以下是代码片段:

CREATE TABLE  `test` (
`ww` VARCHAR( 9 ) NOT NULL ,
`t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`t2` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE = MYISAM

    而根据上面的第二条,应该是:

以下是代码片段:

CREATE TABLE `test` (
`ww` VARCHAR( 9 ) NOT NULL ,
`t1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`t2` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE = MYISAM

    但实际上,上面的语句是个语法错误,mysql会返回:

以下是引用片段:

#1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

    我曾经想这样设计一个表,这个表有两个timestamp列,一个可以记录更新时间,一个可以记录初始时间,但是尝试多次以后,我发现mysql好像做不到这一点,不知道这个是mysql的缺陷还是自我优化,因为,这个功能可以使用datetime实现记录初始化的时间,只是需要insert的时候指定一下。

    顺便说一下,官网上的MySQL中文手册好难看懂,翻译得太粗糙了。等偶过几天有空,把这一节翻译一下。

展开全文  
收起全文  
一场幽默剧和中国足球的希望 (随便说说)
发布于 2008-09-05 13:40 阅读:52821 评论:1 标签: 网店 足球

    自从2008年07月02日北京市工商局在它的官网上发布了《关于贯彻落实《北京市信息化促进条例》加强电子商务监督管理的意见》(外称“网店新规”)(http://www.baic.gov.cn/zwgk/xzgg/200807/t20080702_110070.html)后,幽默剧开始上演了。

    剧中,衙门不与时俱进的精神得到了淋漓尽致的体现。

    网店新规要求:从8月1日起北京营利性网店必须先取得营业执照后才能经营。此后引发各方批评,大意为“必然会增加众多个体网商的成本,可能会扼杀掉还处于婴儿期的中国个人电子商务”。

    以下新闻即为记录:

以下是引用片段:

易宝支付唐彬:网店新规不合时宜
http://tech.sina.com.cn/i/2008-07-31/1527753160.shtml

网店新规门槛高筑:专家呼吁缓行
http://tech.sina.com.cn/i/2008-08-01/01382364734.shtml

85.5%网民担心网店新规阻碍电子商务发展
http://tech.sina.com.cn/i/2008-08-01/07512365221.shtml

吕伯望:地方利益和中央利益不协调导致朝令夕改
http://www.itxinwen.com/view/new/html/2008-08/2008-08-27-88031.html

11名专家联合呼吁暂缓执行网店新规
http://tech.sina.com.cn/i/2008-07-31/13442363706.shtml

    众多新闻中,下面这一条吸引了眼球:

以下是引用片段:

网店执照:红色认证后的500元
http://tech.sina.com.cn/roll/2008-07-11/1029729340.shtml

    在此政府与民众意愿背道而驰的微妙时刻,有人撰写博文《名索网官商勾结公开抢钱?》:
http://blog.sina.com.cn/s/blog_48b6881601009piy.html

    里面指出:

以下是引用片段:

北京工商局为名索做广告:2008年7月2日,北京市工商局规定,从8月1日起电子商务经营者必须在网上公开企业注册真实信息。7月8日,北京市工商局有关人士告诉记者“北京工商目前已初步具备搜查网上无照黑店的技术,将发现一起、关闭一起”。北京市工商局所说的“搜查网上无照黑店”技术,来自一家名为华源润通(北京)科技有限公司提供的“名索验证”――国内工商企业信息查询系统(www.mingsuo.com)。

    博主在文中也给出了些许证据,以证事实。而我也找到了这个新闻:

以下是引用片段:

北京工商局:淘宝北京卖家必须办照---工商已具备网上查黑店技术
http://tech.sina.com.cn/i/2008-07-09/19062315481.shtml

    然后这个新闻是很有意思:

以下是引用片段:

网店新规500元强制性认证费被指子虚乌有
http://tech.sina.com.cn/i/2008-07-28/01352353422.shtml

    对于官商的联系,在我天朝上国隐晦自有一套,普通民众也奈何不了,但问题是,依法办证的过程也是艰巨的。不信?请看下面的新闻:

以下是引用片段:

规则藏暗礁:北京网店办证基本无望
http://tech.sina.com.cn/i/2008-08-29/10592422884.shtml

     事情越闹越烈,网商意识到做人还得靠自己。请看如下blog:

以下是引用片段:

小小网商就把堂堂工商吓成这个样子!
http://blog.sina.com.cn/s/blog_537fd7410100alou.html

    根据上面的博文,及后续的新闻跟进,可以基本看到如下的过程

    天涯论坛几百位网商的代表,“都市醉侠”与“窗花”、“影子”、“万家灯火”等6位被网友称为“网商六君子”的网商代表先是持着申请书来到比较近便的一个工商所(时间我没找到):北京市呼家楼工商管理所,他们得到的答复是:我们级别太低,无法答应接受递交这份材料。

    级别太低,也不能为难权利和责任不对称的人,那就去上一级吧。

    8月27日,在北京市朝阳区工商分局,他们得到的第一个答复是不耐烦地:他们不负责这件事,让6名网商代表去楼下听证科。在听证科他们得到的第二个答复是:工商局只是执行法规的机构,没权力和义务接受递交这份材料。至于转递上级主管部门,工商局表示:他们不能收下这份材料,得由6位网商代表亲自去市政府或者人大提交。

    最终,最幽默的剧情展开了!

    9月10日,6位网商代表去了北京市人大,北京市人大法制办工作人员在认真了解情况,并听取了六位代表的前两次“上书”经历后,当即表示:北京市人民代表大会制订《北京市信息化管理条例》,但网商们反映的问题,属于北京市工商局的执法问题。

    于是,北京市人大法制办建议六位网商代表去行政管理机构市政府递交《听证申请书》。

    很快,六位网商代表随即来到北京市政府,北京市政府信访办人员热情接待了她们。在认真了解情况后,北京市信访办人员真诚地告诉六位网商说:工商系统是一条独立的编制系统,北京市政府也缺乏对他们的约束能力,工商整个系统属于全国工商总局管理。

    最终,信访办人员建议说:要解决这个问题,最合理的办法是到法院提交行政诉讼。

    对于电子商务我不太了解,但我关心的是在这个过程中,政府部门做事的态度,很显然,让他们去踢足球,全国球迷都会看到中国足球的希望的。

    政府的做事态度,和中国足球一样,都需要“革命”。

    更多新闻请看:

以下是引用片段:

国家工商总局局长:网店新规将全国推广
http://tech.sina.com.cn/i/2008-07-18/10442336315.shtml

工商总局对网店新规将全国推广不知情
http://tech.sina.com.cn/i/2008-07-18/15532337102.shtml

杭州工商局称暂不跟进北京网店新规
http://tech.sina.com.cn/i/2008-07-22/18312343635.shtml

天津市不强推网店新规
http://tech.sina.com.cn/i/2008-07-29/14182358038.shtml

北京工商所称至今未开始查无照网店
http://tech.sina.com.cn/i/2008-08-25/09222411246.shtml

网店新规遭遇网商投诉:缘起与争议
http://tech.sina.com.cn/i/2008-09-02/08582428682.shtml

网商代表针对网店新规听证申请书披露
http://tech.sina.com.cn/i/2008-08-28/09192419757.shtml

小小网商就把堂堂工商吓成这个样子!
http://blog.sina.com.cn/s/blog_537fd7410100alou.html

网商申请针对网店新规听证遭拒
http://tech.sina.com.cn/i/2008-09-02/06212428146.shtml

网商申请听证网店新规遭拒拟诉工商局
http://tech.sina.com.cn/i/2008-09-02/14422429789.shtml

网商三请听证:北京政府建议诉讼工商
http://tech.sina.com.cn/i/2008-09-02/14232429747.shtml

网商为诉工商局暗中取证
http://tech.sina.com.cn/i/2008-09-05/01542436741.shtml


展开全文  
收起全文  
来自微软的蜘蛛或测试? (本站点滴)
发布于 2008-09-04 14:23 阅读:27607 评论:0 标签: 测试 微软 蜘蛛

    最近发现流量有点异常,比平常高了一些,令我甚感欣慰。不过查看了具体的流量来源才发现,异常就是异常。

    异常来自live.com,查看他的搜索词,发现都是一个英文单词,技术为主,具体可以看下面的链接,以下只是一部分。

以下是引用片段:

http://search.live.com/results.aspx?q=google
http://search.live.com/results.aspx?q=mysql
http://search.live.com/results.aspx?q=apache
http://search.live.com/results.aspx?q=phpxe
http://search.live.com/results.aspx?q=starbucks
http://search.live.com/results.aspx?q=jackchin
http://search.live.com/results.aspx?q=email
http://search.live.com/results.aspx?q=dehug

    而IP来自两个C网段:65.55.109/110,武林榜给出的地理位置是“美国Microsoft公司”,真是吓煞人啊。以下给出一部分:

以下是引用片段:

65.55.109.169
65.55.109.59
65.55.109.46
65.55.109.83
65.55.109.211
65.55.110.65
65.55.110.99
65.55.110.21
65.55.110.47
65.55.110.134

    莫非是微软的蜘蛛?可是又不像,因为进入来源页发现我的网站根本不在当前页面,有时可以往后翻几页可以看到,但有的却是始终不见踪影。

    莫非人家在是在做测试?据我的经验,开发完后自己做测试是最烦人的,祝福一下这些自己做测试的苦命人吧。

展开全文  
收起全文  
条件查询索引是相当有必要的 (MySQL学习)
发布于 2008-08-26 17:41 阅读:20109 评论:0 标签: mysql 索引

    记得一年半前去面试的时候,题目上有问如何优化题目上的数据库,大脑搜索不出任何东西。后来提示可以加索引,才恍然大悟。再过不久,立马为自己的无知而羞愧。

    前几天处理一个旧的程序,发现数据库给出的结果特别慢,查了一下表也不过30万左右数据量。一看数据结构,发现where子句中的字段没有索引,嘿嘿,立马解脱了......

以下是代码片段:

mysql> select count(*) from appeal ;
+----------+
| count(*) |
+----------+
|   317656 |
+----------+
1 row in set (0.00 sec)

mysql> alter table appeal add index (A_Flag);
Query OK, 317656 rows affected (7.95 sec)
Records: 317656  Duplicates: 0  Warnings: 0

    给现有的数据加索引的速度还是可以接受的,这个字段存储的值也就是个个位数的数字,类型是char(2),31万数据花了7.95秒。

展开全文  
收起全文  
MySQL控制流程函数学习 (MySQL学习)
发布于 2008-08-21 00:09 阅读:23417 评论:0 标签: MySQL 流程

    文章内容大量引用手册《12.2. 控制流程函数》。

    坦率的说,我甚至怀疑我即使精通这一节又有什么用?!在sql语句里面使用这个东西的话,貌似这个需求也太复杂了!

    废话不说,学习一下我不知道,甚至闻所未闻的语句:

    1:类似PHP中的switch(){case : ...}语句

    CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END

    CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

    在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。

    基本上可以认为是编程语言switch结构一个变体,然后又衍生出又一个变体。前者根据判断给定的值来确定流程走向,后者没有给定的值,而是根据不同的条件来确定流程。

    可以看看手册给出的例子:

   

以下是代码片段:

mysql> SELECT CASE 1 WHEN 1 THEN 'one'
        -> WHEN 2 THEN 'two' ELSE 'more' END;
        -> 'one'

mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
        -> 'true'

mysql> SELECT CASE BINARY 'B'
        -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
        -> NULL

    2:类似PHP的三元表达式

    IF(expr1,expr2,expr3)

    如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

    我们熟悉的三元表达式到mysql中就成这个小样了,原谅它吧,毕竟数据库的根本还是存储数据的。让我们瞧瞧它的小样:

以下是代码片段:

mysql> SELECT IF(1>2,2,3);
        -> 3

mysql> SELECT IF(1<2,'yes ','no');
        -> 'yes'

mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
        -> 'no'

    关于这个类三元表达式的返回值是个有趣的话题:

    “如果expr2 或expr3中只有一个明确是 NULL,则IF() 函数的结果类型为非NULL表达式的结果类型。”这句话不太好懂。 来看看下面这句:

    “expr1 作为一个整数值进行计算,就是说,假如你正在验证浮点值或字符串值, 那么应该使用比较运算进行检验。 ”还是看看例子比较好理解:

以下是代码片段:

mysql> SELECT IF(0.1,1,0);
        -> 0

mysql> SELECT IF(0.1<>0,1,0);
        -> 1

    在所示的第一个例子中,IF(0.1)的返回值为0,原因是 0.1 被转化为整数值,从而引起一个对 IF(0)的检验。这或许不是你想要的情况。在第二个例子中,比较检验了原始浮点值,目的是为了了解是否其为非零值。比较结果使用整数。 又是一个数学上的应用,如果你的数据库是和电子商城相关的,可就要注意了!

    IF() (这一点在其被储存到临时表时很重要 ) 的默认返回值类型按照以下方式计算:

以下是引用片段:

表达式

返回值

expr2 expr3 返回值为一个字符串。

字符串

expr2 expr3 返回值为一个浮点值。

浮点

expr2 expr3 返回值为一个整数。 

整数

    另外:“假如expr2 和expr3 都是字符串,且其中任何一个字符串区分大小写,则返回结果是区分大小写。”

    三元表达式在mysql里面会继续演变:

    3:IFNULL(expr1,expr2)

    假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

    如此看来又是三元表达式的变体了,只不过把三元剪成了二元的。可以理解为第一元同时又作为了第三元。

以下是代码片段:

mysql> SELECT IFNULL(1,0);
        -> 1

mysql> SELECT IFNULL(NULL,10);
        -> 10

mysql> SELECT IFNULL(1/0,10);
        -> 10

mysql> SELECT IFNULL(1/0,'yes');
        -> 'yes'

    同样 有返回值类型的问题:

    ULL(expr1,expr2)的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、 REAL或 INTEGER。假设一个基于表达式的表的情况,  或MySQL必须在内存储器中储存一个临时表中IFNULL()的返回值:

以下是代码片段:

CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;

    在这个例子中,测试列的类型为 CHAR(4)。

    4:NULLIF(expr1,expr2)

     看见了么,NULLIF和上面的IFNULL是孪生兄弟呢。

     如果expr1 = expr2  成立,那么返回值为NULL,否则返回值为 expr1。这和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。  

以下是代码片段:

mysql> SELECT NULLIF(1,1);
        -> NULL

mysql> SELECT NULLIF(1,2);
        -> 1

    “注意,如果参数不相等,则 MySQL 两次求得的值为  expr1 。”这句话看得不明白。

    感觉这就乱了,说不定是mysql的开发者为了某个特定的需求胡乱想了一个出来!

    如果用三元表达式来套,就是NULLIF 为 NULL IF :

   

以下是代码片段:

if(exp1 == exp2)

    NULL ;//IF前面的NULL

else

    exp1;

展开全文  
收起全文