MySQL表上的算术溢出甚至在增加列长度之后

时间:2016-07-13 10:12:41

标签: mysql sql-server math casting overflow

我在MS SQL Server上有一个链接服务器,它打开一个MySQL表,其定义如下:

CREATE TABLE `postilion_data_tst` (
  `issuer` varchar(32) DEFAULT '',
  **`post_tran_id` bigint(12) DEFAULT '0',**
  `post_tran_cust_id` bigint(8) DEFAULT '0',
  `settle_entity_id` int(4) DEFAULT '0',
  `batch_nr` int(4) DEFAULT '0',
  `settle_cash_req` double DEFAULT '0',
  `settle_amount_rsp` double DEFAULT '0',
  `settle_amount_req` double DEFAULT '0',
  `sink_node_name` varchar(30) DEFAULT '',
  `tran_postilion_originated` double DEFAULT '0',
  `tran_completed` double DEFAULT '0',
  `message_type` varchar(4) DEFAULT '',
  `tran_type` varchar(2) DEFAULT '',
  `tran_nr` bigint(8) DEFAULT '0',
  `system_trace_audit_nr` varchar(6) DEFAULT '',
  `rsp_code_req` varchar(2) DEFAULT '',
  `rsp_code_rsp` varchar(2) DEFAULT '',
  `sponsor_bank` varchar(8) DEFAULT '',
  `retrieval_reference_nr` varchar(12) DEFAULT '',
  `datetime_tran_gmt` datetime DEFAULT NULL,
  `datetime_tran_local` datetime DEFAULT NULL,
  `datetime_req` datetime DEFAULT NULL,
  `datetime_rsp` datetime DEFAULT NULL,
  `realtime_business_date` datetime DEFAULT NULL,
  `recon_business_date` datetime DEFAULT NULL,
  `from_account_type` varchar(2) DEFAULT '',
  `to_account_type` varchar(2) DEFAULT '',
  `from_account_id` varchar(28) DEFAULT '',
  `to_account_id` varchar(28) DEFAULT '',
  `tran_amount_req` double DEFAULT '0',
  `tran_amount_rsp` double DEFAULT '0',
  `settle_amount_impact` double DEFAULT '0',
  `tran_cash_req` double DEFAULT '0',
  `tran_cash_rsp` double DEFAULT '0',
  `tran_currency_code` varchar(3) DEFAULT '',
  `settle_cash_rsp` double DEFAULT '0',
  `settle_currency_code` varchar(3) DEFAULT '',
  `tran_reversed` varchar(1) DEFAULT '',
  `prev_tran_approved` double DEFAULT '0',
  `source_node_name` varchar(30) DEFAULT '',
  `pan` varchar(19) DEFAULT '',
  `card_seq_nr` varchar(3) DEFAULT '',
  `expiry_date` varchar(4) DEFAULT '',
  `terminal_id` varchar(8) DEFAULT '',
  `terminal_owner` varchar(25) DEFAULT '',
  `merchant_type` varchar(4) DEFAULT '',
  `card_acceptor_name_loc` varchar(40) DEFAULT '',
  `totals_group` varchar(12) DEFAULT '',
  `card_product` varchar(20) DEFAULT '',
  `region` varchar(3) DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1

我运行以下插入语句,但

失败

“Msg 8115,Level 16,State 2,Line 2 将表达式转换为数据类型int的算术溢出错误。 声明已经终止。“

INSERT INTO postilion_data_tst (issuer,  
post_tran_id, 
post_tran_cust_id, 
settle_entity_id,
batch_nr, 
settle_cash_req, 
settle_amount_rsp, 
settle_amount_req, 
sink_node_name, 
tran_postilion_originated, 
.
.
.

SELECT 
'Ecobank',
**2220920095,** 
dbo.post_tran_tab.post_tran_cust_id,
dbo.post_tran_tab.settle_entity_id,
dbo.post_tran_tab.batch_nr, 
dbo.post_tran_tab.settle_cash_req, 
dbo.post_tran_tab.settle_amount_rsp, 
...

当我通过字符减少插入有问题列的值时脚本成功。请注意我之前已将问题列的宽度从8增加到12。

** PREVIOUS - ** post_tran_id bigint(8)DEFAULT'0',**** ** CURRENT - ** post_tran_id bigint(12)DEFAULT'0',****

INSERT INTO postilion_data_tst (issuer,  
post_tran_id, 
post_tran_cust_id, 
settle_entity_id,
batch_nr, 
settle_cash_req, 
settle_amount_rsp, 
settle_amount_req, 
sink_node_name, 
tran_postilion_originated, 
.
.
.

SELECT 
'Ecobank',
**222092009,** 
dbo.post_tran_tab.post_tran_cust_id,
dbo.post_tran_tab.settle_entity_id,
dbo.post_tran_tab.batch_nr, 
dbo.post_tran_tab.settle_cash_req, 
dbo.post_tran_tab.settle_amount_rsp, 
...

可能是什么问题?我的想法是BIGINT(12)足以包含10个字符。

2 个答案:

答案 0 :(得分:0)

Bigint(8)和bigint(12)的数据类型完全相同。字段定义的长度部分不会影响任何整数数据类型的下限和上限。如果字段的填充属性设置为零,则length参数仅启动。在这种情况下,如果值没有足够的数字,MySQL将显示前导零。

integer data types上的MySQL文档指出了bigint字段的下限和上限:-9223372036854775808和9223372036854775807。

您需要确定您的数据是否超出这些限制。

请注意,错误消息提到转换为int,而不是bigint。样本中的数字适合bigint,但不适合int字段。

ADDITION

配置myodbc连接器时,您可能已经检查了将bigint转换为int的no bigint option,这可以解释该行为。

答案 1 :(得分:0)

将该特定字段的数据类型更改为VARCHAR(15)。在我的情况下,解决方法不会对应用程序造成影响,但可能并不适合所有情况。