我收到以下错误:
'name'列长度为255个字符,但似乎输出转义混乱了。我做错了什么?
执行'INSERT INTO部件时发生异常(deletedAt, 名称,代码,价格,in_stock)VALUES(?,?,?,?,?)'与params [空值, “\ X50 \ x6f \ X73 \ X74 \ x4e \ x4c \ X20 \ X50 \ X72 \ X69 \ x6f \ X72 \ X69 \ X74 \ X79 \ X20 \ X50 \ X61 \ X6B \ X6B \ X65 \ X74 \ X20 \ X41 \ X61 \ x6e \ X67 \ X65 \ X74 \ X65 \ X6B \ X65 \ x6e \ 64 \ X20 \ X42 \ X65 \ X6C \ X67 \ X69 \ XEB” “1101012”,“12.00”,0]:
SQLSTATE [22001]:字符串数据,右截断:1406数据太长了 第1行的列'name'500内部服务器错误 - DriverException 2 链接的例外: PDOException»PDOException»
foreach ($csv as $row) { #persist every part
$part = new Part();
$part->setCode($row[0]);
$part->setName($row[1]);
$part->setPrice(preg_replace("/[^0-9.]/","", $row[2])); # extract decimal number
$part->setInStock(($row[3])?1:0);
$em = $this->getDoctrine()->getManager();
$em->persist($part);
$count++; # get number of commits
}
$em->flush();
来自my.ini:
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
no-auto-rehash
[mysqld]
port = 3306
collation-server = utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4
skip-character-set-client-handshake
答案 0 :(得分:1)
原来有两个问题。
其中一个原因是Doctrine不尊重MySQL服务器设置的默认排序规则,甚至还有config.yml等中的无数选项。最后我看起来像这样,我真的不明白为什么。但它现在有效。
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
1002: "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'"
其次是我试图加载到数据库(csv文件)的数据源显然不在utf8中。将其保存到" utf8"解决了这个问题。现在我想知道如何让php将输入转换为所需的格式。