Какое сопоставление лучше всего использовать для MySQL с PHP?

Мне интересно, есть ли «лучший» выбор для сопоставления в MySQL для обычного веб-сайта, на котором вы не уверены на 100%, что будет введено? Я понимаю, что все кодировки должны быть одинаковыми, например MySQL, Apache, HTML и все, что находится внутри PHP.

Раньше я устанавливал PHP для вывода в "UTF-8", но какому сопоставлению это соответствует в MySQL? Я думаю, что это один из UTF-8, но я раньше использовал utf8_unicode_ci, utf8_general_ci и utf8_bin.

Боковое примечание: MySQL "utf8" не является правильным UTF-8 (нет поддержки 4-х байтовых символов Unicode, таких как ?), однако "utf8mb4" подходит. С utf8 поле будет обрезано при вставке, начиная с первого неподдерживаемого символа Unicode. mathiasbynens.be/notes/mysql-utf8mb4

basic6 27.04.2014 21:47

Интересно, понадобится ли нам когда-нибудь 5 байтов для всех этих смайликов ... вздох

Álvaro González 13.07.2015 12:43

Связанный вопрос: stackoverflow.com/questions/38228335/… "Какое сопоставление MySQL в точности соответствует сравнению строк PHP?"

William Entriken 06.07.2016 18:53

Для обзора разумных вариантов: monolune.com/mysql-utf8-charsets-and-collations-explained

Flux 16.02.2018 02:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
749
4
448 095
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Для текстовой информации UTF-8 следует использовать utf8_general_ci, потому что ...

  • utf8_bin: сравнение строк по двоичное значение каждого символа в строка

  • utf8_general_ci: сравнить строки используя общие языковые правила и с использованием сравнений без учета регистра

a.k.a. это должно сделать поиск и индексацию данных быстрее / эффективнее / полезнее.

Ответ принят как подходящий

Основное отличие - точность сортировки (при сравнении символов на языке) и производительность. Единственный специальный - utf8_bin, предназначенный для сравнения символов в двоичном формате.

utf8_general_ci несколько быстрее utf8_unicode_ci, но менее точен (для сортировки). кодировка utf8 на конкретном языке (например, utf8_swedish_ci) содержат дополнительные языковые правила, которые делают их наиболее точными для сортировки для этих языков. Большую часть времени я использую utf8_unicode_ci (я предпочитаю точность небольшим улучшениям производительности), если у меня нет веских причин предпочитать конкретный язык.

Вы можете прочитать больше о конкретных наборах символов Unicode в руководстве MySQL - http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

небольшие улучшения производительности? ты уверен в этом ? publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topi‌ c = /… Выбранное сопоставление может значительно повлиять на производительность запросов в базе данных.

Adam Ramadhan 07.08.2010 11:54

Это для DB2, а не для MySQL. Кроме того, нет конкретных цифр или ориентиров, поэтому вы просто основываете их на мнении автора.

Eran Galperin 09.08.2010 16:14

Обратите внимание, что если вы хотите использовать функции, есть ошибка в MySQL (в большинстве распространенных в настоящее время версий), когда функции всегда возвращают строку с использованием utf8_general_ci, что вызывает проблемы, если вы используете другое сопоставление для своих строк - см. bugs.mysql.com/bug.php?id=24690

El Yobo 09.02.2011 13:49

По моему опыту работы с разными регионами, я всегда использовал utf8_unicode_*.

Shiplu Mokaddim 18.12.2012 02:51

См. Также: stackoverflow.com/questions/2344118/utf-8-general-bin-unicod‌ e

Costa 10.04.2013 07:38

@ElYobo Ваше замечание важно. В прошлом это причиняло мне много боли. В этом сценарии я обычно должен указать, что он должен использовать конкретный (utf8_swedish_ci), который я использую. Это также верно для хранимых процедур.

Manatax 17.08.2013 02:43

Обновление: для более новых версий рекомендуется utf8mb4 и utf8mb4_unicode_520_ci. Это дает вам остальной китайский язык, а также улучшенную сортировку.

Rick James 05.03.2016 02:30

