쿼리 - sql like '%'



MySQL 쿼리에서 악센트 부호가있는 문자 정규화 (3)

MySQL에서 strtr PHP 함수 / tr 유닉스 명령을 구현했습니다. here 에서 소스를 얻을 수 here

당신은 다음과 같이 사용할 수 있습니다 :

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

또는 일부 문자 제거

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

악센트 부호가있는 문자를 정규화하는 쿼리를 수행 할 수 있기를 바랍니다. 예를 들면 다음과 같습니다.

é, è, and ê

'='및 'like'를 사용하는 쿼리에서 모두 'e'로 처리됩니다. 사용자 이름 필드가 ' rené '로 설정된 행이 있는데 ' rene '및 ' rené '와 모두 일치시킬 수 있기를 바랍니다 .

MySQL 5.0.8에서 'collate'절을 사용하여이 작업을 시도하고 있습니다. 다음과 같은 오류가 발생합니다.

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

Answer #1

실제 사용자 이름과 함께 테이블에 정규화 된 버전을 저장하는 것이 좋습니다. 즉석에서 인코딩을 변경하는 것은 비용이 많이들 수 있으며 모든 검색에서 모든 행에 대해 변환을 다시 수행해야합니다.

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."%'");

물론 정규화가 필요한 여러 열이있는 경우이 방법을 사용할 수 없을 수도 있지만 특정 경우에는 올바르게 작동 할 수 있습니다.


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

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

in mysql

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

생기게 하다:

Álvaro José     ?lvaro Jos?

악센트 부호가있는 단어는 악센트가없는 단어로 변환되지 않으며 iconv의 번역과 동일하지 않습니다.

RegExp는 UTF-8에서 작동하지 않습니다.

어떤 해결책도 아닙니다.





collate