2016-03-03 2 views
2

Я работаю с базой данных, в которой используются немецкие имена, то есть Fürst. Теперь я создал HTML-форму с поисковым полем. Использовано htmlentities и некоторые тесты для проверки не введены «плохие вещи», а затем html_entity_decode перед запросом. Простой запрос будет тогда выглядит следующим образом:поиск немецких символов с использованием sql с использованием условия LIKE

SELECT * FROM user_table WHERE firstname LIKE "%fü%" OR lastname LIKE "%fü%" 

Однако эта находка не только Fürst, но Furt, а также. Как я могу это исправить? База данных и таблицы находятся в utf8_unicode_ci и должны оставаться таким образом.

+0

Добавьте предложение сопоставления в сравнение, что-то вроде 'WHERE firstname collate german_ci like ...'. – jarlh

+0

Вы можете быть более конкретным? theres no 'german_ci'. когда я использую 'latin1_german2_ci', он говорит:' # 1253 - COLLATION 'latin1_german2_ci' недействителен для CHARACTER SET 'utf8''. Когда я пытаюсь использовать 'utf8_unicode_ci', я получаю тот же результат, что и в исходном сообщении – yangsunny

+0

. Я не знаю ваших имен сортировки продукта dbms. Возможно, вы должны пометить используемые вами dbms, и вы получите ответ, который вам подходит. – jarlh

ответ

1

Вот collations for each charset

SELECT * FROM user_table WHERE firstname LIKE "%fü%" COLLATE utf8mb4_german2_ci    
          OR lastname LIKE "%fü%" COLLATE utf8mb4_german2_ci 

utf8mb4_unicode_ci вероятно, будет работать, как хорошо.

+0

1. Как вы можете найти utf8_bin? 2. его не работает "# 1253 - COLLATION 'latin1_german2_ci' недействителен для CHARACTER SET 'utf8mb4'" – yangsunny

+0

@yangsunny Я думал, что вы сказали, что таблицы находятся в utf8_unicode_ci. Для utf8_unicode_ci это действительно. И эта ошибка сообщения, похоже, не относится к этот запрос.Где вы получаете latin1_german2_ci? – Mihai

+0

sry, я имею в виду, конечно "# 1253 - COLLATION 'utf8_bin' недопустим для CHARACTER SET 'utf8mb4'". и база данных находится в utf8_unicode_ci, конечно. – yangsunny

1

(Слишком долго для простого комментария.)

COLLATION имена начинаются с именем CHARACTER SET. Эта резьба упомянула utf8, utf8mb4 и latin1CHARACTER SETs. Вы должны использовать COLLATION для данного CHARACTER SET.

Первый выбрать a CHARACTER SET. utf8, utf8mb4, и latin1 все ручки немецкие. Но если вы планируете обращаться с другими языками, подумайте:

  • latin ограничен только западноевропейскими языками. Например, он не может обрабатывать греческий язык. (latin1 требуется 1 байт на символ.)
  • utf8mb4 охватывает все известные языки, с местом для большего количества. (до 4 байтов на символ) Это CHARACTER SET не было доступно до версии 5.5.3.
  • utf8 является подмножеством utf8mb4, в результате чего несколько китайских иероглифов и новый Emoji. (до 3 байтов на символ)

CHARACTER SET обеспечивает кодировку символов для символов. COLLATION говорит, как сравнивать две строки, такие как ss и ß следует рассматривать как равные.

После, набрав CHARACTER SET, выберите COLLATION. Или пусть id 'default': latin1_swedish_ci/utf8_general_ci/utf8mb4_general_ci. Эти значения по умолчанию подходят для многоязычного использования; но это спорно. ss! = ß во всех этих значениях по умолчанию.

Идет вперед, «лучшее» решение - utf8mb4 и utf8mb4_unicode_520_ci для получения общих многоязычных данных.

Если вы ориентируетесь только на немецкий, тогда вы может хотите рассмотреть ..._german2_ci.Например:

utf8_german2_ci  A=a=ª=À=Á=Á=Â=Ã=Å=à=á=á=â=ã=å=Ā=ā=Ą=ą  < ae=Ä=Æ=ä=æ < az < B 
utf8_unicode_520_ci A=a=ª=À=Á=Á=Â=Ã=Ä=Å=à=á=á=â=ã=ä=å=Ā=ā=Ą=ą < ae=Æ=æ  < az < B 
utf8_unicode_ci  A=a=ª=À=Á=Á=Â=Ã=Ä=Å=à=á=á=â=ã=ä=å=Ā=ā=Ą=ą < ae   < az < Æ=æ < B 
utf8_general_ci  A=a=À=Á=Á=Â=Ã=Ä=Å=à=á=á=â=ã=ä=å=Ā=ā=Ą=ą < Z < Æ=æ 

(. Ditto для utf8mb4_...) сортировки

Так что, если вы на самом деле все равно, как æ сравнивает, вы должны быть разборчивы обобщению. (utf8 и utf8mb4 действуют одинаково.) More collation comparisions.

ue=Ü=ü для ..._german2_ci сопоставлений, но, возможно, нет других. Другие (в основном) относятся к U=u=Ü=ü и оставляют ue для сравнения как две буквы.

+0

В выходные я придумал решение, использующее 'COLLATE latin1_german2_ci' для столбцов в таблице и' По умолчанию CHARSET = utf8 COLLATE = utf8_unicode_ci' для самой таблицы. Это решит мою проблему, но я понятия не имею, нормально ли выбирать разные сортировки для столбца и таблицы или это просто грязное и быстрое решение ... – yangsunny

+0

Моя база данных будет содержать только немецкий язык, что означает, что я должен отличать A от Ä. И мне нужно получить данные из базы данных и отобразить их в HTML. Когда я использовал latin1_german2_ci (его набор символов/сортировка, установленный ранее), мне пришлось выполнить некоторый utf8_encode/decode. Чтобы спасти меня, я думаю, что мои варианты будут utf8_german2_ci или utf8mb4_german2_ci. Большое спасибо за очень приятное и подробное объяснение о CHARACTER SET и COLLATION. – yangsunny

+0

Теперь я преобразовал все мои таблицы и столбцы в utf8_german2_ci. Как вы упомянули, в этом сопоставлении «A = a yangsunny