@RickJames, не могли бы вы пояснить, что означает «новые версии»?

TKoL 21.05.2019 12:55

@TKoL - 5.5 представил utf8mb4; 5.7 исправлены некоторые перегибы; 8.0 сделал его по умолчанию и улучшил сопоставление.

Rick James 21.05.2019 18:49

На самом деле, вы, вероятно, захотите использовать utf8_unicode_ci или utf8_general_ci.

  • utf8_general_ci сортирует, убирая все акценты и сортируя, как если бы это был ASCII
  • utf8_unicode_ci использует порядок сортировки Unicode, поэтому сортировка выполняется правильно на большем количестве языков.

Однако, если вы используете это только для хранения английского текста, они не должны отличаться.

Мне нравится ваше объяснение! Неплохо. Но мне нужно лучше понять, почему порядок сортировки в Юникоде - лучший способ правильной сортировки, чем удаление акцентов.

weia design 05.06.2013 17:23

@Adam Это действительно зависит от вашей целевой аудитории. Сортировка - непростая задача для правильной локализации. Например. в норвежском языке буквы Æ Ø Å - это последние 3 буквы алфавита. С помощью utf8_general_ci Ø и Å преобразуются в O и A, что ставит их в совершенно неправильную позицию при сортировке (я не уверен, как обрабатывается Æ, поскольку это лигатура, а не символ с диакритическими знаками). Этот порядок сортировки различается практически на любом языке, например В норвежском и шведском есть разные порядки (и немного разные буквы, которые считаются равными): Æ Ø Å отсортировано как Å Æ Ø (фактические буквы - Å Ä Ö). Unicode исправляет это.

Vegard Larsen 06.06.2013 10:18

Итак, я в основном говорю, что вам, вероятно, следует использовать сортировку для конкретного языка, если вы можете, но в большинстве случаев это невозможно, поэтому перейдите к общей сортировке Unicode. Это все равно будет странно на каком-то языке, но более правильным, чем ASCII.

Vegard Larsen 06.06.2013 10:19

Не повлияет ли это также на то, как хранятся данные? В наши дни только английского недостаточно.

Manatax 17.08.2013 02:47

@Manatax - при любом сопоставлении utf8_ данные сохраняются как utf8. Сопоставление касается только того, какие символы считаются равными и как они упорядочены.

frymaster 29.10.2013 15:55

@frymaster - неверно, согласно: mathiasbynens.be/notes/mysql-utf8mb4 "MySQL utf8 позволяет хранить только 5,88% всех возможных кодовых точек Unicode"

data 17.06.2014 12:39

Ссылка верна, но это не значит, что все, что я сказал, неправда.

frymaster 17.06.2014 17:27

«если вы используете это только для хранения английского текста, они не должны отличаться». Это слегка избыточное обобщение наивный;) Другими словами, даже полностью английский текст не может быть гарантирован в формате ASCII. (Да, весь этот комментарий является на английском языке.)

Piskvor left the building 09.11.2015 16:31

@Piskvor Обратите внимание, что единственные два сопоставления, которые я упомянул, где UTF-8, а не ASCII ... :)

Vegard Larsen 09.11.2015 20:28

@VegardLarsen: Верно. Однако один будет отсортировать «наивный, наивный, имя», другой «наивный, имя, наивный» (поскольку кодовая точка ï находится дальше по таблице, чем m).

Piskvor left the building 10.11.2015 10:59

Параметры сортировки влияют на то, как сортируются данные и как строки сравниваются друг с другом. Это означает, что вам следует использовать параметры сортировки, которые ожидают большинство ваших пользователей.

Пример из документация для кодировки Unicode:

utf8_general_ci also is satisfactory for both German and French, except that ‘ß’ is equal to ‘s’, and not to ‘ss’. If this is acceptable for your application, then you should use utf8_general_ci because it is faster. Otherwise, use utf8_unicode_ci because it is more accurate.

Итак - это зависит от вашей ожидаемой пользовательской базы и от того, насколько вам нужна сортировка верный. Для англоязычной пользовательской базы utf8_general_ci должно быть достаточно, для других языков, например шведского, были созданы специальные сопоставления.

