我在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个字符。
答案 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)。在我的情况下,解决方法不会对应用程序造成影响,但可能并不适合所有情况。