2015-01-21 5 views
4

고유 한 (해시) 값을 저장하기 위해 장고 모델에 필드가 있습니다. 데이터베이스 (MySQL/inno)가이 유형 (VARCHAR)에서 대소 문자를 구분하는 검색을 수행하지 않는다는 사실이 밝혀졌습니다. 단장에게 Django에 대소 문자를 구분하는 검색 Document.objects.get(hash__exact="abcd123")을 명시 적으로 전달한 경우가 아닙니다. 따라서 "abcd123"과 "ABcd123"이 모두 반환됩니다. 원하지 않습니다. 그것은 LONGBLOB가되는 DB에 있도록Django에서 대소 문자를 구별하지만 MySQL에서 무시됩니다.

class document(models.Model): 
    filename = models.CharField(max_length=120) 
    hash  = models.CharField(max_length=33) 

는 I는 BinaryField에 '해시 필드'을 변경할 수 있으며, 대소 문자를 구분하는 검색을 수행 (및 작동). 그러나 이것은 나에게 매우 효율적으로 보이지 않습니다. 'utf8 COLLATE'를 추가하는 것과 같이 장고에서 더 좋은 방법이 있습니까? 또는이 상황에서 올바른 Fieldtype은 무엇입니까? (예, 대신 PostgreSQL을 사용할 수 있습니다.)

답변

2

@ dan-klasson 언급 한 바와 같이, default non-binary string comparison is case insensetive by default; latin1_swedish_ci의 끝에있는 _ci에 주목하십시오. 대소 문자를 구분하지 않습니다. Dan이 언급했듯이 대/소문자를 구분하는 데이터 정렬 및 문자 집합을 사용하여 데이터베이스를 만들 수 있습니다.

언제든지 create a single table or even set only a single column to use a different collation (동일한 결과)을 알 수 있습니다. 그리고 당신은 이러한 데이터 정렬은 테이블 당 예를 들어, 생성을 게시 변경할 수 있습니다 : 당신이 아니라 데이터베이스/테이블 문자 집합/정렬을 변경하지 않을 경우

ALTER TABLE documents__document CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

는 또한, 장고 run a custom query using the raw method 할 수 있습니다. 따라서 직접 테스트하지는 않았지만 다음과 같은 것을 사용하여 변경 사항을 해결할 수 있습니다.

Document.objects.raw("SELECT * FROM documents__document LIKE '%s' COLLATE latin1_bin", ['abcd123']) 
3

MySQL의 문자 집합에 대한 기본 데이터 정렬은 latin1_swedish_ci이며 대소 문자를 구분하지 않습니다. 왜 그런지 모르겠습니다. 하지만 다음과 같이 데이터베이스를 만들어야합니다.

CREATE DATABASE database_name CHARACTER SET utf8; 
+0

지금 데이터베이스를 변경했지만 이것이 장고에서 수행되기를 바랬습니다. 그러나 이것도 작동합니다. – FeedTheWeb

+0

당신은 항상 utf8을 항상 사용해야합니다. 그렇지 않으면 문제가 생길 수 있습니다. –

0

대소 문자를 구분하는 필터 쿼리가 잘못되었습니다. 그것은이 같은 __exact,해야한다 :

Document.objects.get(hash__exact="abcd123") 

그리고 대소 문자를 구분하지 필터 쿼리에 대한

, 당신은 __iexact를 사용해야합니다.

+1

맞습니다. 그러나 오타였습니다 (나는 그것을 편집 할 것입니다). '__exact'는 데이터베이스 자체가 대소 문자를 신경 쓰지 않기 때문에 도움이되지 않습니다. – FeedTheWeb

+0

나는 그것에 대해 잘 모르겠습니다. '__exact' 대신에 다음과 같이 해보십시오 : Document.objects.get (hash = "abcd123"). – ruddra