CakePHP:“字符串数据,右截断:1406第1行列的数据太长”

pes8fvy9  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(136)

我有一个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函数,然后才将其插入到表中。
考虑到上述情况,这个错误的原因是什么?提前感谢。

cnwbcb6i

cnwbcb6i1#

已解决

我在应用程序中实现了日志记录,并在调试日志文件中打印了在调用utf8_decode函数的每一行的excel文件第四列中的值。当尝试插入单词“Regularización”(没有双引号,没有前导空格或趋势空格,带有重音)时,会触发该错误。
我在Excel中删除了该单词的重音,错误消失了。
但是,由于客户端的限制,我无法以编程方式从Excel中删除重音符号。因此,我测试了删除对utf8_decode的调用,并直接插入值,而不进行任何编码或解码。该错误不再触发。
感谢所有阅读并回答此问题的人。

相关问题