暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 杂项函数(2)

数据库杂货铺 2021-10-06
493
杂项函数
 
 INET_ATON(expr)
 
以字符串形式给定以点分割的 IPv4 网络地址,返回一个整数,该整数以网络字节顺序(最高位开始传送)表示地址的数值。如果 INET_ATON() 不理解其参数,则返回 NULL
 
    mysql> SELECT INET_ATON('10.0.5.9');
    -> 167773449
    复制
     
    对于本例,返回值计算为 10×256^3 + 0×256^2 + 5×256 + 9
     
    INET_ATON() 可能会也可能不会为短格式的 IP 地址(比如 '127.1' 作为 '127.0.0.1' 的表示)返回一个非 NULL 结果。因此,不应该将 INET_ATON() 用于此类地址。
     
    注意
     
    要存储由 INET_ATON() 生成的值,请使用 INT UNSIGNED 列,而不是有符号的 INT 列。如果使用带符号列,则第一个八位组大于127IP地址值将无法正确存储。
     
     INET_NTOA(expr)
     
    给定以网络字节顺序表示的数字 IPv4 网络地址,采用连接的字符集返回以点分割的形式的地址字符串。如果 INET_NTOA() 不理解其参数,则返回 NULL
     
      mysql> SELECT INET_NTOA(167773449);
      -> '10.0.5.9'
      复制
       
       INET6_ATON(expr)
       
      以字符串形式给定 IPv6 IPv4 网络地址,返回一个二进制字符串,该字符串以网络字节顺序表示地址的数值。由于数字格式的 IPv6 地址需要的字节超出整数类型表示范围,因此该函数返回的表示形式为 VARBINARY 数据类型:IPv6 地址为 VARBINARY(16)IPv4 地址为 VARBINARY(4)。如果参数不是有效地址,INET6_ATON() 返回 NULL
       
      以下示例使用 HEX() 以可打印的形式显示 INET6_ATON() 结果:
       
        mysql> SELECT HEX(INET6_ATON('fdfe::5a55:caff:fefa:9089'));
        -> 'FDFE0000000000005A55CAFFFEFA9089'
        mysql> SELECT HEX(INET6_ATON('10.0.5.9'));
        -> '0A000509'
        复制
         
        INET6_ATON() 有效参数遵守几个约束条件。下面的列表中给出了这些例子。
         
         不允许末尾使用区域 ID,如 fe80::3%1 fe80::3%eth0
         
         不允许末尾使用网络掩码,如 2001:45f:3:ba::/64 198.51.100.0/24
         
         对于表示 IPv4 地址的值,只支持无类地址。像 198.51.1 这样的分类地址将被拒绝。不允许末尾跟随端口号,如 198.51.100.2:8080。在地址组成中不允许使用十六进制数,如 198.0xa0.1.2。不支持八进制数: 198.51.010.1 被视为 198.51.10.1,而不是 198.51.8.1。这些 IPv4 约束也适用于包含 IPv4 地址部分的 IPv6 地址,如 IPv4 兼容或 IPv4 映射地址。
         
        要将以整数形式表示的 IPv4 地址 expr 转换为以数字形式表示的 IPv6 地址(VARBINARY 值表示),请使用以下表达式:
         
          INET6_ATON(INET_NTOA(expr))
          复制
           
          例如:
           
            mysql> SELECT HEX(INET6_ATON(INET_NTOA(167773449)));
            -> '0A000509'
            复制
             
            如果从 mysql 客户端内部调用 INET6_ATON(),二进制字符串将使用十六进制表示法显示,这取决于 --binary-as-hex 的值。
             
             INET6_NTOA(expr)
             
            给定一个以数字形式表示为二进制字符串的 IPv6 IPv4 网络地址,将地址的字符串表示形式返回为连接字符集中的字符串。如果参数不是有效地址,INET6_NTOA() 返回 NULL
             
            INET6_NTOA() 有以下属性:
             
             它不使用操作系统函数来执行转换,因此输出字符串是平台独立的。
             
             返回字符串的最大长度为39 (4 x 8 + 7)
             
              CREATE TABLE t AS SELECT INET6_NTOA(expr) AS c1;
              复制
               
              结果表将有这样的定义:
               
                CREATE TABLE t (c1 VARCHAR(39) CHARACTER SET utf8 DEFAULT NULL);
                复制
                 
                 返回字符串使用小写字母表示 IPv6 地址。
                 
                  mysql> SELECT INET6_NTOA(INET6_ATON('fdfe::5a55:caff:fefa:9089'));
                  -> 'fdfe::5a55:caff:fefa:9089'
                  mysql> SELECT INET6_NTOA(INET6_ATON('10.0.5.9'));
                  -> '10.0.5.9'

                  mysql> SELECT INET6_NTOA(UNHEX('FDFE0000000000005A55CAFFFEFA9089'));
                  -> 'fdfe::5a55:caff:fefa:9089'
                  mysql> SELECT INET6_NTOA(UNHEX('0A000509'));
                  -> '10.0.5.9'
                  复制
                   
                  如果从 mysql 客户端内部调用 INET6_NTOA(),二进制字符串将使用十六进制表示法显示,这取决于 --binary-as-hex 的值。
                   
                   IS_IPV4(expr)
                   
                  如果参数是指定为字符串的有效 IPv4 地址,则返回 1,否则返回 0
                   
                    mysql> SELECT IS_IPV4('10.0.5.9'), IS_IPV4('10.0.5.256');
                    -> 1, 0
                    复制
                     
                    对于给定的参数,如果 IS_IPV4() 返回 1,则 INET_ATON()(INET6_ATON())返回非 NULL。相反的语句则不成立:在某些情况下,当 IS_IPV4() 返回 0 时,INET_ATON() 返回非 NULL
                     
                    如上所述,IS_IPV4() INET_ATON() 更严格地规定了有效 IPv4 地址的构成,因此,对于需要对无效值执行强检查的应用程序来说,IS_IPV4() 可能很有用。或者,使用 INET6_ATON() IPv4地址转换为内部形式,并检查 NULL 结果(表示无效地址)。在检查IPv4地址方面,INET6_ATON() IS_IPV4() 同样强大。
                     
                     IS_IPV4_COMPAT(expr)
                     
                    该函数接受一个以数字形式表示的二进制字符串的 IPv6 地址,如同 INET6_ATON() 返回值。如果参数是有效的兼容 IPv4 IPv6 地址,则返回 1,否则返回 0IPv4 兼容地址的格式为 ::ipv4_address
                     
                      mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9'));
                      -> 1
                      mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::ffff:10.0.5.9'));
                      -> 0
                      复制
                       
                      兼容 IPv4 地址的 IPv4 部分也可以用十六进制表示法表示。例如,198.51.100.1 有以下十六进制值:
                       
                        mysql> SELECT HEX(INET6_ATON('198.51.100.1'));
                        -> 'C6336401'
                        复制
                         
                        IPv4 兼容形式表示,::198.51.100.1 等价于 ::c0a8:0001 (不带前导零)::c0a8:1
                         
                          mysql> SELECT
                          -> IS_IPV4_COMPAT(INET6_ATON('::198.51.100.1')),
                          -> IS_IPV4_COMPAT(INET6_ATON('::c0a8:0001')),
                          -> IS_IPV4_COMPAT(INET6_ATON('::c0a8:1'));
                          -> 1, 1, 1
                          复制
                           
                           IS_IPV4_MAPPED(expr)
                           
                          该函数接受一个以数字形式表示的二进制字符串的 IPv6 地址,如同 INET6_ATON() 返回值。如果参数是一个有效的 IPv4 映射的 IPv6 地址,则返回 1,否则返回 0IPv4 映射的地址格式为 ::ffff:ipv4_address
                           
                            mysql> SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9'));
                            -> 0
                            mysql> SELECT IS_IPV4_MAPPED(INET6_ATON('::ffff:10.0.5.9'));
                            -> 1
                            复制
                             
                            IS_IPV4_COMPAT() 一样,IPv4 映射地址的 IPv4 部分也可以用十六进制表示法表示:
                             
                              mysql> SELECT
                              -> IS_IPV4_MAPPED(INET6_ATON('::ffff:198.51.100.1')),
                              -> IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:0001')),
                              -> IS_IPV4_MAPPED(INET6_ATON('::ffff:c0a8:1'));
                              -> 1, 1, 1
                              复制
                               
                               IS_IPV6(expr)
                               
                              如果参数是指定为字符串的有效 IPv6 地址,则返回 1,否则返回 0。此函数不认为 IPv4 地址是有效的 IPv6 地址。
                               
                                mysql> SELECT IS_IPV6('10.0.5.9'), IS_IPV6('::1');
                                -> 0, 1
                                复制
                                 
                                对于给定的参数,如果 IS_IPV6() 返回 1INET6_ATON() 返回非 NULL
                                 
                                 IS_UUID(string_uuid)
                                 
                                如果参数是有效的字符串格式 UUID,则返回 1,否则返回 0,如果参数是 NULL,则返回 NULL
                                 
                                “有效”表示该值的格式是可以解析的。也就是说,它具有正确的长度,并且只包含允许的字符(字母大小写的十六进制数字,以及可选的破折号和花括号)。这种格式是最常见的:
                                 
                                  aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
                                  复制
                                   
                                  这些格式也被允许:
                                   
                                    aaaaaaaabbbbccccddddeeeeeeeeeeee
                                    {aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}
                                    复制
                                     
                                    关于值中字段的含义,请参见 UUID() 函数描述。
                                     
                                      mysql> SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db');
                                      +-------------------------------------------------+
                                      | IS_UUID('6ccd780c-baba-1026-9564-5b8c656024db') |
                                      +-------------------------------------------------+
                                      | 1 |
                                      +-------------------------------------------------+
                                      mysql> SELECT IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB');
                                      +-------------------------------------------------+
                                      | IS_UUID('6CCD780C-BABA-1026-9564-5B8C656024DB') |
                                      +-------------------------------------------------+
                                      | 1 |
                                      +-------------------------------------------------+
                                      mysql> SELECT IS_UUID('6ccd780cbaba102695645b8c656024db');
                                      +---------------------------------------------+
                                      | IS_UUID('6ccd780cbaba102695645b8c656024db') |
                                      +---------------------------------------------+
                                      | 1 |
                                      +---------------------------------------------+
                                      mysql> SELECT IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}');
                                      +---------------------------------------------------+
                                      | IS_UUID('{6ccd780c-baba-1026-9564-5b8c656024db}') |
                                      +---------------------------------------------------+
                                      | 1 |
                                      +---------------------------------------------------+
                                      mysql> SELECT IS_UUID('6ccd780c-baba-1026-9564-5b8c6560');
                                      +---------------------------------------------+
                                      | IS_UUID('6ccd780c-baba-1026-9564-5b8c6560') |
                                      +---------------------------------------------+
                                      | 0 |
                                      +---------------------------------------------+
                                      mysql> SELECT IS_UUID(RAND());
                                      +-----------------+
                                      | IS_UUID(RAND()) |
                                      +-----------------+
                                      | 0 |
                                      +-----------------+
                                      复制
                                       
                                       
                                       
                                       
                                       
                                      官方网址:
                                      https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html
                                      文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                      评论