2015-12-25 3 views
8

Я немного запутался прямо сейчас У меня есть соединение PDO с charset=utf8 , а БД использует latin.набор символов между PHP и MySQL

Что это значит?

Мое мышление это означает, что каждое соединение, выполняемое PHP, отправляемое или получаемое из БД, закодировано до utf8. Однако я много читал, что БД тоже должна использовать ту же кодировку, что и PHP.

Может ли кто-нибудь, пожалуйста, детально описать роль набора символов в PHP и в БД MySQL точно и в чем их преимущества?

+0

Так много. Самые первые иностранные языки. Если интересно, прочитайте это http://htmlpurifier.org/docs/enduser-utf8.html#whyutf8 – devpro

ответ

2

Say PHP отправляет некоторый текст MySQL для хранения, что-то вроде

INSERT INTO `some_table` ("foo") VALUES 
('The quick brown fox jumps over the lazy dog'); 

Основная цель этого запроса, очевидно, сказать MySQL для хранения строки Быстрая коричневая лиса прыгает через ленивую собаку в базу данных.

Если PHP настроен на использование UTF-8, это означает, что когда он преобразует человеческие читаемые символы в двоичные - для передачи его в MySQL - он преобразует символы, используя систему кодирования UTF-8.
MySQL может считывать символы, закодированные в UTF-8, и поэтому у него нет проблем с пониманием того, что цифровая кодированная последовательность должна означать T и h и e и т. Д. - в человекообразных символах.
Если MySQL настроен для хранения данных в таблице some_table, используя latin1, когда он получает строку, то будет конвертировать символы из их кодировок UTF-8 в латинские эквиваленты до сохранения данных на жесткий диск.
В этом случае нет проблем - поскольку символы английского алфавита могут быть представлены как UTF-8, так и Latin1.
Однако возникают проблемы, если строка, отправленная PHP, содержит символы, которые могут быть представлены только UTF-8, а не Latin1, например. умная цитата . Когда MySQL пытается преобразовать смарт-цитату в цифровую форму, она не сможет - потому что Latin1 буквально не имеет цифрового кодирования, определенного для представления .
Я не уверен, какой точный процесс управления ошибками MySQL, когда он сталкивается с этой ситуацией, и является ли ситуация восстановимой, но в целом конечный результат заключается в том, что базовая кодировка будет повреждена и непригодна для использования.
Поскольку эта проблема возникает только для тех символов, которые не могут быть представлены двумя системами, и если 99% всех ваших сообщений связаны с английскими символами, вы можете не заметить проблему довольно долгое время, и даже тогда это будет только случайный характер, но попытка восстановить, когда вы заметите, проблемы могут быть разочаровывающими.

+0

Это потрясающе, и это объясняет большое спасибо. Но хотел спросить вас, если я использую utf8 в php, рекомендуется использовать то же с MySQL, хотя я пытаюсь сохранить производительность с помощью базы данных с почти 20 столбцами и 2000 строк. И для среднего времени я просто использую английский (может измениться в будущем) – moawaya

+0

Прохладный. Я не могу себе представить, почему переключение MySQL вызвало бы проблемы с производительностью, особенно с небольшой небольшой базой данных. Но если вы беспокоитесь, вы всегда можете настроить БД и запросить свои запросы со старыми и новыми кодировками MySQL. Я понимаю, что когда MySQL выпускает v6.0 UTF-8 будет по-прежнему перемещаться по кодировке по умолчанию –

+0

. Переключение не вызовет проблемы, запросы будут более медленными. Я понимаю, что UTF8 занимает больше места, чем латинский, что делает его медленнее для запроса, пожалуйста, исправьте, если я ошибаюсь, и дайте мне свое окончательное предложение о моей ситуации. Я знаю, что БД небольшая, но я работаю на минимальных ресурсах, поэтому я не нужно сосать всю энергию чашки на запросы. – moawaya

Смежные вопросы