Я использовал utf8_general_ci, сортировка заняла пару секунд, а armcii_general_ci сделал это очень быстро. Почему это произошло? Еще один вопрос: как вы думаете, какие параметры сортировки используются сайтами социальных сетей

user1432124 04.05.2012 19:27

Помните об этой проблеме, которая может возникнуть при использовании utf8_general_ci.

MySQL не будет различать некоторые символы в операторах select, если используется сопоставление utf8_general_ci. Это может привести к очень неприятным ошибкам - особенно, например, когда задействованы имена пользователей. В зависимости от реализации, в которой используются таблицы базы данных, эта проблема может позволить злоумышленникам создать имя пользователя, соответствующее учетной записи администратора.

Эта проблема проявляется, по крайней мере, в ранних версиях 5.x - я не уверен, изменилось ли это поведение позже.

Я не администратор баз данных, но, чтобы избежать этой проблемы, я всегда использую utf8-bin, а не регистронезависимый.

Приведенный ниже сценарий описывает проблему на примере.

-- first, create a sandbox to play in
CREATE DATABASE `sandbox`;
use `sandbox`;

-- next, make sure that your client connection is of the same 
-- character/collate type as the one we're going to test next:
charset utf8 collate utf8_general_ci

-- now, create the table and fill it with values
CREATE TABLE `test` (`key` VARCHAR(16), `value` VARCHAR(16) )
    CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO `test` VALUES ('Key ONE', 'value'), ('Key TWO', 'valúe');

-- (verify)
SELECT * FROM `test`;

-- now, expose the problem/bug:
SELECT * FROM test WHERE `value` = 'value';

--
-- Note that we get BOTH keys here! MySQLs UTF8 collates that are 
-- case insensitive (ending with _ci) do not distinguish between 
-- both values!
--
-- collate 'utf8_bin' doesn't have this problem, as I'll show next:
--

-- first, reset the client connection charset/collate type
charset utf8 collate utf8_bin

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Note that we get just one key now, as you'd expect.
--
-- This problem appears to be specific to utf8. Next, I'll try to 
-- do the same with the 'latin1' charset:
--

-- first, reset the client connection charset/collate type
charset latin1 collate latin1_general_ci

-- next, convert the values that we've previously inserted
-- in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET latin1 COLLATE latin1_general_ci;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Again, only one key is returned (expected). This shows 
-- that the problem with utf8/utf8_generic_ci isn't present 
-- in latin1/latin1_general_ci
--
-- To complete the example, I'll check with the binary collate
-- of latin1 as well:

-- first, reset the client connection charset/collate type
charset latin1 collate latin1_bin

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin;

-- now, re-check for the bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Again, only one key is returned (expected).
--
-- Finally, I'll re-introduce the problem in the exact same 
-- way (for any sceptics out there):

-- first, reset the client connection charset/collate type
charset utf8 collate utf8_generic_ci

-- next, convert the values that we've previously inserted in the table
ALTER TABLE `test` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

-- now, re-check for the problem/bug
SELECT * FROM test WHERE `value` = 'value';

--
-- Two keys.
--

DROP DATABASE sandbox;

-1: Это наверняка можно исправить, применив уникальный ключ к соответствующему столбцу. Вы бы увидели такое же поведение, если бы двумя значениями были 'value' и 'valUe'. Весь смысл сопоставления в том, что он предоставляет правила (среди прочего), когда две строки считаются равными друг другу.

Hammerite 09.06.2011 14:26

Это именно та проблема, которую я пытаюсь проиллюстрировать - сопоставление делает две вещи равными, хотя на самом деле они вообще не предназначены для того, чтобы быть равными (и, таким образом, уникальное ограничение - это полная противоположность тому, что вы хотели бы достичь)

Guus 10.08.2011 23:49

Но вы описываете это как «проблему» и приводящую к «ошибкам», когда поведение в точности соответствует тому, для чего предназначена сортировка. Ваше описание верное, но только в той мере, в какой это ошибка со стороны администратора базы данных при выборе несоответствующего сопоставления.

