gpt4 book ai didi

php - 无法将整数数据插入MySQL,它插入为0

转载 作者:行者123 更新时间:2023-11-29 15:22:47 27 4
gpt4 key购买 nike

概述:

我的网站上有一个模块,允许用户导入 .txt 文件(数据用分号分隔并用换行符转义),然后我抓取该文件并执行 LOAD DATA LOCAL INFILE ,以插入数据库。该脚本有效,但未达到预期效果。可能的兴趣点:

  • 文本文件编码为 UTF-16LE
  • 数据库/表默认字符集为utf8,InnoDB引擎。

问题:

只有当数据库上的所有列都设置为 VARCHAR 时,脚本才会插入正确的数据。如果我尝试将包含数字的内容更改为 INT,脚本会在数据应在的位置插入 0(零)。

调试尝试:

已尝试在脚本中插入随机硬编码数据,它确实有效。这让我相信问题出在文件编码上。

我尝试过操纵文本文件的编码,但这似乎没有帮助。

还尝试将文件转换为 .csv、.xlsx(使用 PhpSpreadsheet 的不同脚本),但产生相同的结果。

代码:

PHP:

$servername = "localhost";
$username = "user";
$password = "pass";
$dbname = "databse";
$file = str_replace("\\", "\\\\", $_FILES["polizas"]["tmp_name"]);
if (is_uploaded_file($_FILES["polizas"]["tmp_name"])) {
try {
$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password, array(PDO::MYSQL_ATTR_LOCAL_INFILE => true));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$status = $pdo->exec(
"LOAD DATA LOCAL INFILE '" . $file . "'
IGNORE
INTO TABLE `polizas`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(`seccion`, `propuesta`, `poliza`, `endoso`, `tipo_endoso`, `desc_tipo_endoso`, `pol_que_renueva`, `iva_cond`, `tipo_doc`, `nro_doc`, `apellido`, `domicilio`, `cod_postal`, `telefono`, `localidad`, `provincia`, `fecha_emision`, `fecha_inicio`, `fecha_vcto`, `canal_pago`, `desc_canal_pago`, `origen`, `productor`, `organizador`, `moneda`, `item`, `marca`, `modelo`, `cero_Km`, `motor`, `chasis`, `patente`, `tipo_carroceria`, `desc_tipo_carroceria`, `cobertura`, `desc_cobertura`, `cod_acc1`, `desc_acc1`, `valor_acc1`, `cod_acc2`, `desc_acc2`, `valor_acc2`, `cod_acc3`, `desc_acc3`, `valor_acc3`, `cod_acc4`, `desc_acc4`, `valor_acc4`, `suma_aseg`, `prima`, `recarg`, `der_emision`, `sellos`, `imp_tasas`, `otros`, `bonif`, `iva`, `adminis_financ`, `premio`, `cant_cuotas`, `ajuste`, `tipo_vehiculo`, `desc_tipo_vehiculo`, `codigo_uso`, `descripcion_uso`, `ano_fab`, `nro_prestamo`, `vcto_cuota1`, `vcto_prestamo`, `tipo_prestamo`, `tipo_operacion`, `seccion_pol_paquete`, `poliza_pol_paquete`)"
);
} catch (PDOException $e) {
echo $e->getMessage();
}
}

文本文件示例:

