Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一个字符给出错误:“quot;数据对于“列”太长;在MySQL中使用PDO时-为什么?_Php_Mysql_Pdo_Innodb_Varchar - Fatal编程技术网

Php 一个字符给出错误:“quot;数据对于“列”太长;在MySQL中使用PDO时-为什么?

Php 一个字符给出错误:“quot;数据对于“列”太长;在MySQL中使用PDO时-为什么?,php,mysql,pdo,innodb,varchar,Php,Mysql,Pdo,Innodb,Varchar,我使用PHP提取CSV文件,对数据进行处理,然后使用PDO将其导入MySQL InnoDB表 该表和所有varchar列都有一个utf8\u unicode\u ci排序规则,并且是utf8 我有一列是varchar(1) 当我尝试使用PDO进行某个查询时,我得到的SQLSTATE 22001数据对于第1行的“HeatingOption”列来说太长了 查询如下: INSERT INTO `Config`.`BaseItemCodes` (`BaseItemCode`, `Series`, `H

我使用PHP提取CSV文件,对数据进行处理,然后使用PDO将其导入MySQL InnoDB表

该表和所有varchar列都有一个
utf8\u unicode\u ci
排序规则,并且是utf8

我有一列是
varchar(1)

当我尝试使用PDO进行某个查询时,我得到的
SQLSTATE 22001数据对于第1行的“HeatingOption”列来说太长了

查询如下:

INSERT INTO `Config`.`BaseItemCodes` 
(`BaseItemCode`, `Series`, `HeatingOption`, `StandardColor`) 
VALUES ('BD1896-1W', 'BD18', 'w', 'BG')
这对我来说很有趣,因为我正在调试,并让PDO将查询打印到CLI。我将查询复制/粘贴到MySQL Workbench中,没有进行任何修改,并且执行得很好

目前,我正在从
BaseItemCode
的末尾提取值来创建该值。我正在使用
substr()
trim()
ing它,以及
strtolower()
ing它,只是为了确保一切

PHP脚本是utf8,没有BOM,CSV文件也是

我在Windows8.1上使用PHP5.5.7,在CentOS服务器上运行MySQL 5.6.15

我认为这是一个奇怪的字符集问题,但我不确定下一步该看什么


编辑:我只是尝试将列更改为“char(1)”,但没有任何帮助


编辑2:我将列的长度增加到varchar(20),并且能够插入数据

我将我的问题改为“为什么MySQL和PDO会这样做?”


编辑:


在插入行并增加列的长度之后,我仔细检查了数据,看起来绑定的名称
:HeatingOption
正在传递。因此,PDO由于某种原因没有绑定数据,这有待发现。

错误清楚地表明了这一点

您应该转到数据库,将该列的长度
HeatingOption
更改为大于1,例如varchar(25)

编辑:

它应该与
VARCHAR(1)
CHAR(1)
一起使用,但是您可以在该字母中插入空格

example 'w '
           ^---//this spaces will be counted as bite, and it will be too long

错误说明了一切。只要增加它的长度值。当有疑问时
VARCHAR(255)
;-)那没有任何意义。我真的做到了,而且成功了——但为什么呢?我只插入一个字符。这不令人满意。我提到我正在修剪该值,并在将其插入查询之前检查了该值的长度,该值的长度为1:(这真让我困惑。@Zaemz试试最后一个长度对你有效,它是2还是3?天哪-我很抱歉,我觉得很傻。在我增加了列的长度后,我回去检查数据,看看是否有什么奇怪的地方-事实上!PDO没有绑定某些值,所以我的
:HeatingOption
绑定s将作为名称本身插入。谢谢,谢谢。