Hammerite 11.08.2011 19:42

Дело в том, что когда вы вводите два имени пользователя, которые считаются равными при сопоставлении, это не будет разрешено, если вы установите уникальное имя пользователя coloumn, что вы, конечно же, должны сделать!

Student of Hogwarts 01.12.2012 14:54

Я поддержал как этот ответ, так и комментарий @ Hammerite, потому что оба они вместе помогли мне достичь понимания сопоставления.

Nacht 25.06.2015 04:45

Фактически, вместо того, чтобы сообщать базе данных, что 'value' и 'vaLue' следует считать одинаковыми, а затем запрещать одинаковые значения в этом столбце, вы, вероятно, захотите вообще отключить эти функции сопоставления, установив для сопоставления значение utf8_bin. Здесь одинаковыми считаются только равные значения.

Conic 30.07.2018 17:43

Я могу ошибаться, но разве сортировка не касается только уникальности сортировка, нет? value и VaLuE могут быть одинаковыми для только для целей сортировки, но я действительно сомневаюсь, что сопоставление повлияет на уникальность значений.

MestreLion 15.01.2019 13:57

По сути, это зависит от того, как вы думаете о строке.

Я всегда использую utf8_bin из-за проблемы, обозначенной Гуусом. На мой взгляд, что касается базы данных, строка по-прежнему остается просто строкой. Строка - это количество символов UTF-8. У символа есть двоичное представление, так зачем ему знать язык, который вы используете? Обычно люди создают базы данных для систем с возможностью многоязычных сайтов. В этом весь смысл использования UTF-8 в качестве набора символов. Я немного сторонник чистоты, но думаю, что риск ошибки сильно перевешивает небольшое преимущество, которое вы можете получить при индексировании. Любые правила, относящиеся к языку, должны выполняться на гораздо более высоком уровне, чем СУБД.

В моих книгах «ценность» никогда не должна быть равна «ценности» через миллион лет.

Если я хочу сохранить текстовое поле и выполнять поиск без учета регистра, я буду использовать строковые функции MYSQL с функциями PHP, такими как LOWER () и php-функцией strtolower ().

Если вы желаете сравнить двоичное сравнение строк, тогда, конечно, вам следует использовать двоичное сопоставление; но отклонение альтернативных сопоставлений как «риска ошибок» или просто для удобства индексации предполагает, что вы не полностью понимаете смысл сопоставления.

Hammerite 09.06.2011 14:32

Для случая, выделенного Гуусом, я настоятельно рекомендую использовать либо utf8_unicode_cs (с учетом регистра, строгое соответствие, по большей части правильный порядок) вместо utf8_bin (строгое соответствие, неправильный порядок).

Если поле предназначено для поиска, а не для поиска пользователя, используйте utf8_general_ci или utf8_unicode_ci. В обоих случаях регистр не учитывается, в одном случае совпадение будет безуспешным («ß» равно «s», а не «ss»). Существуют также версии для конкретных языков, такие как utf8_german_ci, где сопоставление потерь больше подходит для указанного языка.

[Edit - почти 6 лет спустя]

Я больше не рекомендую набор символов «utf8» в MySQL, а вместо этого рекомендую набор символов «utf8mb4». Они почти полностью совпадают, но позволяют использовать немного (намного) больше символов Юникода.

Реально MySQL должен был обновить набор символов «utf8» и соответствующие сопоставления, чтобы они соответствовали спецификации «utf8», но вместо этого нужно было использовать отдельный набор символов и соответствующие сопоставления, чтобы не влиять на обозначение хранилища для тех, кто уже использует свой неполный набор символов «utf8». .

К вашему сведению: utf8_unicode_cs не существует. Единственный чувствительный к регистру utf8 - это utf8_bin. Проблема в том, что сортировка utf8_bin неверна. См .: stackoverflow.com/questions/15218077/…

Costa 10.04.2013 07:35

Спасибо за обновление!

Hashim Aziz 13.05.2019 21:39