seccion;propuesta;poliza;endoso;tipo endoso;desc tipo endoso;pol que renueva;iva;tipo doc;nro doc;apellido;domicilio;cod postal;telefono;localidad;provincia;fecha emision;fecha inicio;fecha vcto;canal pago;desc canal pago;origen;productor;organizador;moneda;item;marca;modelo;cero Km;motor;chasis;patente;tipo carroceria;desc tipo carroceria;cobertura;desc cobertura;cod acc1;desc acc1;valor acc1;cod acc2;desc acc2;valor acc2;cod acc3;desc acc3;valor acc3;cod acc4;desc acc4;valor acc4;suma aseg;prima;recarg;der emision;sellos;imp tasas;otrod;bonif;iva;adminis financ;premio;cant cuotas;ajuste;tipo vehiculo;desc tipo vehiculo;codigo uso;descripcion uso;año fab;nro prestamo;vcto cuota1;vcto prestamo;tipo prestamo;tipo operacion;seccion pol.paquete; poliza pol.paquete; 
4;0;894606;707641;65;Anul a Prorrata;0000000;IN;DNI;25035153;BLANCO ALEJANDRO DANIEL;B JARDIN MZA F CASA 9;05570;;SAN MARTIN;13;01/11/2018;27/09/2018;03/11/2018;08;Cobranza Normal;DC;0052000001;00520;0;;;;;;;;;;;;;;;;;;;;;;;;-0,00;-1082,25;-0,00;-0,00;-0,00;-25,40;-17,32;-0,00;-242,42;-72,12;-1439,51;1;;0;NO DEFINIDO;0;NO DEFINIDO;0000;;;;;2;;;
4;2874759;945239;3;29;Refacturacion;0000000;CF;DNI;35210070;GENEM KEVIN DANILO;UNION 00;05596;263154279978;SANTA ROSA;13;01/11/2018;01/11/2018;01/12/2018;04;SO-Sobre;WEB;0012900077;00129;0;1;12340;CHEVROLET CORSA 1.4 4 P GL L/09 (CLASSIC);N;T85032983;8AGSB19Y0AR169362;IRW910;1;SEDAN;C2;R.C. C/LTE. PERD.TOTAL X ACC. Y TOT.Y PARC X INC Y/O ROBO O HURTO;0;;0,00;0;;0,00;0;;0,00;0;;0,00;134000,00;524,11;0,00;0,00;8,33;12,22;0,00;0,00;116,65;31,36;692,67;1;20,00;1;AUTOMOVIL;101;AUTOS Y JEEPS NACIONALES O ASIMILAD;2010;;;;;1;;;
4;0;1001592;0;1;Poliza Nueva;0000000;CF;DNI;23649998;SILVA FELIX ALBERTO;CALLE LOS CHARABONES SN MONTEC;05570;263154320848;GENERAL SAN MAR;13;01/11/2018;01/11/2018;01/12/2018;08;Cobranza Normal;DC;0012900094;00129;0;1;17148;FIAT UNO S 1.4 3 PTAS (PREMIO);N;159A20388401620;8AP146000V841944;BQF655;1;SEDAN;A0;RESPONSABILIDAD CIVIL SOLAMENTE;0;;0,00;0;;0,00;0;;0,00;0;;0,00;0,00;365,94;0,00;0,00;5,78;8,48;0,00;0,00;80,98;19,66;480,84;1;0,00;1;AUTOMOVIL;204;AUTOS Y JEEPS NACIONALES GRUPO "B";1997;;;;;1;;;
4;2700189;904933;5;29;Refacturacion;0000000;CF;DNI;16330735;BOER CARLOS EDGARDO;SOLER 116;05570;;SAN MARTIN;13;01/11/2018;01/11/2018;01/12/2018;07;PF-Pago Facil;WEB;0012900005;00129;0;1;36167;RENAULT R 19 RE 4 PTAS AA;N;AB32015;841L53;BSB411;1;SEDAN;A0;RESPONSABILIDAD CIVIL SOLAMENTE;0;;0,00;0;;0,00;0;;0,00;0;;0,00;0,00;357,59;0,00;0,00;5,65;8,28;0,00;0,00;79,07;18,91;469,50;1;0,00;1;AUTOMOVIL;101;AUTOS Y JEEPS NACIONALES O ASIMILAD;1998;;;;;1;;;
4;0;1001622;0;1;Poliza Nueva;0000000;CF;DNI;33438471;MARRELLO DANIEL ALEXANDER;BOLIVIA 864 V*DEL CARMEN;05400;;SAN JUAN;18;01/11/2018;01/11/2018;01/05/2019;08;Cobranza Normal;DC;0065600001;00656;0;1;36327;RENAULT MEGANE F/2 RT 5 P.;N;AC39650;8A1BA0N25XL000059;COJ834;1;SEDAN;A0;RESPONSABILIDAD CIVIL SOLAMENTE;0;;0,00;0;;0,00;0;;0,00;0;;0,00;0,00;2176,88;0,00;0,00;70,00;50,46;0,00;0,00;481,63;116,60;2895,57;6;0,00;1;AUTOMOVIL;101;AUTOS Y JEEPS NACIONALES O ASIMILAD;1999;;;;;1;;;
4;0;1001702;0;2;Renovacion;0888568;CF;DNI;16076990;CHUMACERO ROBERTO;B LIBERTAD MF C6;05509;;UGARTECHE;13;01/11/2018;07/11/2018;07/12/2018;08;Cobranza Normal;DC;0045700007;00457;0;1;75055;MERCEDES BENZ C L 1620-45 M96;N;377983I04II688;9BM695016WB188117;DCQ882;35;*;A0;RESPONSABILIDAD CIVIL SOLAMENTE;0;;0,00;0;;0,00;0;;0,00;0;;0,00;0,00;614,99;0,00;0,00;9,80;14,37;0,00;0,00;137,14;38,08;814,38;1;0,00;6;CAMION;6132;CAMIONES HASTA 10 TON LIMITE REGION;1999;;;;;1;;;
4;3029886;985020;1;29;Refacturacion;0000000;CF;DNI;8456054;ROMERO VICTOR RAMON;BARRIO AMIGORENA SECTOR UNO 11;05539;2614470347;LAS HERAS;13;01/11/2018;01/11/2018;01/12/2018;;;WEB;0045700001;00457;0;1;12053;CHEVROLET CORSA 1.6 3 P GL AA DH (CLASSIC);N;B16NE31045708;9BGSE08NVTC606100;BBM021;1;SEDAN;B0;RESP.CIVIL ROBO,HURTO E INCENDIO TOTAL-DAÑO TOTAL POR ACCIDENTE;25;EQUIPO DE GNC ;6000,00;0;;0,00;0;;0,00;0;;0,00;120450,00;444,65;0,00;0,00;7,05;10,34;0,00;0,00;98,73;25,48;586,25;1;20,00;1;AUTOMOVIL;101;AUTOS Y JEEPS NACIONALES O ASIMILAD;1997;;;;;1;;;
4;2797244;926680;4;29;Refacturacion;0000000;CF;DNI;6717389;LLANOS JOSE ESTEBAN;HILARIO CUADROS S/N;05533;;LAVALLE;13;01/11/2018;01/11/2018;01/12/2018;07;PF-Pago Facil;WEB;0012900026;00129;0;1;18139;FORD F-100 LUJO D;N;DNLB42173;KA13MY37569;WXY691;6;ABIERTA;A0;RESPONSABILIDAD CIVIL SOLAMENTE;0;;0,00;0;;0,00;0;;0,00;0;;0,00;0,00;355,78;0,00;0,00;5,62;8,24;0,00;0,00;78,68;18,91;467,23;1;0,00;4;PICK UP;1317;PICK UP FAMILIAR;1972;;;;;1;;;

