39位数字的T-SQL数据类型?

Posted

技术标签:

【中文标题】39位数字的T-SQL数据类型?【英文标题】:T-SQL data type for 39-digit number? 【发布时间】:2019-09-16 22:19:42 【问题描述】:

我正在使用来自Ip2Location 的免费 IPv6 数据表。表架构定义为:

CREATE TABLE [ip2location].[dbo].[ip2location_db11_ipv6](
    [ip_from] char(39) NOT NULL,
    [ip_to] char(39) NOT NULL,
    [country_code] nvarchar(2) NOT NULL,
    [country_name] nvarchar(64) NOT NULL,
    [region_name] nvarchar(128) NOT NULL,
    [city_name] nvarchar(128) NOT NULL,
    [latitude] float NOT NULL,
    [longitude] float NOT NULL,
    [zip_code] nvarchar(30) NOT NULL,
    [time_zone] nvarchar(8) NOT NULL
) ON [PRIMARY]
GO

CREATE INDEX [ip_from] ON [ip2location].[dbo].[ip2location_db11_ipv6]([ip_from]) ON [PRIMARY]
GO

CREATE INDEX [ip_to] ON [ip2location].[dbo].[ip2location_db11_ipv6]([ip_to]) ON [PRIMARY]
GO

通过将 IPv6 地址转换为 IpNumber 来完成表查询。提供的搜索查询是:

SELECT *
FROM ip2location_db11_ipv6
WHERE @IpNumber BETWEEN ip_from AND ip_to

我基于几次随机查找的平均查询时间约为 1.2 秒。虽然表中有3,458,959 记录,但这对我来说似乎有点慢(是吗?我绝不是SQL 大师)。我的第一个想法是将ip_fromip_to 列设为数字数据类型,但最大值为58569107375850417935858934690443427840(39 位),超出了DECIMAL 类型的最大范围。有什么办法可以缩短查询时间吗?

【问题讨论】:

什么数据库,什么版本? csv 中的文本是什么样的?既然应该是约会,你能不能把它变成约会? Microsoft SQL Server 2016 忽略我的date 评论。我误读了数据应该是什么。您是否按照blog.ip2location.com/knowledge-base/… 中的步骤填充您的IP_TOIP_FROM 字符串? (更正表名) @IPNumber 的值和数据类型是什么?您正在使用 BETWEEN 进行隐式转换,这可能会影响您的查询时间。 【参考方案1】:

您可以尝试使用BINARY(17),39 位小数适合 17 个字节。 Binary type doc.

【讨论】:

以上是关于39位数字的T-SQL数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL中向表中插入一条数据,其中类型为Decimal的列对应的插入值为‘2400’可就是不行还报“......

T-SQL 高级查询

2017-03-10T-sql基础语句及条件,高级查询

oracle里的date类型怎么查询

cobol中comp数据类型的小问题,请大虾帮忙

“字节”数据类型大小 = 1 字节,而它可以有 3 位数字?