首页 > 数据库 >完善SQL二进制到IP地址字符串转换(Perfecting SQL binary to IP Address string conversion)

完善SQL二进制到IP地址字符串转换(Perfecting SQL binary to IP Address string conversion)

时间:2023-04-14 11:22:49浏览次数:31  
标签:binary 39 Perfecting SQL binaryIP IPv4 IP地址

我们使用二进制(16)字段来存储IP地址。 我们这样做,因为它可以同时拥有IPv4和IPv6地址,并且很容易与.Net IPAddress类一起使用。

但是,为了报告目的,我创建了以下SQL函数将二进制地址转换为IP地址字符串。

CREATE FUNCTION fn_ConvertBinaryIPAddressToString
(
    @binaryIP binary(16)
)
RETURNS nvarchar(39)
AS
BEGIN
    DECLARE @ipAsString nvarchar(39)

    -- Is IPv4
    IF (substring(@binaryIP, 5, 1) = 0x00)  <-- Is there a better way?
    BEGIN

        SELECT @ipAsString = CAST(CAST(substring(@binaryIP, 1, 1) AS int) AS nvarchar(3)) + '.' +
        CAST(CAST(substring(@binaryIP, 2, 1) AS int) AS nvarchar(3)) + '.' +
        CAST(CAST(substring(@binaryIP, 3, 1) AS int) AS nvarchar(3)) + '.' +
        CAST(CAST(substring(@binaryIP, 4, 1) AS int) AS nvarchar(3))

    END
    ELSE
    BEGIN
    -- Is IPv6
        -- taken and modified from http://support.microsoft.com/kb/104829
        DECLARE @i int
        DECLARE @length int
        DECLARE @hexstring char(16)

        SELECT @ipAsString = ''
        SELECT @i = 1
        SELECT @length = 16
        SELECT @hexstring = '0123456789ABCDEF'

        WHILE (@i <= @length)
        BEGIN
            DECLARE @tempint int
            DECLARE @firstint int
            DECLARE @secondint int

            SELECT @tempint = convert(int, substring(@binaryIP,@i,1))
            SELECT @firstint = floor(@tempint/16)
            SELECT @secondint = @tempint - (@firstint*16)

            SELECT @ipAsString = @ipAsString + substring(@hexstring, @firstint+1, 1) + substring(@hexstring, @secondint+1, 1)

            IF (@i % 2 = 0)
                SELECT @ipAsString = @ipAsString + ':'

            SELECT @i = @i + 1
       END
    END

    -- Return the result of the function
    RETURN @ipAsString

END
GO

 

此刻如果5字节是0,我认为它是一个IPv4地址。 这是一个安全的假设吗? 检查所有剩余字节为零还是有更好的方法更好?

编辑删除不必要的演员



We use a binary(16) field to store IP Addresses. We do this as it can hold both IPv4 and IPv6 addresses and is easily used with the .Net IPAddress class.

However I have created the following SQL function to convert the binary address to the IP Address string for reporting purposes.

CREATE FUNCTION fn_ConvertBinaryIPAddressToString
(
    @binaryIP binary(16)
)
RETURNS nvarchar(39)
AS
BEGIN
    DECLARE @ipAsString nvarchar(39)

    -- Is IPv4
    IF (substring(@binaryIP, 5, 1) = 0x00)  <-- Is there a better way?
    BEGIN

        SELECT @ipAsString = CAST(CAST(substring(@binaryIP, 1, 1) AS int) AS nvarchar(3)) + '.' +
        CAST(CAST(substring(@binaryIP, 2, 1) AS int) AS nvarchar(3)) + '.' +
        CAST(CAST(substring(@binaryIP, 3, 1) AS int) AS nvarchar(3)) + '.' +
        CAST(CAST(substring(@binaryIP, 4, 1) AS int) AS nvarchar(3))

    END
    ELSE
    BEGIN
    -- Is IPv6
        -- taken and modified from http://support.microsoft.com/kb/104829
        DECLARE @i int
        DECLARE @length int
        DECLARE @hexstring char(16)

        SELECT @ipAsString = ''
        SELECT @i = 1
        SELECT @length = 16
        SELECT @hexstring = '0123456789ABCDEF'

        WHILE (@i <= @length)
        BEGIN
            DECLARE @tempint int
            DECLARE @firstint int
            DECLARE @secondint int

            SELECT @tempint = convert(int, substring(@binaryIP,@i,1))
            SELECT @firstint = floor(@tempint/16)
            SELECT @secondint = @tempint - (@firstint*16)

            SELECT @ipAsString = @ipAsString + substring(@hexstring, @firstint+1, 1) + substring(@hexstring, @secondint+1, 1)

            IF (@i % 2 = 0)
                SELECT @ipAsString = @ipAsString + ':'

            SELECT @i = @i + 1
       END
    END

    -- Return the result of the function
    RETURN @ipAsString

