我有一个PHP Web应用程序开发与CakePHP 4一个MySQL.
应用程序使用的其中一个数据库是名为trg_registros_vip
的数据表,其中包含77个数据行。其中一个数据行名为trg_tipo_proyecto
,且定义为不可为Null的varchar,最大长度为100个字符。
通过使用SimpleXLSX阅读excel文件来填充该表(使用composer可获得的库shuchkin/simplexlsx)。对于文件中的每一行,从第二行开始(因为第一个单元格具有工作表的标题),从第一个单元格开始,从左到右显示每个单元格上的数据,存储在名为TRegistrosVip
的实体类中,其顺序与表中从第二列开始的每一列的定义顺序相同(因为第一列是自动增量主键)。然后将实体插入到表中。trg_tipo_proyecto
列是表中的第五列,该列的数据从excel文件的第四列获得。
但是,当我尝试从应用程序读取Excel时,我收到以下错误消息:* 错误:[PDO异常] SQLSTATE[22001]:字符串数据,右截断:1406 1406数据库中第一列的'trg_tipo_proyecto'数据太长
此错误的堆栈跟踪表明,该错误是在我试图向表中插入一行时生成的。
我在Excel文件中搜索了第四列中是否有长度大于100的单元格,但没有找到。
我搜索了与实体类关联的表类,如果列定义错误,则将其命名为TRegistrosVipTable
,然后得到以下结果:
$validator->scalar('trg_tipo_proyecto')
->maxLength('trg_tipo_proyecto', 100)
->requirePresence('trg_tipo_proyecto', 'create')
->notEmptyString('trg_tipo_proyecto');
这意味着列定义良好。
我检查了config/app.php文件,以防我使用了错误的数据库,但我使用的是正确的数据库。
此外,由于可能存在外国口音,我在Excel文件中对该列的每个值调用了utf8_decode
函数,然后才将其插入到表中。
考虑到上述情况,这个错误的原因是什么?提前感谢。
1条答案
按热度按时间cnwbcb6i1#
已解决
我在应用程序中实现了日志记录,并在调试日志文件中打印了在调用
utf8_decode
函数后的每一行的excel文件第四列中的值。当尝试插入单词“Regularización”(没有双引号,没有前导空格或趋势空格,带有重音)时,会触发该错误。我在Excel中删除了该单词的重音,错误消失了。
但是,由于客户端的限制,我无法以编程方式从Excel中删除重音符号。因此,我测试了删除对
utf8_decode
的调用,并直接插入值,而不进行任何编码或解码。该错误不再触发。感谢所有阅读并回答此问题的人。