[SQL] MySQL의 쿼리의 정상화 악센트 문자
SQLMySQL의 쿼리의 정상화 악센트 문자
그래서 예를 들어 있음, 악센트 문자를 정상화 쿼리를 할 수 있도록하고 싶습니다 :
é, è, 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.오류의 원인은 즉 쿼리의 '르네'테이블하지만 입력의 문자 집합이 아니다. 동작은 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.나는 당신이 진짜 사용자 이름으로 추가로 테이블에 정규화 버전을 저장하는 것이 좋을 것. 즉석에서 인코딩을 변경하면 비용이, 당신은 모든 검색의 모든 행에 대해 다시 변환을 수행 할 수 있습니다.
나는 당신이 진짜 사용자 이름으로 추가로 테이블에 정규화 버전을 저장하는 것이 좋을 것. 즉석에서 인코딩을 변경하면 비용이, 당신은 모든 검색의 모든 행에 대해 다시 변환을 수행 할 수 있습니다.
당신이 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.난 당신이 여기에 소스를 얻을 수 있습니다 MySQL은 그럴 유닉스 명령 strtr의 PHP 함수를 / 구현
난 당신이 여기에 소스를 얻을 수 있습니다 MySQL은 그럴 유닉스 명령 strtr의 PHP 함수를 / 구현
당신은 사용할 수 있습니다 :
SELECT tr(name, 'áäèëî', 'aaeei') FROM persons
또는 일부 문자를 제거합니다
SELECT tr(name, 'áäèëî', null) FROM persons
-
==============================
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.영어 문자는 외국 문자로 결과를 반환 사용하여 검색을합니까? 나는 (해야한다는 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를 사용하는 경우, 그것은 동일하지 않습니다.
from https://stackoverflow.com/questions/2302813/normalizing-accented-characters-in-mysql-queries by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 같은 테이블에 업데이트 후 트리거 테이블 업데이트 (0) | 2020.06.14 |
---|---|
[SQL] 널와 SQL 정렬 순서는 마지막 값 (0) | 2020.06.14 |
[SQL] 나는 바인드 매개 변수 경우는 mysql_real_escape_string를 사용해야합니까? (0) | 2020.06.14 |
[SQL] 'AND'사이의 차이 '&&'SQL에서 (0) | 2020.06.14 |
[SQL] 어떻게 MySQL은 날짜의 평균을 만들 수 있습니까? (0) | 2020.06.14 |