END

 


GO

At the moment if the 5 byte is 0 I assume it is an IPv4 address. Is this a safe assumption? Is it better to check all the remaining bytes for zeros or is there a better way?

EDIT removed unnecessary cast

标签:binary,39,Perfecting,SQL,binaryIP,IPv4,IP地址
From: https://www.cnblogs.com/jianxiaoxiu/p/17317752.html

相关文章

  • PHP站点及mysql常用操作
    1.mysql查询表里面重复数据SELECT*FROM表名xxxxaWHERE((SELECTCOUNT(*)FROM 表名xxxxWHEREtitle=a.title)>1)ORDERBYtitleDESC//查询标题重复文章SELECT*FROM 表名xxxxaWHERE((SELECTCOUNT(*)FROM 表名xxxxWHEREtitle=a.title)>1)andchann......
  • Mysql_快速返回机制的实现
    MYSQLJDBC快速查询响应的方法,快速返回机制的实现Oracle的快速返回机制,虽然结果集很多,可是它能很快的显示第一个结果,虽然通过MYSQl的客户端可以做到,但是通过JDBC却不行。今天用了1个多小时,终于搞定此问题,希望对广大Java朋友在处理数据库时有个参考。来由:   通过命令行客户端加......
  • Mysql_JDBC OutOfMemoryError
    MySQL的JDBCOutOfMemoryError:Javaheapspace异常       MySql数据库通过JDBC对大表进行查询时抛出java.lang.OutOfMemoryError:Javaheapspace异常。这是因为默认情况下,MySQL的JDBC驱动会一下子把所有row都读取下来,这在一般情况下是最优的,因为可以减少Client-Server......
  • 使用反射按照类结构生成MySQL表
    因为一个表对应一个java类,如果java类多了,一个一个创建表太消耗时间了,同时也想造下轮子。加深下对反射和注解的使用反射和注解把java一切皆对象的思想完全的体现了出来,同时也给java提供了强大的动态性。主要进行工作的类,可以在里面加上jdbc,就可以实现自动创建表了。importjava.......
  • mysql笔记
    1.3、数据库分类关系型数据库:(sql)MySql,Oracle,SqlServer,DB2,SQLlite通过表和表之间,行和列之间的关系进行数据的存储,学员信息表,考勤表,。。。。。非关系型数据库:(NoSQL)NotOnlyRedis,MongDB非关系型数据库,对象存储,通过对象的自身属性来决定。DBMS(数据库管理系统)数据库的......
  • MySql查询语句根据年份或月份查询
    1.按年份查询select字段名from表whereyear(字段名)='年份';2.按月份查询:select字段名from表wheremonth(字段名)='月份';3.查本年的某一天(例本年的第6天)select字段名from表wheredayofyear(字段名)='6';......
  • SQLite performance tuning
    SQLiteperformancetuning-ScalingSQLitedatabasestomanyconcurrentreadersandmultiplegigabyteswhilemaintaining100kSELECTspersecond-phiresky'sblog ScalingSQLitedatabasestomanyconcurrentreadersandmultiplegigabyteswhilemain......
  • percona-toolkit工具:使用pt-table-checksum检查MySQL主从库的差异
    环境介绍CentOS7.6MySQL5.7PerconaToolkit3.4.0 下载并安装PerconaToolkit从WEB端下载https://www.percona.com/downloads或者通过wget下载[root]#wgethttps://downloads.percona.com/downloads/percona-toolkit/3.5.2/binary/redhat/7/x86_64/percona-toolkit-3.......
  • 快速登录任意mysql脚本
    ######################!/bin/bash#获取输入参数ip=""port=""database=""query=""password_BASE64='WldFeU1HTXhaVFkxWWpnMk56WTFNVFUyTkRObE5qazQK'while[$#-gt0]docase$1in-h)i......
  • 为什么 SQLite 一定要用 C 语言来开发?
    SQLite是一种专门为在Unix和类Unix操作系统上运行的Linux服务器应用程序而设计的数据库管理系统,是一种轻量级的关系型数据库管理系统,它适用于许多嵌入式设备和物联网设备。它使用C语言编写,并且是一个开源项目。简单易用:SQLite的语法简单易懂,不需要专业的编程知识,因此适......