당신은 어떻게 쓰는 대소문자를 구분하지 않에 대한 쿼리를 모두 MySQL 및 Postgres?

StackOverflow https://stackoverflow.com/questions/203399

문제

나는 실행 MySQL 데이터베이스에 로컬로 개발,배포하지만만큼의 계정을 사용하는 Postgresql.만큼의 계정을 처리하는 거의 모든 것,그러나 나 대소문자를 구분과 같은 문의가 대소문자를 구분합니다.사용할 수 있는 비문,하지만 나 지역 MySQL 데이터베이스를 처리할 수 없습니다.

는 가장 좋은 방법은 무엇입을 쓰는 대소문자를 구분하지 않는 쿼리를 모두 호환 MySQL 및 Postgres?또는 나를 쓸 필요가 별도 좋아하고 비 문에 따라서 DB 내 응용 프로그램이 말하는가?

도움이 되었습니까?

해결책

select * from foo where upper(bar) = upper(?);

는 경우 당신은 매개 변수를 설정하는 경우 상에서 호출자,피할 수 있습니다 두 번째 함수 호출합니다.

다른 팁

의 도덕적 이 이야기입니다:를 사용하지 않는 다른 소프트웨어 스택에 대한 개발 및 생산입니다.지 않습니다.

당신은 단지 끝나 버그를 재현할 수 없에 dev;귀하의 테스트 가치가 될 것입니다.다만 하지 않습니다.

를 사용하여 다양한 데이터베이스 엔진의 질문이 있을 것입니다 훨씬 더 많은 경우가 그것을 다르게 동작합니다 그냥 좋아(도 확인이션을 사용하여 데이터베이스?그들이 동일 모든 경우에 있어?지 않으면,잊을 수 있는 순서에 의해 varchar 열 일일)

사용 Arel:

Author.where(Author.arel_table[:name].matches("%foo%"))

matches 사용합니다 ILIKE 운영자를 위해 Postgres,고 LIKE 한 것입니다.

에 postgres,당신은 작업을 수행 할 수 있습니다:

SELECT whatever FROM mytable WHERE something ILIKE 'match this';

나는 확실하지 않으면 거기에 해당하는 MySQL 하지만 당신은 항상 할 수 있습니다 이것은 조금 못생긴 하지만 작동해야에서 모두 MySQL 및 postgres:

SELECT whatever FROM mytable WHERE UPPER(something) = UPPER('match this');

거기에 여러 가지 답을 하나도 없는 매우 만족입니다.

  • 낮(bar)=낮(?) 에 MySQL 및 Postgres,하지만 가능성이 높 을 수행말 MySQL:MySQL 사용하지 않기 때문에 인덱스의 더 낮은 기능입니다.에 Postgres 추가할 수 있습니다 기능성 지수(에 낮(bar) 다)하지만 MySQL 지원하지 않는다.
  • MySQL 것입니다(를 설정한 경우를 제외하고는 대소문자를 구분하는 콜레이션)할 경우-대/소문자를 구분하지 않고 일치에 자동으로 사용하고,그것의 인덱스입니다.(바=?).
  • 코드에서 외부 데이터베이스,유지 관리 bar_lower 필드 bar_lower 결과가 포함 낮(bar).(이것이 가능할 수 있을 사용하여 데이터베이스 트리거도).(참조하십시오 논의에 이 솔루션 Drupal).이것은 서투른 하지만 적어도 동일하게 실행하는 방법에 거의 모든 데이터베이스입니다.

REGEXP 는 대/소문자를 구분하지 않음(와 함께 사용하지 않는 경우 이진)및 처럼 사용할 수 있습니다,그래서...

    SELECT id FROM person WHERE name REGEXP 'john';

...일치하는'존','JOHN','john',etc.

를 사용하는 경우 PostgreSQL8.4 사용할 수 있습니다 citext 모듈을 만들 경우를 대/소문자를 구분하지 않는 텍스트 필드가 있습니다.

하는 것을 고려해야 할 수 있습니다 검사 searchlogic 플러그인,가 다음과 같/비 스위치습니다.

를 사용할 수도 있습~*에서레스하려는 경우 경기 하위 문자열 내습니다.~과 일치하는 경우 민감한 부분~*대소문자를 구분하지 않 하위 문자열.그 느리게 작업,그러나 나는 그것에 유용한 검색합니다.

Select * from table where column ~* 'UnEvEn TeXt';
Select * from table where column ~ 'Uneven text';

두 명중에"어떤 고르지 않은 텍스트" 만 전 칠 것에"어떤 고르지 않은 텍스트"

변환하여 상단 최선을 커버로 호환되는 구문에 대한 3 가장 많이 사용되는 레일 데이터베이스 backends.PostgreSQL,MySQL 및 SQLite 모든 지원을 이 구문입니다.그것은(미성년자)단점이 있는지에 대한 귀하의 문자열 검색에의 응용 프로그램 또는 당신의 조건을 문자열을 만들고,그것을 약간 더 추악,그러나 내가 생각하는 호환성을 얻은 그것이 worthwile.

모두 MySQL 및 SQLite3 가 대소문자를 구분하지 않음 연산자입니다.만 PostgreSQL 는 경우-같은 민감한 연산자와 PostgreSQL-정(per 설명서)비자에 대한 대소문자를 구분 검색합니다.을 지정할 수 있습니다 비 insead 의에서처럼 당신의 조건에 레일 응용 프로그램,하지만 알고 있는 응용 프로그램 작업을 중단에서 MySQL 또는 SQLite.

세 번째 옵션을 확인할 수 있습는 데이터베이스 엔진을 사용하고 수정하는 문자열 검색합니다.이것이 더 좋을 수도 수행하여 해킹/monkeypatching ActiveRecord 의 연결 어댑터와 PostgreSQL 어댑터 쿼리를 수정하는 문자열을 대신에"좋아요"에 대한"비"이전에는 쿼리를 실행합니다.이 솔루션은 그러나 가장 복잡하고에서 빛의 방법으로 쉽게 같은 대문자로 표시 모두어,내 생각에 이것은 worh 노력을(있지만 당신을 얻을 것이 많 브라우니에 대한 포인트 하고 그것을 이렇).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top