복붙노트

[SQL] MySQL의 쿼리의 정상화 악센트 문자

SQL

MySQL의 쿼리의 정상화 악센트 문자

그래서 예를 들어 있음, 악센트 문자를 정상화 쿼리를 할 수 있도록하고 싶습니다 :

é, è, and ê

모든 '처럼' '='를 사용하여 쿼리에, 'E'로 취급된다. 나는 '르네'에 대한 사용자 이름 필드 집합 행을 가지고 있고, 나는 '르네'와 '르네'모두 그것에 일치 할 수 있도록하고 싶습니다.

나는 MySQL은 5.0.8에서 '한 부씩 인쇄'절을 사용하여이 작업을 수행하려고 시도하고있다. 나는 다음과 같은 오류가 발생합니다 :

mysql> select * from User where username = 'rené' collate utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

FWIW는, 내 테이블을 만들었습니다 :

CREATE TABLE `User` (
  `id` bigint(19) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniqueUsername` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=56790 DEFAULT CHARSET=utf8

해결법

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

    1.오류의 원인은 즉 쿼리의 '르네'테이블하지만 입력의 문자 집합이 아니다. 동작은 character_set_connection을 변수에 따라 달라집니다

    오류의 원인은 즉 쿼리의 '르네'테이블하지만 입력의 문자 집합이 아니다. 동작은 character_set_connection을 변수에 따라 달라집니다

    MySQL의 클라이언트를 사용하면, SET 이름을 사용하여 변경 :

    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET character_set_connection = charset_name;
    

    (행 http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html)

    출력 예 :

    mysql> set names latin1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from User where username = 'rené' collate utf8_general_ci;
    ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
    
    mysql> set names utf8;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from User where username = 'rené' collate utf8_general_ci;
    Empty set (0.00 sec)
    

    Altenatively, 사용은 명시 적으로 '문자 집합 도입기'를 사용하여 문자 집합을 설정할 수 있습니다 :

    mysql> set names latin1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from User where username = _utf8'rené' collate utf8_general_ci;
    Empty set (0.00 sec)
    

    이 질문은 꽤 오래지만 구글이 관련 질문을 여기 저를 주도하기 때문에, 나는 아직도 답변을받을 권리가 있지만 알고 :)

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

    2.나는 당신이 진짜 사용자 이름으로 추가로 테이블에 정규화 버전을 저장하는 것이 좋을 것. 즉석에서 인코딩을 변경하면 비용이, 당신은 모든 검색의 모든 행에 대해 다시 변환을 수행 할 수 있습니다.

    나는 당신이 진짜 사용자 이름으로 추가로 테이블에 정규화 버전을 저장하는 것이 좋을 것. 즉석에서 인코딩을 변경하면 비용이, 당신은 모든 검색의 모든 행에 대해 다시 변환을 수행 할 수 있습니다.

    당신이 PHP를 사용하는 경우, 당신은 변환을 처리 할 수의 iconv ()를 사용할 수 있습니다 :

    $username = 'rené';
    $normalized = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
    

    그럼 그냥 두 버전을 저장하고 검색 및 표시에 대한 일반 사용자 이름에 대한 정규화 된 버전을 사용하십시오. 비교 및 선택 당신은 또한 검색 문자열을 정상화 것을 제공, 정규화 된 열에서 많이 빨라집니다 :

    $search = mysql_real_escape_string(iconv('UTF-8', 'ASCII//TRANSLIT', $_GET['search']));
    mysql_query("SELECT * FROM User WHERE normalized LIKE '%".$search."%'");
    

    당신이 필요 정상화,하지만 특정 사건이 힘 작업 무사에서 여러 열이있는 경우 물론이 방법은 가능한하지 않을 수 있습니다.

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

    3.난 당신이 여기에 소스를 얻을 수 있습니다 MySQL은 그럴 유닉스 명령 strtr의 PHP 함수를 / 구현

    난 당신이 여기에 소스를 얻을 수 있습니다 MySQL은 그럴 유닉스 명령 strtr의 PHP 함수를 / 구현

    당신은 사용할 수 있습니다 :

    SELECT tr(name, 'áäèëî', 'aaeei') FROM persons
    

    또는 일부 문자를 제거합니다

    SELECT tr(name, 'áäèëî', null) FROM persons
    
  4. ==============================

    4.

    $normalized = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
    

    완벽한 PHP 솔루션입니다,하지만 MySQL은? 변하게 하다?

    MySQL의에서

    SELECT 'Álvaro José' as accented, (CONVERT ('Álvaro José' USING ascii)) as notaccented
    

    생산액:

    Álvaro José     ?lvaro Jos?
    

    악센트 단어가 더 강조된 단어로 변환되지, 그것은의 iconv의 동등한의 음역하여 아니다.

    정규식은 UTF-8 작동하지 않습니다.

    아니 모든 솔루션.

  5. ==============================

    5.영어 문자는 외국 문자로 결과를 반환 사용하여 검색을합니까? 나는 (해야한다는 MariaDB 10.2 이상 작동)의 MySQL 5.7에 정렬을 비교하는 다음 스크립트를 썼다 :

    영어 문자는 외국 문자로 결과를 반환 사용하여 검색을합니까? 나는 (해야한다는 MariaDB 10.2 이상 작동)의 MySQL 5.7에 정렬을 비교하는 다음 스크립트를 썼다 :

            $db->query('CREATE TABLE IF NOT EXISTS test (name varchar(20))
             Engine=InnoDB character set utf8mb4 collate utf8mb4_unicode_520_ci');
    
            $db->query('CREATE TABLE IF NOT EXISTS test2 (name varchar(20))
             Engine=InnoDB character set utf8mb4 collate utf8mb4_unicode_ci');
    
            $db->query("insert into test values('Łove 520')");
            $db->query("insert into test2 values('Łove 520')");
    
            $types = ['utf8mb4_unicode_520_ci', 'utf8mb4_unicode_ci'];
            $tables = ['test' => 'utf8mb4_unicode_520_ci', 'test2' => 'utf8mb4_unicode_ci'];
            foreach($types as $n)
            {
                foreach($tables as $ta => $tc)
                {
                    $db->query("SET NAMES 'utf8mb4' COLLATE '$n'");
                    $res = $db->query("Select * from $ta where name like 'Love%'"); // Ł equal
                    echo "\ntable $ta($tc), names($n): ".$res->fetchColumn(0);
                }
            }
    

    여기 결과는 :

    table test(utf8mb4_unicode_520_ci), names(utf8mb4_unicode_520_ci): Łove 520
    table test2(utf8mb4_unicode_ci), names(utf8mb4_unicode_520_ci):
    table test(utf8mb4_unicode_520_ci), names(utf8mb4_unicode_ci): Łove 520
    table test2(utf8mb4_unicode_ci), names(utf8mb4_unicode_ci):
    

    (참고 :이 나타나도록 나는, 명령 줄에서 스크립트를 실행 (520) 대신 520 사랑 ┼üove 등)

    테이블 정렬 관계없이 접속 대조, utf8mb4_unicode_520_ci가 될 때 그 L == L 나타난다. 만 utf8mb4_unicode_ci를 사용하는 경우, 그것은 동일하지 않습니다.

  6. from https://stackoverflow.com/questions/2302813/normalizing-accented-characters-in-mysql-queries by cc-by-sa and MIT license