복붙노트

[RUBY-ON-RAILS] 어떻게 MySQL과 포스트 그레스 모두 소문자를 구분하지 쿼리를 작성합니까?

RUBY-ON-RAILS

어떻게 MySQL과 포스트 그레스 모두 소문자를 구분하지 쿼리를 작성합니까?

나는 개발을위한 로컬 MySQL 데이터베이스를 실행하지만, 포스트 그레스를 사용 Heroku가에 배포하고있다. Heroku가 거의 모든 것을 처리하지만, 내 경우를 구분처럼 문은 대소 문자를 구분된다. 나는 아이 라이크 문을 사용할 수 있지만 내 로컬 MySQL 데이터베이스는 처리 할 수 ​​없습니다.

MySQL과 포스트 그레스 모두와 호환되는 대소 문자를 구분하지 쿼리를 작성하는 가장 좋은 방법은 무엇입니까? 아니면 내가 내 응용 프로그램이 말하고있는 DB에 따라 별도의 추천하고 아이 라이크 문을 작성해야합니까?

해결법

  1. ==============================

    1.

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

    당신이 발신자에 대문자로 매개 변수를 설정하면 두 번째 함수 호출을 피할 수 있습니다.

  2. ==============================

    2.이 이야기의 교훈은 다음과 같습니다 음주 개발 및 생산에 대해 서로 다른 소프트웨어 스택을 사용하지 마십시오. 못.

    이 이야기의 교훈은 다음과 같습니다 음주 개발 및 생산에 대해 서로 다른 소프트웨어 스택을 사용하지 마십시오. 못.

    당신은 당신이 디바이스에서 재생할 수없는 버그가 될 겁니다; 당신의 테스트는 쓸모없는 것입니다. 그냥하지 않습니다.

    다른 데이터베이스 엔진을 사용하여 질문을 밖으로 - 그것은 또한 단지 LIKE (다르게 동작 훨씬 더 많은 경우가있을 것입니다, 그렇지 않다면, 당신이 할 수있는 당신이 데이터베이스에서 사용되는 데이터 정렬을 확인해야 그들이 모든 경우에 동일? ) 같은 작업 VARCHAR 컬럼에 ORDER BY를 잊지

  3. ==============================

    3.사용 Arel :

    사용 Arel :

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

    경기는 다른 모든 것들에 대한 ILIKE의 포스트 그레스에 대한 연산자와 LIKE를 사용합니다.

  4. ==============================

    4.포스트 그레스에서는이 작업을 수행 할 수 있습니다 :

    포스트 그레스에서는이 작업을 수행 할 수 있습니다 :

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

    나는 확실히 MySQL 용 등가가 있는지 모르겠지만 당신은 항상 조금 못생긴하지만 MySQL과 포스트 그레스 모두에서 작동해야하는이 작업을 수행 할 수 있습니다

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

    5.매우 만족 어느 것도 여러 가지 답이있다.

    매우 만족 어느 것도 여러 가지 답이있다.

  6. ==============================

    6.정규 표현식 (않는 BINARY 함께 사용됨)의 경우를 구분하고,과 같이 사용할 수있다 ..

    정규 표현식 (않는 BINARY 함께 사용됨)의 경우를 구분하고,과 같이 사용할 수있다 ..

        SELECT id FROM person WHERE name REGEXP 'john';
    

    ... '존', '존'스타일 '존'등

  7. ==============================

    7.당신은 PostgreSQL을 8.4을 사용하는 경우 당신은 대소 문자를 구분 텍스트 필드를 만들 수 citext 모듈을 사용할 수 있습니다.

    당신은 PostgreSQL을 8.4을 사용하는 경우 당신은 대소 문자를 구분 텍스트 필드를 만들 수 citext 모듈을 사용할 수 있습니다.

  8. ==============================

    8.COLLATE를 사용합니다.

    COLLATE를 사용합니다.

    http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

  9. ==============================

    9.당신은 또한 당신을 위해 LIKE / ILIKE 스위치를 수행하는 searchlogic 플러그인을, 체크 아웃하는 것이 좋습니다.

    당신은 또한 당신을 위해 LIKE / ILIKE 스위치를 수행하는 searchlogic 플러그인을, 체크 아웃하는 것이 좋습니다.

  10. ==============================

    10.당신이 블록 내에서 문자열을 일치하려는 경우에도 포스트 그레스에서 * ~ 사용할 수 있습니다. ~ ~ * 대소 문자 구분 문자열, 대소 문자를 구분 문자열과 일치합니다. 그 느린 동작은,하지만 난 검색을위한 유용 찾을 수 있습니다.

    당신이 블록 내에서 문자열을 일치하려는 경우에도 포스트 그레스에서 * ~ 사용할 수 있습니다. ~ ~ * 대소 문자 구분 문자열, 대소 문자를 구분 문자열과 일치합니다. 그 느린 동작은,하지만 난 검색을위한 유용 찾을 수 있습니다.

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

    둘은 "여기에 일부 고르지 텍스트"에 명중 것 만 전자는 "여기있는 일부 고르지 TEXT"에 명중 것

  11. ==============================

    11.이 3 가장 많이 사용되는 레일 데이터베이스 백엔드 호환 구문을 커버로 상위로 변환하는 것이 가장 좋습니다. PostgreSQL는, MySQL과 SQLite는이 모든 구문을 지원합니다. 그것은 당신이 그것을 비트 이보다 만들기, 응용 프로그램에서 또는 조건 문자열에서 검색 문자열을 대문자로 가지고있는 (작은) 단점이있다,하지만 난 호환성이 이득이 worthwile하게 생각합니다.

    이 3 가장 많이 사용되는 레일 데이터베이스 백엔드 호환 구문을 커버로 상위로 변환하는 것이 가장 좋습니다. PostgreSQL는, MySQL과 SQLite는이 모든 구문을 지원합니다. 그것은 당신이 그것을 비트 이보다 만들기, 응용 프로그램에서 또는 조건 문자열에서 검색 문자열을 대문자로 가지고있는 (작은) 단점이있다,하지만 난 호환성이 이득이 worthwile하게 생각합니다.

    MySQL과 sqlite3를 모두 소문자를 구분하지 않는 LIKE 연산자가 있습니다. 전용 PostgreSQL는 대소 문자를 구분 LIKE 연산자 및 대소 문자 구별 검색에 ILIKE 연산자 (수동 당) PostgreSQL과 관련이있다. 당신은 레일 응용 프로그램에 대한 당신의 조건에 LIKE의 ILIKE의 INSEAD을 지정하지만 응용 프로그램의 MySQL 또는 SQLite는 아래 작업을 중단 할 것을 알고 수 있습니다.

    세 번째 옵션은 사용중인 데이터베이스 엔진 확인하고 그에 따라 검색 문자열을 수정할 수 있습니다. 이것은 더 나은로 / 액티브의 연결 어댑터를 monkeypatching과 PostgreSQL의 어댑터가 "ILIKE"이전에 쿼리 실행을위한 대체 "LIKE"에 쿼리 문자열을 수정할 수있는 해킹에 의해 수행 될 수 있습니다. 이 솔루션은 그러나입니다 가장 뒤얽힌 두 용어를 uppercasing 같은 쉬운 방법에 비추어, 나는 (당신이이 방법을 수행하기위한 브라우니 점을 충분히 얻을 것이라고하지만)이 노력을 worh되지 않는다 생각합니다.

  12. from https://stackoverflow.com/questions/203399/how-do-you-write-a-case-insensitive-query-for-both-mysql-and-postgres by cc-by-sa and MIT license