В принятом ответе довольно однозначно предлагается использовать utf8_unicode_ci, и хотя для новых проектов это здорово, я хотел рассказать о своем недавнем противоположном опыте на всякий случай, если это кому-то сэкономит время.

Поскольку utf8_general_ci является сортировкой по умолчанию для Unicode в MySQL, если вы хотите использовать utf8_unicode_ci, вам придется указать его в много мест.

Например, все клиентские соединения имеют не только кодировку по умолчанию (для меня это имеет смысл), но также сопоставление по умолчанию (т.е. сопоставление всегда будет по умолчанию на utf8_general_ci для юникода).

Вероятно, если вы используете utf8_unicode_ci для своих полей, ваши скрипты, которые подключаются к базе данных, необходимо будет обновить, чтобы явно указать желаемое сопоставление - в противном случае запросы с использованием текстовых строк могут завершиться ошибкой, если ваше соединение использует сопоставление по умолчанию.

В результате при преобразовании существующей системы любого размера в Unicode / utf8 вам может потребоваться использовать utf8_general_ci из-за того, как MySQL обрабатывает значения по умолчанию.

Лучше всего использовать набор символов utf8mb4 с сопоставлением utf8mb4_unicode_ci.

Набор символов utf8 поддерживает только небольшое количество кодовых точек UTF-8, около 6% возможных символов. utf8 поддерживает только базовую многоязычную плоскость (BMP). Еще 16 самолетов. Каждый самолет содержит 65 536 знаков. utf8mb4 поддерживает все 17 самолетов.

MySQL усекает 4-байтовые символы UTF-8, что приводит к повреждению данных.

Набор символов utf8mb4 был представлен в MySQL 5.5.3 24.03.2010.

Некоторые из необходимых изменений для использования нового набора символов нетривиальны:

  • Возможно, потребуется внести изменения в адаптер базы данных вашего приложения.
  • В my.cnf необходимо внести изменения, включая настройку набора символов, сопоставление и переключение innodb_file_format на Barracuda.
  • Операторы SQL CREATE могут включать: ROW_FORMAT=DYNAMIC
    • DYNAMIC требуется для индексов на VARCHAR (192) и выше.

ПРИМЕЧАНИЕ. Переход на Barracuda с Antelope может потребовать перезапуска службы MySQL более одного раза. innodb_file_format_max не изменяется до тех пор, пока служба MySQL не будет перезапущена на: innodb_file_format = barracuda.

MySQL использует старый формат файла Antelope InnoDB. Barracuda поддерживает динамические форматы строк, которые вам понадобятся, если вы не хотите сталкиваться с ошибками SQL для создания индексов и ключей после переключения на кодировку: utf8mb4

  • # 1709 - Размер столбца индекса слишком велик. Максимальный размер столбца - 767 байт.
  • # 1071 - Указанный ключ был слишком длинным; максимальная длина ключа 767 байт

Следующий сценарий был протестирован в MySQL 5.6.17: По умолчанию MySQL настроен так:

SHOW VARIABLES;

innodb_large_prefix = OFF
innodb_file_format = Antelope

Остановите службу MySQL и добавьте параметры в существующий my.cnf:

[client]
default-character-set= utf8mb4

[mysqld]
explicit_defaults_for_timestamp = true
innodb_large_prefix = true
innodb_file_format = barracuda
innodb_file_format_max = barracuda
innodb_file_per_table = true

# Character collation
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci

Пример оператора SQL CREATE:

