gpt4 book ai didi

mysql - Doctrine 2.3 - 由于特殊字符,文本字段未保存

转载 作者:可可西里 更新时间:2023-11-01 08:34:53 24 4
gpt4 key购买 nike

我花了几个小时来调试算法并注意到它来自 Doctrine (v2.3.3)。我正在使用 libpuzzle 来计算图像的哈希值并将此哈希值存储在数据库中。返回的散列中有特殊字符,显然 Doctrine 不喜欢它。

这是我拥有的那种字符串(~550 个字符):

ÿ�þÿÿþ�þþÿþÿþÿþþ�þÿþÿÿÿ�ÿþþÿþÿ�ÿÿþÿþÿþþÿþþÿÿÿþÿþþþþÿþ�þþþÿ�ÿÿ�ÿÿþ�þÿþÿþÿþÿþþÿþÿÿÿþþÿþþþþÿþþþþ���ÿÿ�ÿ�þþ�þÿÿþþþÿÿþÿþþÿþþþÿþ...

我调查过,发现有人说要在配置中添加字符集,但我已经有了:

# Doctrine Configuration
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8

如果我将列的排序规则从 utf8_unicode_ci 更改为 utf8_general_ci 仍然无法正常工作。我还确保默认模式排序规则是 utf8_general_ci

我尝试了另一个带有特殊字符的字符串:

Test !§$%&/()=? äöü ÄÖÜ :D

此字符串已正确插入,但哈希仍未正确插入。

有谁知道我可以在哪里解决这个问题?它是 Doctrine 错误吗?

--------------------------------

更新

就在执行之前,我仍然绑定(bind)了正确的数据。所以我猜这是编码或驱动程序问题。我修改了 symfony 配置:

# Doctrine Configuration
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
options:
1002: "SET NAMES 'UTF8'"

我还尝试在不使用实体的情况下执行查询以确保:

$this->db = $this->getContainer()->get('doctrine')->getConnection();

$img = '/var/www/acme/web/upload/tmp/cd1fa593cf6feb2cde83e68f461a2d947.jpg';
$hash = puzzle_fill_cvec_from_file($img);

$sql = "UPDATE image set hash=? WHERE id=?";
$stmt = $this->db->prepare($sql);

$stmt->execute(array($hash, 180));

数据库中仍然是空数据。在另一个项目中,我使用了 Zend_Db 并且在保存这个散列时没有遇到任何问题。我不知道这是否是 Doctrine 中的错误:(

--------------------------------

更新 2

我已经在 mysql 中记录了所有查询,我可以在日志中看到内容已正确绑定(bind)。但没有被 mysql 正确保存。

INSERT INTO image (guid, type, createTime, updateTime, images, imageSize, imageHash, status) 
VALUES (
'c30df23d6b0b08aff079287e00f21ec8a',
'image',
'2013-04-22 03:30:33',
'2013-04-22 03:30:34',
'path/image.jpg',
'165458',
'?\0????\0?????????\0??????\0??????\0??????????????????????\0????\0??\0???\0???????????????????????????\0\0\0??\0?\0??\0??????????????????\0\0\0??\0?\0???????????????\0?????????????????\0?\0????????????\0?\0??????????????????????????\0?\0???????????\0???\0?????????\0??????\0\0?????????????????????\0\0??????\0???????????????\0',
1)

这是我创建的表:

delimiter $$
CREATE TABLE `image` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`guid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`createTime` datetime NOT NULL,
`updateTime` datetime DEFAULT NULL,
`images` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`imageSize` bigint(20) DEFAULT NULL,
`imageHash` longtext COLLATE utf8_unicode_ci,
`status` integer(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$

干杯,马克西姆

最佳答案

你不应该使用 imageHash longtext COLLATE utf8_unicode_ci,因为 RDBM 会尝试将数据映射到字符集,如果您的哈希数据是 libpuzzle 二进制输出,这显然不匹配。

尝试更改您的架构,使您的 imageHash 列成为 BLOB

如此处所述:http://dev.mysql.com/doc/refman/5.0/en/blob.html

BLOB 值被视为二进制字符串(字节字符串)。它们没有字符集,排序和比较是基于列值中字节的数值。

TEXT 值被视为非二进制字符串(字符串)。它们有一个字符集值根据字符集的排序规则进行排序和比较

关于mysql - Doctrine 2.3 - 由于特殊字符,文本字段未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16079081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com