TO   seeku(青春之歌) 不是有意思,是很有意思,
细想想不明白是为什么!!寻求全理解释!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    EXPORT_SET(bits,on,off,[separator,[number_of_bits]]) 
    Returns a string where for every bit set in 'bit', 
    you get an 'on' string and for every reset bit you get an 'off' string.
    Each string is separated with 'separator' (default ',')
    and only 'number_of_bits' (default 64) of 'bits' is used: mysql> SELECT EXPORT_SET(5,'Y','N',',',4)
           -> Y,N,Y,N这个怎么翻译,
    这个函数做何解,
    给出合理答案者照样给分
      

  2.   

    这个函数从低位到高位返回某个64位数的的每一位
    @id  |  =  | EXPORT_SET(@id:=@id+1,'1','0','',8)
    -----+-----+-------------------------------------
       0 |  =  | 10000000
       1 |  =  | 01000000
       2 |  =  | 11000000
       3 |  =  | 00100000
       4 |  =  | 10100000
       5 |  =  | 01100000
       6 |  =  | 11100000
       7 |  =  | 00010000
       8 |  =  | 10010000
       9 |  =  | 01010000
      10 |  =  | 11010000
      11 |  =  | 00110000
      12 |  =  | 10110000
      13 |  =  | 01110000
      14 |  =  | 11110000
      15 |  =  | 00001000
      16 |  =  | 10001000
      

  3.   

    EXPORT_SET(bits,on,off,[separator,[number_of_bits]]) 
    Returns a string 返回一个字符串,对于在 'bits' 中的每个比特字位,你将得到一个 'on' 字符,而如果比特字位是一个清零比特位(reset bit)你将得到一个 'off' 字符串。每个字符串均被“分隔符”(缺省为“,”)分隔,并且只有 'number_of_bits'(缺省为 64) 个 'bits' 被使用: 
    mysql> SELECT EXPORT_SET(5,'Y','N',',',4)
            -> Y,N,Y,N示例(译者注): 
    mysql> select EXPORT_SET(1,'1','0','',5);
            -> 10000 
    # 最左边第一位为 2 的 0 次幂mysql> select EXPORT_SET(2,'1','0','',5);
            -> 01000
    # 最左边第一位为 2 的 0 次幂,第二位为 2 的 1 次幂        mysql> select EXPORT_SET(4,'1','0','',5);
            -> 00100
    # 最左边第一位为 2 的 0 次幂,第二位为 2 的 1 次幂,第三位为 2 的 2 次幂  mysql> select EXPORT_SET(15,'1','0','',5);
            -> 11110
    # 最左边第一位为 2 的 1 次幂,第四位为 2 的 3 次幂  mysql> select EXPORT_SET(16,'1','0','',5);
            -> 00001
    # 最左边第一位为 2 的 1 次幂,第五位为 2 的 4 次幂 
    # 以上结果在 MySQL 4.0.12 中测试通过示例结束(译者注)
      

  4.   

    link '\n' 这个表示什么?
    如果要从数据库中存放\n这个字符而不转意的话就要\\n,存放。那么查询的时候\\n就可以了,为什么非要\\\\哪?
      

  5.   


    # 通过以上三个示例我的理解为 “\\\\”在 LIKE 子句中用于匹配一个“\”字符
    # (反斜线被语法分析器剥离一次,另一次在模式匹配时完成,留下一条单独的反斜线被匹配)
    # '\\\\n' 被剥离了两个反斜线后为“\\n”,
    #       字串中的第一个反斜线是转义符,对第二个反斜线进行转义
    # 所以它匹配一个由 '\n' 两个字符组成的字符串
    mysql> SELECT * FROM `ta` WHERE `memo` LIKE 'a\n';
    +----+------+
    | id | memo |
    +----+------+
    |  4 | a
       |
    +----+------+
    # 字串 “a\n” 没有经任何剥离?直接转义为一个换行符??
    :)所以说,
    不明白!!!!!!!!!!!===============================================
     请大伙将下面的脚本复制粘贴到 mysql.exe 中执行
     -> 鼠标在 命令提示符窗口上 右击===============================================use test;
    tee d:/test.txt;CREATE TABLE `ta` (
      `id` int(3) unsigned NOT NULL,
      `memo` char(6) default NULL,
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM;
    INSERT INTO `ta` VALUES("1", "a\\");
    INSERT INTO `ta` VALUES("2", "a\\\\");
    INSERT INTO `ta` VALUES("3", "a\\n");
    INSERT INTO `ta` VALUES("4", "a\n");
    INSERT INTO `ta` VALUES("5", "a\\%");
    SELECT * FROM `ta`;
    SELECT * FROM `ta` WHERE `memo` = 'a\\'; 
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\';
    SELECT * FROM `ta` WHERE `memo` = 'a\\\\';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\\\\';
    SELECT * FROM `ta` WHERE `memo` = 'a\\n';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\n';
    SELECT * FROM `ta` WHERE `memo` = 'a\n';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\n';
    SELECT * FROM `ta` WHERE `memo` = 'a\\%';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\%';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\\\\';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\\';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\n';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\\n';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\n';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\n';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\%';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\%';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\%';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\\%'; 
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\\\%';
    SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\\\\%';
      

  6.   

    转意列表
    \0    NULL(ASCII 0)
    \'    但引号
    \"    双引号
    \b    退格
    \n    新行
    \r    回车
    \t    制表符
    \\    反斜杠
      

  7.   

    查资料的结果:
    要在串中包括一个引号,有以下三种选择:
    1。如果串是使用相同的引号括起来的,那么在串中需要需要引号的地方双写引号即可。
     例如:'I can''t
           "He said,""I told you so."""
    2。如果串是用另外的引号括起来的,则不需要双写相应的引号。
     例如:"I can't"
           'He said,"I told you so."'
    3。用反斜杠方式表示,这种方法不去管用来将串括起来的是单引号还是双引号。
     例如:'I can\'t'
           "I can\'t"
           "He said, \"I told you so.\""
           'He said, \"I told you so.\"'在串的环境中,可以用十六进制常数来制定串值。每对十六进制的数字被看作ASCII代码转换为字符,其结果做用于串。
     例如:0x616263作为串时为"abc" 。
      

  8.   


    但是在 Like 模式匹配的,针对 字符“\”的转义就很难解释了:)
      

  9.   

    '\'hello'这个能执行,但是它可是错!MySQL可能会取消\' \"的支持从ODBC界面里边,因为会诱发安全问题。
      

  10.   

    感觉mysql对于sql语句的格式定义不够严谨,
    比如同时可以使用单引号或者双引号来表示串在like语句中\的使用十分麻烦,我还没有摸出规律,
    基本上可以这么做,对被匹配的串进行转换:
    '变成''
    \变成\\\\
    _变成\_
    %变成\%
    要按照顺序啊
      

  11.   

    seeku(青春之歌)与你有点同感!
    可能是 MySQL 的自由度比较高,
    有较多的冗错选特性
      

  12.   

    在实践中我发现了令我更吐血的事情,请看下面
    mysql> create table tt (a varchar(30));
    Query OK, 0 rows affected (0.05 sec)mysql> insert into tt values ('abc');
    Query OK, 1 row affected (0.33 sec)mysql> insert into tt values ('abc%');
    Query OK, 1 row affected (0.05 sec)mysql> select *from tt;
    +------+
    | a    |
    +------+
    | abc  |
    | abc% |
    +------+
    2 rows in set (0.00 sec)mysql> select * from tt where a like 'abc%';
    +------+
    | a    |
    +------+
    | abc  |
    | abc% |
    +------+
    2 rows in set (0.00 sec)mysql> select * from tt where a like 'ABC%';
    +------+
    | a    |
    +------+
    | abc  |
    | abc% |
    +------+
    2 rows in set (0.00 sec)mysql> alter table tt add index idx_tt_a (a);
    Query OK, 2 rows affected (0.53 sec)
    Records: 2  Duplicates: 0  Warnings: 0mysql> select * from tt where a like 'ABC%';
    +------+
    | a    |
    +------+
    | abc% |
    +------+
    1 row in set (0.00 sec)mysql> select * from tt where a like 'ABC%';
    +------+
    | a    |
    +------+
    | abc% |
    +------+
    1 row in set (0.00 sec)mysql>从上面可以看出,如果加上了索引,如果使用'ABC%'是不能把'abc'检索出来的。
    吐血啊吐血啊
      

  13.   

    呵呵,
    这是决对不应该的,
    我的是  MySQL 4.0.12  没你的现象,
    你用的是什么版本??
      

  14.   

    我的版本和你一样,但我使用的是innodb类型,
    刚刚我使用myisam,发现没有这种现象。mysql> drop table tt;
    Query OK, 0 rows affected (0.07 sec)mysql> create table tt (a varchar(30)) type = MyISAM;
    Query OK, 0 rows affected (0.00 sec)mysql> insert into tt values ('abc');
    Query OK, 1 row affected (0.09 sec)mysql> select * from tt where a like 'abc%';
    +------+
    | a    |
    +------+
    | abc  |
    +------+
    1 row in set (0.00 sec)mysql> alter table tt add index idx_tt_a (a);
    Query OK, 1 row affected (0.30 sec)
    Records: 1  Duplicates: 0  Warnings: 0mysql> select * from tt where a like 'abc%';
    +------+
    | a    |
    +------+
    | abc  |
    +------+
    1 row in set (0.01 sec)mysql>
      

  15.   

    呵呵,
    必竟 MySQL 还是发展中的版本,可能在各方面处理里还没有完全统一标准
    :)
      

  16.   

    shuixin13(犬犬(心帆)) ,让你看看更吐血的
    mysql> select name,specification from ware_info where  help_code='dsj' ;
    +--------+---------------+
    | name   | specification |
    +--------+---------------+
    | 电视机 | 黑白          |
    | 电视机 | 全平          |
    | 电视机 | 背投          |
    +--------+---------------+
    3 rows in set (0.00 sec)mysql> select name,specification from ware_info where help_code like 'dsj%' or  help_code='dsj' ;
    Empty set (0.00 sec)mysql> select name,specification from ware_info where (help_code like 'dsj%') or ( help_code='dsj') ;
    Empty set (0.27 sec)
       ---可以看出,这个or非但没有起作用,还把本该出现的纪录都弄没了
    mysql> use test;
    Database changed
    mysql> select * from tt where a = 'abc' and  a like 'abc%';
    +------+
    | a    |
    +------+
    | abc  |
    +------+
    1 row in set (0.00 sec)mysql> insert into tt values ('abcd');
    Query OK, 1 row affected (0.04 sec)mysql> select * from tt where a = 'abc' and  a like 'abc%';
    +------+
    | a    |
    +------+
    | abc  |
    +------+
    1 row in set (0.01 sec)在这个表中,or的作用和上一个表不一样。
    mysql> insert into tt values ('abcd');
    Query OK, 1 row affected (0.04 sec)mysql> select * from tt where a = 'abc' and  a like 'abc%';
    +------+
    | a    |
    +------+
    | abc  |
    +------+
    1 row in set (0.01 sec)
    可以看出a like 'abc%'没有起作用!
    天,我都不知道怎么解释了
    我都怀疑我会在一个星期内放弃mysql!
      

  17.   

    mysql> select name,specification from ware_info where help_code like 'dsj%' or  help_code='dsj' ;
    Empty set (0.00 sec)mysql> select name,specification from ware_info where (help_code like 'dsj%') or ( help_code='dsj') ;
    Empty set (0.27 sec)
       ---可以看出,这个or非但没有起作用,还把本该出现的纪录都弄没了的确是很不可思义的,
    这也是在 InnoDB 表中吗??
      

  18.   

    是的,innodb类型,我现在正在考虑下午去买一张ms-sql,好像深圳市面上没有D版的professional的ms-sql,郁闷。尽管mysql需要还有些缺点,但是如果我们知道这个缺点的存在,就可以通过增加编码量来绕过
    这些缺点,总之,mysql作为免费的软件,还真的不错。我还是会继续使用的
      

  19.   

    :)InnoDB 引擎并不是 MySQL AB 公司自己的,
    所以可以在标准统一上有点问题,
    相信 MySQL 会做得越来越好,正如你所述,
    知道了它的一些限制,
    在应用程序中就可以尽力避免它了:(
      

  20.   

    郁闷,看了上面的帖子发现mysql的最新版本很多问题。哎,做项目还得用3.23.56呀。
      

  21.   

    3.23.56的windows版本对中文支持不好
      

  22.   

    ---------------------------------------
    select * from ta where id=3
    此时显示的是
    id: 3  memo: a\n 
    此时数据库中元数据是
    id: 3  memo: a\\n
    ---------------------------------------
    select * from ta where memo='a\\n'
    此时显示的是
    id: 3  memo: a\n 
    数据库在操作时把a\\n<不经处理>地同元数据比较,找到这个记录select * from ta where memo='_\\n'
    此时显示的是
    id: null memo: null如果有字符串匹配处理操作,上面语句应该出来的是: 
    id: 3 memo: a\n 
    而不是:
    id: null memo: null---------------------------------------
    select * from ta where memo like 'a\\\\n'
    首先对'a\\\\n'进行处理,处理后查找元数据中含有'a\\n'的记录
    因此出现的是
    id: 3 memo: a\n select * from ta where memo like 'a_\\n'
    结果显示为:
    id: 3 memo: a\n 
    可以证明该条语句事先已对做过处理处理时将"\\"转化为"\"是合理的,因为有时需要寻找一个诸如单引号之类的特殊字符,就要这样输入:
    select * from TABLE where FIELD like 'I\'m'
    如果不这样做就会出错因此MySql在这里没什么错
    ---------------------------------------打印的时候出了换行应该是前端程序在使用输出语句的时候碰上了换行符\n
    自然而然打出的换行,这里也不算错
    因为选择出来的东西可能会是有格式一段文章,没有换行符就会显示的乱七八糟了
      

  23.   

    TO  sesamepaste(芝麻酱) mysql> SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\n'; 
    +----+------+
    | id | memo |
    +----+------+
    |  3 | a\n  |
    +----+------+那下面的作何解??mysql> SELECT * FROM `ta` WHERE `memo` LIKE 'a\\\\\\n';
    +----+------+
    | id | memo |
    +----+------+
    |  3 | a\n  |
    +----+------+
      

  24.   

    -------------------------------------
    由于 id为3的记录memo的数据为: a\\n
    原问题简化为检验表达式值的真假:
    select 'a\\n' like 'a\\\\\\n'
    此时显示的结果为1,与SQL语句select * from ta where memo like 'a\\\\\\n'的结果相符
    -------------------------------------
    select 'a \\ n' like 'a \\\\\\ n'
    结果: 1select 'a \ \ n' like 'a \\\ \\\ n'
    结果: 1
    -------------------------------------
    现在字符串'a\\\\\\n'被分为4部分,取其中之一:
    select '\ ' like '\\\ '
    结果: 1-------------------------------------
    select '\a'
    结果: "a"
    反斜杠与后面的字符组合如没有特殊的含义,处理的结果为后面的字符select '\\\a'
    结果: "\a"
    如果有特殊含义,就转化成所定义的值-------------------------------------
    select '\a' like '\\\a'
    结果: 1select '\a' like '\\\\a'
    结果: 1select '\\\a' like '\\\\a'
    结果: 1但是
    select '\a' like '\\\\a'
    结果: 0MySql Reference中String Comparison Functions写到:
    Note: Because MySQL uses the C escape syntax in strings (for example, `\n'), you must double any `\' that you use in your LIKE strings. For example, to search for `\n', specify it as `\\n'. To search for `\', specify it as `\\\\' (the backslashes are stripped once by the parser and another time when the pattern match is done, leaving a single backslash to be matched). select '\\\\a' like '\\\\a'
    结果: 0
    当"\"小于4个时候进行处理,大于等于4个可能会算作异常(估计)具体是怎么处理的我也晕了,看看源代码就好了
      

  25.   

    字符转移是递归处理的,看看:
    原始:a\\\\n
    第一次 a\\n
    第二次 a\n
    又如:a\\\\\\n
    第一次 a\\\\n
    第二次 a\\n
    第三次 a\n直到\没有可以匹配的转移字符为止。\\,\\\\这种情况会不停的转是因此\这个字符的二进制编码造成的。你可以说是bug,但是就是那么回事。
      

  26.   

    这个MySQL在转移这部分存在的最大问题就是无法分清是一个NULL字符还是查询中有两个(","")空格。 ^_^