CREATE TABLE Contacts (
 id INT AUTO_INCREMENT NOT NULL,
 ownerId INT DEFAULT NULL,
 created timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 contact VARCHAR(640) NOT NULL,
 prefix VARCHAR(128) NOT NULL,
 first VARCHAR(128) NOT NULL,
 middle VARCHAR(128) NOT NULL,
 last VARCHAR(128) NOT NULL,
 suffix VARCHAR(128) NOT NULL,
 notes MEDIUMTEXT NOT NULL,
 INDEX IDX_CA367725E05EFD25 (ownerId),
 INDEX created (created),
 INDEX modified_idx (modified),
 INDEX contact_idx (contact),
 PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT=DYNAMIC;
  • Вы можете увидеть ошибку # 1709, сгенерированную для INDEX contact_idx (contact), если ROW_FORMAT=DYNAMIC удален из оператора CREATE.

ПРИМЕЧАНИЕ. Изменение индекса на ограничение до первых 128 символов на contact устраняет необходимость использования Barracuda с ROW_FORMAT=DYNAMIC.

INDEX contact_idx (contact(128)),

Также обратите внимание: когда он говорит, что размер поля составляет VARCHAR(128), это не 128 байт. Вы можете использовать 128, 4-байтовые символы или 128, 1-байтовые символы.

Этот оператор INSERT должен содержать 4-байтовый символ poo во второй строке:

INSERT INTO `Contacts` (`id`, `ownerId`, `created`, `modified`, `contact`, `prefix`, `first`, `middle`, `last`, `suffix`, `notes`) VALUES
(1, NULL, '0000-00-00 00:00:00', '2014-08-25 03:00:36', '1234567890', '12345678901234567890', '1234567890123456789012345678901234567890', '1234567890123456789012345678901234567890', '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678', '', ''),
(2, NULL, '0000-00-00 00:00:00', '2014-08-25 03:05:57', 'poo', '12345678901234567890', '????????????????????????????????????????', '????????????????????????????????????????', '????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????', '', ''),
(3, NULL, '0000-00-00 00:00:00', '2014-08-25 03:05:57', 'poo', '12345678901234567890', '????????????????????????????????????????', '????????????????????????????????????????', '123?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????', '', '');

Вы можете увидеть, сколько места занимает столбец last:

mysql> SELECT BIT_LENGTH(`last`), CHAR_LENGTH(`last`) FROM `Contacts`;
+--------------------+---------------------+
| BIT_LENGTH(`last`) | CHAR_LENGTH(`last`) |
+--------------------+---------------------+
|               1024 |                 128 | -- All characters are ASCII
|               4096 |                 128 | -- All characters are 4 bytes
|               4024 |                 128 | -- 3 characters are ASCII, 125 are 4 bytes
+--------------------+---------------------+

В вашем адаптере базы данных вы можете установить кодировку и сопоставление для вашего соединения:

SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'

В PHP это будет: \PDO::MYSQL_ATTR_INIT_COMMAND

Рекомендации:

Подробнее о Википедия: самолеты Unicode

Jeremy Postlethwaite 25.08.2014 01:07

utf8mb4_unicode_ci - безусловно, рекомендуемая сортировка для новых проектов в 2015 году.

Trevor Gehman 07.07.2015 19:44

Обновите ... utf8mb4_unicode_520_ci лучше. В будущем появится utf8mb4_unicode_800_ci (или что-то в этом роде), поскольку MySQL догоняет стандарты Unicode.

Rick James 29.04.2016 07:17

Я нашел эти таблицы сопоставления полезными. http://collation-charts.org/mysql60/. Я не уверен, что используется utf8_general_ci.

Например, вот диаграмма для utf8_swedish_ci. Он показывает, какие символы он интерпретирует как одинаковые. http://collation-charts.org/mysql60/mysql604.utf8_swedish_ci.html

Другой вариант диаграммы: mysql.rjweb.org/utf8_collations.html

Rick James 06.06.2017 21:53

В файле загрузки базы данных добавьте следующую строку перед любой строкой:

SET NAMES utf8;

И твоя проблема должна быть решена.

Прочтите вопрос: Раньше я устанавливал PHP для вывода в "UTF-8", но какому сопоставлению это соответствует в MySQL? Я думаю, что это один из UTF-8, но раньше я использовал utf8_unicode_ci, utf8_general_ci и utf8_bin.

Jitesh Sojitra 09.08.2016 11:45

Этот ответ не имеет ничего общего с вопросом. Кроме того, отправка запроса SET NAMES напрямую не позволяет клиенту узнать о кодировке и может очень тонко нарушить некоторые функции, такие как подготовленные операторы.

Álvaro González 30.09.2016 12:20

Другие вопросы по теме