2013-04-18 8 views
3

나는 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$$ 

건배, 막심

답변

1

imageHash longtext COLLATE utf8_unicode_ci, RDBM이 해시 데이터가 libpuzzle 바이너리 출력 인 경우 분명히 일치하지 않는 데이터를 charset에 매핑하려고하기 때문에 사용하지 않아야합니다.

imageHash 열이 BLOB이되도록 스키마를 변경하십시오. 마찬가지로

여기서 언급 : http://dev.mysql.com/doc/refman/5.0/en/blob.html

BLOB 값은 이진 스트링 (바이트 스트링)로 취급된다. 문자가 이고 문자 집합이이고 정렬 및 비교는 열 값의 바이트 숫자 값을 기반으로합니다.

TEXT 값은 이진수가 아닌 문자열 (문자열)으로 처리됩니다. 문자 집합 의 문자 집합은이고 값은 문자 집합의 정렬을 기반으로 정렬되고 비교됩니다.

+0

만약 내가 이 열에 다른 문자열을 저장해야합니까? 예를 들어 현재 libpuzzle을 사용하여 이미지 서명을 얻고 있지만 algo를 변경하면 일반 문자열이나 정수 등을 가질 수 있습니다 ... 문제가되거나 성능 문제가 발생합니까 (BLOB 사용)? – maxwell2022

+0

제 경우에는'TEXT' 또는'LONGTEXT'가'BLOB'로 간주되어 같은 방식으로 저장됩니다 : http://dev.mysql.com/doc/refman/5.0/en/blob.html – maxwell2022

+0

시도해 보셨나요? BLOB 유형을 사용 하시겠습니까? – Florian

0

그것은 MySQL 서버는 기본적으로 클라이언트에서 UTF8을 허용하도록 구성되어 있지 않습니다 수 있습니다. 교리 연결 개체를 통해 PHP 스크립트의 시작에서

SET NAMES utf8 

실행이, 예를 들면 다음과 같은 경우에

, 당신은 다음과 같은 쿼리를 실행해야합니다.

+0

nop 다음과 같이 MySQL 설정을 업데이트했습니다. http://stackoverflow.com/questions/3513773/change-mysql-default-character-set-to-utf8-in-my-cnf – maxwell2022