나는 algo를 디버깅하는 데 시간을 들였고 Doctrine (v2.3.3)에서 발생했다는 것을 알았다. libpuzzle를 사용하여 이미지 해시를 계산하고이 해시를 데이터베이스에 저장합니다. 반환 된 해쉬에는 특수 문자가 포함되어 있으며 Doctrine은이를 좋아하지 않습니다.Doctrine 2.3 - 특수 문자 때문에 텍스트 필드가 저장되지 않는다.
ÿþÿÿþþþÿþÿþÿþþþÿþÿÿÿÿþþÿþÿÿÿþÿþÿþþÿþþÿÿÿþÿþþþþÿþþþþÿÿÿÿÿþþÿþÿþÿþÿþþÿþÿÿÿþþÿþþþþÿþþþþÿÿÿ :
이
내가 가진 문자열의 종류 (~ 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
인지 확인했습니다.
나는 특수 문자를 다른 문자열을 시도했습니다!
테스트 §의 $ %의 & /() =? 오류 : D
이 문자열은 올바르게 삽입되었지만 해시는 여전히 존재하지 않습니다.
누구든지이 문제를 해결할 수있는 곳을 알고 있습니까? Doctrine 버그입니까?
----------------------------------
UPDATE
실행하기 바로 전에 올바른 데이터를 바인딩했습니다. 그래서 그것은 인코딩이나 드라이버 문제라고 생각합니다. 나는 심포니 구성을 수정 한 :
# 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
을 사용했으며이 해시를 저장하는 데 문제가 없었습니다. 버그가 인지 여부는 알 수 없습니다. (
----------------------------- -----
업데이트 2
나는 MySQL의 모든 쿼리를 기록했고 나는 내용이 제대로 바인더 제본.하지만 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$$
건배, 막심
만약 내가 이 열에 다른 문자열을 저장해야합니까? 예를 들어 현재 libpuzzle을 사용하여 이미지 서명을 얻고 있지만 algo를 변경하면 일반 문자열이나 정수 등을 가질 수 있습니다 ... 문제가되거나 성능 문제가 발생합니까 (BLOB 사용)? – maxwell2022
제 경우에는'TEXT' 또는'LONGTEXT'가'BLOB'로 간주되어 같은 방식으로 저장됩니다 : http://dev.mysql.com/doc/refman/5.0/en/blob.html – maxwell2022
시도해 보셨나요? BLOB 유형을 사용 하시겠습니까? – Florian