Работа с кодировками в mySQL
Материал из 1GbWiki.
Версия 06:43, 10 декабря 2010 (править) NovaCxarmulo (Обсуждение | вклад) (→Работа с правильной кодировкой (CP-1251)) ← К предыдущему изменению |
Версия 22:15, 15 августа 2024 (править) (отменить) Dmih (Обсуждение | вклад) К следующему изменению → |
||
Строка 1: | Строка 1: | ||
'''Важно: для новых баз данных''' | '''Важно: для новых баз данных''' | ||
Создание баз данных происходит с кодировкой по умолчанию CP1251 / CP1251_general_ci. Сайты на PHP 5, созданные после 8 марта 2007 года, работают с этой кодировкой без дополнительной настройки. | Создание баз данных происходит с кодировкой по умолчанию CP1251 / CP1251_general_ci. Сайты на PHP 5, созданные после 8 марта 2007 года, работают с этой кодировкой без дополнительной настройки. | ||
- | |||
Дальнейшая информация в статье имеет отношение к более старым сайтам нашего хостинга, а также к другим mySQL клиентам, с которыми вы можете встретиться на нашем хостинге или в собственных приложениях. | Дальнейшая информация в статье имеет отношение к более старым сайтам нашего хостинга, а также к другим mySQL клиентам, с которыми вы можете встретиться на нашем хостинге или в собственных приложениях. | ||
- | |||
Для баз существующих клиентов (до марта 2007 года) или сайтов на PHP 4 | Для баз существующих клиентов (до марта 2007 года) или сайтов на PHP 4 | ||
Кодировка базы данных (charset, collation) устанавливает режим работы с текстовой информацией в базе. Кодировка задается двумя параметрами: charset - набор кодов символов, рассматриваемых как текст, и collation - правило работы с этими символами (правила сортировки, сравнения, перевода регистров). | Кодировка базы данных (charset, collation) устанавливает режим работы с текстовой информацией в базе. Кодировка задается двумя параметрами: charset - набор кодов символов, рассматриваемых как текст, и collation - правило работы с этими символами (правила сортировки, сравнения, перевода регистров). | ||
- | |||
В mySQL 4 появилась возможность самостоятельно задавать кодировки для таблиц и даже для отдельных полей таблиц. | В mySQL 4 появилась возможность самостоятельно задавать кодировки для таблиц и даже для отдельных полей таблиц. | ||
- | |||
К сожалению, работа с разными кодировками в mySQL 4 и mySQL 5 сделана не вполне удачно. Мы можем предложить два способа работы. | К сожалению, работа с разными кодировками в mySQL 4 и mySQL 5 сделана не вполне удачно. Мы можем предложить два способа работы. | ||
- | |||
== Работа с кодировкой по умолчанию == | == Работа с кодировкой по умолчанию == | ||
- | |||
По умолчанию на нашем хостинге установлен charset - latin1, collation - latin1_binary. Сравнение русских букв производится по их коду по номеру. Это позволяет делать следующее: | По умолчанию на нашем хостинге установлен charset - latin1, collation - latin1_binary. Сравнение русских букв производится по их коду по номеру. Это позволяет делать следующее: | ||
- | |||
Главное: Этот режим совместим со всем ПО - старыми и новыми клиентами, mySQL Front, PHP клиентами, ODBC, и т.д., т.е. достигается максимальная совместимость со всем тем, что работало с mySQL 3х версий. | Главное: Этот режим совместим со всем ПО - старыми и новыми клиентами, mySQL Front, PHP клиентами, ODBC, и т.д., т.е. достигается максимальная совместимость со всем тем, что работало с mySQL 3х версий. | ||
Строка 27: | Строка 20: | ||
К сожалению, регистро-независимое сравнение и преобразование регистров для русского алфавита в данном режиме не работает. Помните, это может привести к неправильной работе приложений, которые на это рассчитаны! | К сожалению, регистро-независимое сравнение и преобразование регистров для русского алфавита в данном режиме не работает. Помните, это может привести к неправильной работе приложений, которые на это рассчитаны! | ||
Для того, чтобы воспользоваться этим режимом, вам не нужно вносить никаких изменений в код - просто создавайте базу и работайте как обычно. | Для того, чтобы воспользоваться этим режимом, вам не нужно вносить никаких изменений в код - просто создавайте базу и работайте как обычно. | ||
- | |||
Этот способ вполне подойдет людям, которым достаточно описанной функциональности, или в том случае, если решить проблемы, вызванные "корректной" работой с кодировкой, не удается. | Этот способ вполне подойдет людям, которым достаточно описанной функциональности, или в том случае, если решить проблемы, вызванные "корректной" работой с кодировкой, не удается. | ||
- | |||
== Работа с правильной кодировкой (CP-1251) == | == Работа с правильной кодировкой (CP-1251) == | ||
- | |||
Для работы с правильной кодировкой вам нужно с помощью средства управления базой, совместимого с mySQL 4, поменять кодировку таблиц. Удобнее это делать сразу после создания таблицы, чтобы поля унаследовали эту кодировку автоматом. | Для работы с правильной кодировкой вам нужно с помощью средства управления базой, совместимого с mySQL 4, поменять кодировку таблиц. Удобнее это делать сразу после создания таблицы, чтобы поля унаследовали эту кодировку автоматом. | ||
Внимание: не забывайте, что поменять кодировку таблицы после создания там полей недостаточно, убедитесь, что поля тоже имеют правильную кодировку! | Внимание: не забывайте, что поменять кодировку таблицы после создания там полей недостаточно, убедитесь, что поля тоже имеют правильную кодировку! | ||
- | |||
Средства управления можно скачать с сайта www.mysql.com, например, mySQL Administrator. | Средства управления можно скачать с сайта www.mysql.com, например, mySQL Administrator. | ||
- | |||
'''Главное''': Этот режим не до конца совместим с ПО, рассчитанным на работу с mySQL 3, таким, как mySQL Front и т.п., также не всегда получается нормально работать с клиентами - PHP, ODBC, и т.д. Если вместо русских букв вы видите знаки '?' - вы попали именно в такую ситуацию. | '''Главное''': Этот режим не до конца совместим с ПО, рассчитанным на работу с mySQL 3, таким, как mySQL Front и т.п., также не всегда получается нормально работать с клиентами - PHP, ODBC, и т.д. Если вместо русских букв вы видите знаки '?' - вы попали именно в такую ситуацию. | ||
Строка 47: | Строка 35: | ||
Хранение и обработка русских символов во всех режимах осуществляется правильно. | Хранение и обработка русских символов во всех режимах осуществляется правильно. | ||
Внимание: практика показывает, что изменять charset и collation на таблице, которая уже имеет данные, бесполезно - вы получите '?' вместо русских символов. | Внимание: практика показывает, что изменять charset и collation на таблице, которая уже имеет данные, бесполезно - вы получите '?' вместо русских символов. | ||
- | |||
'''Примечание 1''': Обычно для правильной работы с кодировкой CP1251 достаточно дать следующие команды после соединения с базой (это PHP код): | '''Примечание 1''': Обычно для правильной работы с кодировкой CP1251 достаточно дать следующие команды после соединения с базой (это PHP код): | ||
Строка 54: | Строка 41: | ||
mysql_query ("set character_set_results='cp1251'"); | mysql_query ("set character_set_results='cp1251'"); | ||
mysql_query ("set collation_connection='cp1251_general_ci'"); | mysql_query ("set collation_connection='cp1251_general_ci'"); | ||
- | |||
'''Примечание 2''': Для ODBC драйвера для mySQL к строке подключения необходимо дописать следующий параметр: | '''Примечание 2''': Для ODBC драйвера для mySQL к строке подключения необходимо дописать следующий параметр: | ||
- | |||
stmt=SET NAMES 'cp1251' | stmt=SET NAMES 'cp1251' | ||
== MySQL .NET Connector == | == MySQL .NET Connector == | ||
+ | |||
В качестве строки подключения надо указывать строку вида: | В качестве строки подключения надо указывать строку вида: | ||
Строка 76: | Строка 62: | ||
В случае продолжающихся проблем мы можем также рекомендовать вам пользоваться базой mySQL 3.*, для которой на нашем хостинге установлена традиционная кодировка cp1251 (Windows). Однако помните, что в этом случае вам придется работать с текстами в кодировке cp1251. | В случае продолжающихся проблем мы можем также рекомендовать вам пользоваться базой mySQL 3.*, для которой на нашем хостинге установлена традиционная кодировка cp1251 (Windows). Однако помните, что в этом случае вам придется работать с текстами в кодировке cp1251. | ||
+ | |||
[[Категория:MySQL]] | [[Категория:MySQL]] | ||
+ | [[Категория:Программирование]] | ||
+ | [[Категория:Популярные проблемы]] |
Версия 22:15, 15 августа 2024
Важно: для новых баз данных Создание баз данных происходит с кодировкой по умолчанию CP1251 / CP1251_general_ci. Сайты на PHP 5, созданные после 8 марта 2007 года, работают с этой кодировкой без дополнительной настройки.
Дальнейшая информация в статье имеет отношение к более старым сайтам нашего хостинга, а также к другим mySQL клиентам, с которыми вы можете встретиться на нашем хостинге или в собственных приложениях.
Для баз существующих клиентов (до марта 2007 года) или сайтов на PHP 4 Кодировка базы данных (charset, collation) устанавливает режим работы с текстовой информацией в базе. Кодировка задается двумя параметрами: charset - набор кодов символов, рассматриваемых как текст, и collation - правило работы с этими символами (правила сортировки, сравнения, перевода регистров).
В mySQL 4 появилась возможность самостоятельно задавать кодировки для таблиц и даже для отдельных полей таблиц.
К сожалению, работа с разными кодировками в mySQL 4 и mySQL 5 сделана не вполне удачно. Мы можем предложить два способа работы.
Содержание |
Работа с кодировкой по умолчанию
По умолчанию на нашем хостинге установлен charset - latin1, collation - latin1_binary. Сравнение русских букв производится по их коду по номеру. Это позволяет делать следующее:
Главное: Этот режим совместим со всем ПО - старыми и новыми клиентами, mySQL Front, PHP клиентами, ODBC, и т.д., т.е. достигается максимальная совместимость со всем тем, что работало с mySQL 3х версий. Хранение русских символов во всех режимах осуществляется правильно. Сортировка русских символов осуществляется правильно, кроме буквы Ё (к сожалению). К сожалению, регистро-независимое сравнение и преобразование регистров для русского алфавита в данном режиме не работает. Помните, это может привести к неправильной работе приложений, которые на это рассчитаны! Для того, чтобы воспользоваться этим режимом, вам не нужно вносить никаких изменений в код - просто создавайте базу и работайте как обычно.
Этот способ вполне подойдет людям, которым достаточно описанной функциональности, или в том случае, если решить проблемы, вызванные "корректной" работой с кодировкой, не удается.
Работа с правильной кодировкой (CP-1251)
Для работы с правильной кодировкой вам нужно с помощью средства управления базой, совместимого с mySQL 4, поменять кодировку таблиц. Удобнее это делать сразу после создания таблицы, чтобы поля унаследовали эту кодировку автоматом. Внимание: не забывайте, что поменять кодировку таблицы после создания там полей недостаточно, убедитесь, что поля тоже имеют правильную кодировку!
Средства управления можно скачать с сайта www.mysql.com, например, mySQL Administrator.
Главное: Этот режим не до конца совместим с ПО, рассчитанным на работу с mySQL 3, таким, как mySQL Front и т.п., также не всегда получается нормально работать с клиентами - PHP, ODBC, и т.д. Если вместо русских букв вы видите знаки '?' - вы попали именно в такую ситуацию. Большинство вопросов можно решить, воспользовавшись русскоязычными ресурсами по программированию, например, http://www.mysql.ru/. Обычно достаточно следовать короткому совету (см. примечание 1). Хранение и обработка русских символов во всех режимах осуществляется правильно. Внимание: практика показывает, что изменять charset и collation на таблице, которая уже имеет данные, бесполезно - вы получите '?' вместо русских символов.
Примечание 1: Обычно для правильной работы с кодировкой CP1251 достаточно дать следующие команды после соединения с базой (это PHP код):
mysql_query ("set character_set_client='cp1251'"); mysql_query ("set character_set_results='cp1251'"); mysql_query ("set collation_connection='cp1251_general_ci'");
Примечание 2: Для ODBC драйвера для mySQL к строке подключения необходимо дописать следующий параметр:
stmt=SET NAMES 'cp1251'
MySQL .NET Connector
В качестве строки подключения надо указывать строку вида:
Server=<server>;Database=<database>;User=<user>;Password=<password>;CharSet=utf8
Примечание: кодировку utf8 нужно указывать даже в том случае, если кодировка таблицы стоит 1251.
Дополнительная информация
К сожалению, служба поддержки не может оказывать помощь по решению проблем кодировок mySQL 4/5. Количество средств программирования и способов использования базы слишком велико, чтобы описать каждый случай.
Практика показывает, что использование условно-правильного совместимого режима (latin1/latin1_binary), которое происходит по умолчанию, решает основную проблему работы с кодировкой (сортировку), и предоставляет хороший уровень обратной совместимости.
В случае продолжающихся проблем мы можем также рекомендовать вам пользоваться базой mySQL 3.*, для которой на нашем хостинге установлена традиционная кодировка cp1251 (Windows). Однако помните, что в этом случае вам придется работать с текстами в кодировке cp1251.