MySQL 表:

CREATE TABLE `polizas` (
`id` int(11) NOT NULL,
`user` varchar(30) NOT NULL,
`fecha_carga` varchar(11) NOT NULL,
`seccion` varchar(3) DEFAULT NULL,
`propuesta` varchar(11) DEFAULT NULL,
`poliza` varchar(30) DEFAULT NULL,
`endoso` varchar(30) DEFAULT NULL,
`tipo_endoso` varchar(3) DEFAULT NULL,
`desc_tipo_endoso` varchar(30) DEFAULT NULL,
`pol_que_renueva` varchar(30) DEFAULT NULL,
`iva_cond` varchar(30) DEFAULT NULL,
`tipo_doc` varchar(30) DEFAULT NULL,
`nro_doc` varchar(30) DEFAULT NULL,
`apellido` varchar(30) DEFAULT NULL,
`domicilio` varchar(30) DEFAULT NULL,
`cod_postal` varchar(30) DEFAULT NULL,
`telefono` varchar(30) DEFAULT NULL,
`localidad` varchar(30) DEFAULT NULL,
`provincia` varchar(30) DEFAULT NULL,
`fecha_emision` varchar(30) DEFAULT NULL,
`fecha_inicio` varchar(30) DEFAULT NULL,
`fecha_vcto` varchar(30) DEFAULT NULL,
`canal_pago` varchar(30) DEFAULT NULL,
`desc_canal_pago` varchar(30) DEFAULT NULL,
`origen` varchar(30) DEFAULT NULL,
`productor` varchar(30) DEFAULT NULL,
`organizador` varchar(30) DEFAULT NULL,
`moneda` varchar(30) DEFAULT NULL,
`item` varchar(30) DEFAULT NULL,
`marca` varchar(30) DEFAULT NULL,
`modelo` varchar(30) DEFAULT NULL,
`cero_Km` varchar(30) DEFAULT NULL,
`motor` varchar(30) DEFAULT NULL,
`chasis` varchar(30) DEFAULT NULL,
`patente` varchar(30) DEFAULT NULL,
`tipo_carroceria` varchar(30) DEFAULT NULL,
`desc_tipo_carroceria` varchar(30) DEFAULT NULL,
`cobertura` varchar(30) DEFAULT NULL,
`desc_cobertura` varchar(30) DEFAULT NULL,
`cod_acc1` varchar(30) DEFAULT NULL,
`desc_acc1` varchar(30) DEFAULT NULL,
`valor_acc1` varchar(30) DEFAULT NULL,
`cod_acc2` varchar(30) DEFAULT NULL,
`desc_acc2` varchar(30) DEFAULT NULL,
`valor_acc2` varchar(30) DEFAULT NULL,
`cod_acc3` varchar(30) DEFAULT NULL,
`desc_acc3` varchar(30) DEFAULT NULL,
`valor_acc3` varchar(30) DEFAULT NULL,
`cod_acc4` varchar(30) DEFAULT NULL,
`desc_acc4` varchar(30) DEFAULT NULL,
`valor_acc4` varchar(30) DEFAULT NULL,
`suma_aseg` varchar(30) DEFAULT NULL,
`prima` varchar(20) DEFAULT NULL,
`recarg` varchar(30) DEFAULT NULL,
`der_emision` varchar(30) DEFAULT NULL,
`sellos` varchar(30) DEFAULT NULL,
`imp_tasas` varchar(30) DEFAULT NULL,
`otros` varchar(30) DEFAULT NULL,
`bonif` varchar(30) DEFAULT NULL,
`iva` varchar(30) DEFAULT NULL,
`adminis_financ` varchar(30) DEFAULT NULL,
`premio` varchar(30) DEFAULT NULL,
`cant_cuotas` varchar(30) DEFAULT NULL,
`ajuste` varchar(30) DEFAULT NULL,
`tipo_vehiculo` varchar(30) DEFAULT NULL,
`desc_tipo_vehiculo` varchar(30) DEFAULT NULL,
`codigo_uso` varchar(30) DEFAULT NULL,
`descripcion_uso` varchar(30) DEFAULT NULL,
`ano_fab` varchar(30) DEFAULT NULL,
`nro_prestamo` varchar(30) DEFAULT NULL,
`vcto_cuota1` varchar(30) DEFAULT NULL,
`vcto_prestamo` varchar(30) DEFAULT NULL,
`tipo_prestamo` varchar(30) DEFAULT NULL,
`tipo_operacion` varchar(30) DEFAULT NULL,
`seccion_pol_paquete` varchar(30) DEFAULT NULL,
`poliza_pol_paquete` varchar(30) DEFAULT NULL,
`fecha_pago` varchar(20) DEFAULT NULL,
`cobrada` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `polizas`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `poliza` (`poliza`,`endoso`);


ALTER TABLE `polizas`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

注意:我正在使用其他脚本插入日期并修改表上的tinyInt列,据我所知,这些与问题无关,可能可以忽略。

此外,我知道大多数列的长度都非常通用,而且列的数量也不必要地大。一旦这个问题解决,我将立即处理第一点,至于第二点,客户已要求表格与现在完全相同。我将了解在不影响所请求的结构的情况下优化它的方法,但如果您有任何建议,请随时分享!

编辑:这就是我切换数据编码的方法,它没有改变结果。

$fn = fopen($_FILES["polizas"]["tmp_name"], "r");
$result = fgets($fn);
$encoded = mb_convert_encoding($result, 'UTF-8', 'UTF-16LE');

最佳答案

当您省略 ENCLOSED BY '"' 时,所有字段都会被括起来并被视为字符串。您必须有由 ""括起来的字段,而其他字段则不然,并且您必须指定:OPTIONALLY ENCLOSED BY '"' 因为否则所有内容都被视为封闭的

$status = $pdo->exec(
"LOAD DATA LOCAL INFILE '" . $file . "'
IGNORE
INTO TABLE `polizas`
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(`seccion`, `propuesta`, `poliza`, `endoso`, `tipo_endoso`, `desc_tipo_endoso`, `pol_que_renueva`, `iva_cond`, `tipo_doc`, `nro_doc`, `apellido`, `domicilio`, `cod_postal`, `telefono`, `localidad`, `provincia`, `fecha_emision`, `fecha_inicio`, `fecha_vcto`, `canal_pago`, `desc_canal_pago`, `origen`, `productor`, `organizador`, `moneda`, `item`, `marca`, `modelo`, `cero_Km`, `motor`, `chasis`, `patente`, `tipo_carroceria`, `desc_tipo_carroceria`, `cobertura`, `desc_cobertura`, `cod_acc1`, `desc_acc1`, `valor_acc1`, `cod_acc2`, `desc_acc2`, `valor_acc2`, `cod_acc3`, `desc_acc3`, `valor_acc3`, `cod_acc4`, `desc_acc4`, `valor_acc4`, `suma_aseg`, `prima`, `recarg`, `der_emision`, `sellos`, `imp_tasas`, `otros`, `bonif`, `iva`, `adminis_financ`, `premio`, `cant_cuotas`, `ajuste`, `tipo_vehiculo`, `desc_tipo_vehiculo`, `codigo_uso`, `descripcion_uso`, `ano_fab`, `nro_prestamo`, `vcto_cuota1`, `vcto_prestamo`, `tipo_prestamo`, `tipo_operacion`, `seccion_pol_paquete`, `poliza_pol_paquete`)"
);

然后你的数据必须像这样(字段用“括起来”)

4;0;894606;707641;65;"Anul a Prorrata";0000000;"IN";"DNI";25035153;"BLANCO ALEJANDRO DANIEL";"B JARDIN MZA F CASA 9"; ..... etc

因为user称我为“红鲱鱼”,我想这意味着我不对,我会给你一个 link您可以在其中读到他们还带来了一个示例阅读,他们有一个整数列,他们说

if you omit the word OPTIONALLY, all fields are enclosed by the ENCLOSED BY character.

然后他们给出表格:

CREATE TABLE jokes
(a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
joke TEXT NOT NULL);
LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes
FIELDS TERMINATED BY ''
LINES TERMINATED BY '\n%%\n' (joke);

他们说:

If you specify OPTIONALLY, the ENCLOSED BY character is used only to enclose values from columns that have a string data type (such as CHAR, BINARY, TEXT, or ENUM):

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20

我不是鱼! ;-)

关于php - 无法将整数数据插入MySQL,它插入为0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59278572/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com