正在加载......
类别:[MySQL学习]  时间: 2008-09-22 22:23:34; 浏览: 27541; 评论: 0  

       通览了一下手册,发现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学习]  时间: 2008-09-12 20:23:38; 浏览: 68615; 评论: 1  

    注:本文讨论的范围为未启用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:28; 浏览: 52145; 评论: 1  
Tags : 网店 足球

    自从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:34; 浏览: 26983; 评论: 0  
类别:[MySQL学习]  时间: 2008-08-26 17:41:01; 浏览: 19251; 评论: 0  
Tags : mysql 索引
类别:[MySQL学习]  时间: 2008-08-21 00:09:54; 浏览: 22529; 评论: 0  
Tags : MySQL 流程
类别:[MySQL学习]  时间: 2008-08-15 00:06:10; 浏览: 42883; 评论: 1  
类别:[Linux/Unix]  时间: 2008-08-06 23:22:38; 浏览: 53656; 评论: 0  
类别:[MySQL学习]  时间: 2008-08-05 10:41:22; 浏览: 23474; 评论: 0  
Tags : MySQL PHP trim
类别:[MySQL学习]  时间: 2008-08-04 16:31:18; 浏览: 33876; 评论: 0  
[195][6/20][|<][2][3][4][5][6][7][8][9][10][11][>|] | 回页首
© 2004 - 2017 芽雨快跑 - 本页面所有内容,未经芽雨许可,欢迎转载,请注明出处

京ICP备09017802号