Php 一个字符给出错误:“quot;数据对于“列”太长;在MySQL中使用PDO时-为什么?
我使用PHP提取CSV文件,对数据进行处理,然后使用PDO将其导入MySQL InnoDB表 该表和所有varchar列都有一个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
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将作为名称本身插入。谢谢,谢谢。