MySQL 4.1+ и любые проблемы с русскими кодировками.

Автор: Fix Xxer (PHP Club)

У MySQL версии 4.1 и выше (далее 4.1+) с русскими буквами бывают несколько проблем — рассмотрим их по отдельности.

1. PHP использует неверную кодировку в качестве клиентской.

Симптомы:

  • Через phpMyAdmin (здесь и далее подразумевается версия умеющая работать с кодировками, т.е. >= 2.6.0) все по-русски, а в скрипт приходят вопросительные знаки.
  • Скрипт, заносящий данные в базу, видит русский нормально, а после вставки, как в правильном скрипте, так и в phpMyAdmin-е — знаки вопросов.

Тестирование:
Попробуйте в начале вашего скрипта, но после соединения, выполнить SQL-запрос «SET NAMES кодировка». Где кодировка — та кодировка, в которой у вас (по вашему мнению) данные. Например, для русской Windows кодировки (windows-1251) это будет cp1251, для KOI8-R – koi8r, для UTF-8 – utf8 и так далее. В дальнейшем она будет упоминаться как «кодировка».

Результат тестирования:

  • Если буквы (но необязательно слова) стали русскими, значит, данные в базе лежат в правильной кодировке, сама база эту самую кодировку и использует.
  • Если буквы стали русскими, а слова нет («бнопня»), значит, скрипт ожидает данные в другой русской кодировке — пробуйте другие, пока не получится русских слов.

Решение:
1) Оставить запрос «SET NAMES кодировка» в начале скрипта. Если скриптов много – см. вариант 2.

2) Заставить MySQL автоматически выполнять этот запрос при каждом соединении с ним.
Для этого необходимо в конфигурационном файле MySQL, в секции [mysqld] добавить следующую строку: init-connect=»SET NAMES кодировка».

Однако, следует заметить, что это НЕ будет работать, если пользователь, которым вы подключаетесь к базе имеет привилегию SUPER (а стандартный пользователь root к таким относится, так же как и все созданные через «GRANT ALL PRIVILEGES ON *.* TO …»). Это сделано для того, чтобы в случае ошибки в этом запросе (а его можно изменить во время работы), хоть кто-то мог подключиться к базе и исправить его.

Внимание! Функция mysqli_client_encoding() и сотоварищи, отображает кодировку клиента на момент соединения и не меняют возвращаемое значение в процессе работы. Поэтому не стоит кричать, что кодировка не меняется. Просто делайте, что говорят и смотрите результат работы скрипта. Получить нужное значение можно SQL-запросом «SHOW VARIABLES LIKE ‘character_set_client'».

3) Начиная с версий 4.1.15 и 5.0.13 добавить в секцию [mysqld] или [server] конфигурационного файла MySQL параметр skip-character-set-client-handshake. Этот параметр заставляет сервер игнорировать кодировку, посылаемую клиентом, и использовать указанную серверу. В примере конфигурации ниже этот параметр уже есть.

2. MySQL использует неверную кодировку

Симптомы:
Русский текст приходит в скрипт как русский, в консольном клиенте тоже все хорошо. Однако не работает сортировка, перевод в верхний/нижний регистр и т.д. Если применить решение из проблемы №1, то либо русский текст становится вопросами, либо mysql_error() возвращает сообщение похожее на «Illegal mix of collations (latin1_general_ci,IMPLICIT) and (cp1251_general_ci,COERCIBLE).

..». В тоже время phpMyAdmin русский текст отображает как «крокозябры» (латинские символы с умляутами и т.д.).

Тестирование:
Попробуйте в phpMyAdmin’е выполнить запрос вида «SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица». Где «таблица» и «поле» — соответствующая таблица и поле с русским текстом, а «кодировка» — кодировка из проблемы №1.

Результат тестирования:

  • Если буквы (но необязательно слова) стали русскими, значит текст в базе лежал не в правильной кодировке и его нужно сконвертировать.
  • Если буквы стали русскими, а слова нет («бнопня»), значит неверно выбрана одна из русских кодировок – пробуйте другие, пока не получится русских слов.

Решение:
1) Установить для MySQL нужную кодировку по умолчанию.

Внимание! Это решение сработает сработает, только если кодировки не переопределены для базы, таблицы или столбца.
Для этого нужно в конфигурационном файле MySQL в секции [mysqld] добавить следующую строку:
default-character-set=cp1251

2) Сконвертировать таблицы в нужную кодировку.
Про то как конвертировать таблицы с неверными кодировками хорошо написано в мануале MySQL. Повторять здесь то же самое не к чему.

Дополнительно:

  • Установка MySQL 4.1+ с поддержкой русской кодировки
  • Перенос данных, содержащих русские буквы между MySQL разных версий
  • Установка MySQL 5.1+

Наша справка:

Конфигурационный файл MySQL — применяется для записи и хранения параметров программ MySQL, что исключает необходимость ввода этих параметров в командной строке при каждом вызове программы. Все определенные в конфигурационном файле параметры могут перекрываться параметрами, заданными в командной строке. В ОС UNIX в качестве конфигурационного файла используется my.cnf, в ОС Windows используется my.ini. Найти конфигурационный файл можно в корневой директории MySQL (см. местоположение конфигурационного файла MySQL). Внутри конфигурационных файлов параметры распределены по группам. Например:

[client]
user=sampadm
password=secret

[mysqld]
port = 3306
socket = /tmp/mysql. sock
Названия групп заключаются в квадратные скобки и обычно соответствуют именам программ. Так, например, группа [mysqld] (в ранних версиях mysql — [server]) соответствует программе mysqld, являющейся сервером MySQL, который обеспечивает клиентским программам доступ к базам данных.

корректная кодировка строк — RUUD

25-06-2018 20:54

Содержание статьи:

  • Общее правило представления информации
  • Работа с базой данных

Использование PHP дает однозначно работающее решение. Если что-то где-то не отображается, нет синтаксических или семантических ошибок, то проблема будет лежать в используемой кодировке символов. Возможны другие коллизии, но нарушения правил кодирования информации — самые частые.

Общее правило представления информации

Всегда имеет значение кодировка файла, в котором содержится скрипт PHP. Если нет проблем с отображением исходного текста в среде разработки или обычном текстовом редакторе, а в браузере ничего прочитать нельзя — не следует обращаться сразу к функции PHP iconv.

Нужно просто поправить строчки:

  • «META charset=»UTF-8″» или charset=»windows-1251″;
  • «META HTTP-EQUIV=»Content-Language» CONTENT=»en,ru»».

Вам будет интересно:Как установить Microsoft Office: советы, подсказки, рекомендации

Это простое правило, обычно в этом контексте проблем нет: если в среде разработки код PHP отображается корректно (кириллица), то в браузере он будет читабелен. Даже малоквалифицированный программист сможет все подстроить так, как надо.

Код PHP — это обработка текстовой информации. Часто программист забывает, что один символ — это далеко не всегда один байт. Если сайт посвящен математическим расчетам, а кириллица применяется при выводе результатов, возможны коллизии. Это решается применением функции iconv() в PHP-коде страницы.

Если в процессе обработки информации используется база данных, то информация может просто «пропасть». В реальность все есть и все работает, просто нужно произвести надлежащие преобразования.

Приведенные примеры показывают, как просто произвести преобразование строк из одной кодировки в другую посредством функции PHP iconv(). Не суть важно, в каком регистре записывать стандартные обозначения кодировок, но смысл использования функции должен быть корректен.

Прежде чем производить преобразование, нужно знать:

  • из какой кодировки;
  • в какую кодировку.

В последнем примере показано, как iconv используется для визуализации исполнения внешней команды dir, исполненной в Windows 10. Результаты работы команды возвращены обратно в место вызова, где PHP iconv() трансформировала их из CP866 в UTF-8, и они корректно отобразились в браузере.

Во всех этих случаях функция предоставила возможность получить информацию в читабельном виде.

Работа с базой данных

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

Проблема решается просто. Если запрос исполняется без ошибок, значит, виновато несоответствие кодировки базы данных и кода страницы. Обычно этого достаточно, если нет, нужно проверить кодировку HTML-страницы, PHP-кода и базы данных. Проблема будет решена.

Характерная черта: кодировок много, условия для исполнения работы многогранны, но если один раз все проверить и обеспечить совместимость, то результат будет абсолютно читабельным, а работа веб-ресурса — безукоризненна.

Источник

Автор: Алена Городецкая

Похожие статьи

«Система «Виндовс» защитила ваш компьютер»: как отключить появление этого сообщения? Простейшие методы

Ошибка статуса VPN в «Хамачи»: способы быстрого решения проблемы

Как сделать рассылку в «Вайбере»: подробная инструкция и способы

Как сделать бизнес-аккаунт в «Фейсбук»: создание, настройка и раскрутка

Как восстановить переписку в «Телеграмме»: пошаговая инструкция, советы

Как получить в «ES Проводник» Root-права?

Как отключить «Протект» в «Яндекс. Браузере» на компьютере?

Как сохранять контакты в «Гугл»: простые способы, правила переноса, рекомендации и советы

Как на «Андроиде» переименовать приложение: подробная инструкция

Продукты «Гугла»: список, функции и возможности, отзывы

PHP: Поддерживаемые кодировки символов — руководство

Изменение языка: английскийбразильский португальскийкитайский (упрощенный)французскийнемецкийяпонскийрусскийиспанскийтурецкийДругое

Отправить запрос на вытягивание Сообщить об ошибке

В настоящее время следующие кодировки символов поддерживаются mbstring модуль. Любая из этих кодировок символов можно указать в параметре encoding mbstring функций.

В этом PHP поддерживаются следующие кодировки символов. расширение:

  • ПСК-4*
  • УКС-4ВЕ
  • УКС-4ЛЕ*
  • УКС-2
  • УКС-2БЭ
  • УКС-2ЛЕ
  • UTF-32*
  • УТФ-32ВЕ*
  • УТФ-32ЛЕ*
  • UTF-16*
  • UTF-16BE*
  • UTF-16LE*
  • UTF-7
  • UTF7-IMAP
  • UTF-8*
  • ASCII*
  • EUC-JP*
  • СЖИС*
  • eucJP-win*
  • SJIS-выигрыш*
  • ИСО-2022-JP
  • ISO-2022-JP-MS
  • СР932
  • КП51932
  • SJIS-mac (псевдоним: MacJapanese)
  • SJIS-Mobile#DOCOMO (псевдоним: SJIS-DOCOMO)
  • SJIS-Mobile#KDDI (псевдоним: SJIS-KDDI)
  • SJIS-Mobile#SOFTBANK (псевдоним: SJIS-SOFTBANK)
  • UTF-8-Mobile#DOCOMO (псевдоним: UTF-8-DOCOMO)
  • UTF-8-мобильный#KDDI-A
  • UTF-8-Mobile#KDDI-B (псевдоним: UTF-8-KDDI)
  • UTF-8-Mobile#SOFTBANK (псевдоним: UTF-8-SOFTBANK)
  • ISO-2022-JP-MOBILE#KDDI (псевдоним: ISO-2022-JP-KDDI)
  • ДЖИС
  • JIS-мс
  • КП50220
  • CP50220raw
  • КП50221
  • КП50222
  • ИСО-8859-1*
  • ИСО-8859-2*
  • ИСО-8859-3*
  • ИСО-8859-4*
  • ИСО-8859-5*
  • ИСО-8859-6*
  • ИСО-8859-7*
  • ИСО-8859-8*
  • ИСО-8859-9*
  • ИСО-8859-10*
  • ИСО-8859-13*
  • ИСО-8859-14*
  • ИСО-8859-15*
  • ИСО-8859-16*
  • байт2бе
  • байт2ле
  • байт4бе
  • байт4ле
  • БАЗЕ64
  • HTML-ENTITIES (псевдоним: HTML)
  • 7 бит
  • 8 бит
  • ЕС-CN*
  • СР936
  • ГБ18030
  • Гц
  • EUC-TW*
  • СР950
  • БИГ-5*
  • ЕСК-КР*
  • UHC (псевдоним: CP949)
  • ИСО-2022-КР
  • Windows-1251 (псевдоним: CP1251)
  • Windows-1252 (псевдоним: CP1252)
  • CP866 (псевдоним: IBM866)
  • КОИ8-Р*
  • КОИ8-У*
  • ArmSCII-8 (псевдоним: ArmSCII8)

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

Любая запись php.ini , которая принимает имя кодировки можно также использовать значения » авто » и « пропуск «. mbstring функций, которые принимают кодировку Имя также может использовать значение « auto «.

Если установлено « pass «, без символа выполняется преобразование кодировки.

Если установлено « auto », оно расширяется до список кодировок, определенных для NLS. Например, если для NLS установлено значение , японский , предполагается, что значение « ASCII,JIS,UTF-8,EUC-JP,SJIS «.

См. также mb_detect_order()

добавить примечание

Пользовательские заметки 3 заметки

вверх

вниз

10

akniep at rayo dot info

10 лет назад

Используйте mb_list_encodings(), чтобы проверить, поддерживается ли кодировка mbstring, прежде чем использовать для нее ее функции.

вверх

вниз

4

Tomolimo (olivier dot moron at raynet-it dot com)

9 лет назад

Помимо этого списка, также поддерживается кодировка GB2312.
Это китайская упрощенная кодировка, которая теперь заменена кодировкой GB18030, но GB2312 отсутствует в списке.
Если вы попробуете это сделать, результат будет хорошим, даже если его нет в списке.
С уважением,
Томолимо

вверх

вниз

3

Аноним

8 лет назад

Также поддерживается CP850 (DOS-Latin-1).

добавить примечание

ionCube PHP Encoder 12 — PHP Encoder, защита, установщик и инструменты повышения производительности от ionCube

ionCube PHP Encoder 12. 0 — это ведущее в отрасли решение для защиты PHP-скриптов, обеспечивающее быструю, простую и эффективную защиту вашего исходного кода.

Кодировщик ionCube преобразует исходный код PHP в байт-код, который можно запутать и зашифровать для дополнительной безопасности. а наша уникальная функция «Динамические ключи» использует алгоритмические ключи, которые не сохраняются, обеспечивая дополнительный уровень безопасности для ваших закодированные PHP-скрипты.

Редакции Pro и Cerberus ionCube Encoder включают встроенные функции лицензирования PHP, позволяющие вам лицензировать ваши PHP-скрипты и контролировать, где и как долго их можно использовать.

PHP-кодировщик ionCube доступен для Windows, Linux, FreeBSD и macOS. Все выпуски включают кодировщик командной строки, что упрощает автоматизацию задач кодирования и интеграцию с рабочий процесс разработки. Редакции Windows и macOS также включают графический пользовательский интерфейс, упрощающий для использования кодировщика и доступа к его расширенным функциям без использования командной строки.

Файлы, закодированные ionCube, совместимы с наиболее широко используемыми операционными системами и поддерживают PHP до PHP 8.1. Если вам нужна поддержка для других платформ, просто сообщите нам об этом, и мы будем рады помочь.

Не уверены, какая версия ionCube Encoder вам подходит?

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

Вы владелец веб-сайта? Basic, но рассмотрите вариант Pro или Cerberus
Базовая версия может обеспечить защиту вашего веб-сайта, например, код, связанный с к конфигурации и данным заказчика. Это защищает от доступа со стороны хостинговой компании, администраторов и хакеры. Рассмотрите возможность обновления до выпусков Pro или Cerberus, чтобы ограничить функции лицензирования. где можно использовать ваш код.

Вы разработчик продукта? Pro или Цербер
Редакции Pro и Cerberus предлагают расширенные возможности защиты и лицензирования. для защиты и распространения вашей продукции. Они позволяют вам создавать файлы лицензий, которые контролируют, где и как долго ваши продукты могут использоваться, обеспечивая защиту от несанкционированного использования, а также поддержку пользовательских идеи лицензирования. Возможность истечения срока действия файлов лицензий идеально подходит для выпуска пробных версий ваших продуктов, и в целом, собственные функции лицензирования версий Pro и Cerberus предлагают преимущества по сравнению с PHP. лицензирование.

Вы дизайнер веб-сайтов? Pro или Цербер
Возможности защиты и лицензирования версий Pro и Cerberus помогут вам защитить и делитесь ранними версиями своей работы с клиентами с ограниченной по времени лицензией, чтобы контролировать, как долго ее можно использовать.

Вы корпоративный клиент? Pro или Cerberus + поддержка Standard/Premium
Редакции Pro и Cerberus, а также план поддержки предлагают расширенную защиту и возможности лицензирования, а также доступ к экспертной поддержке для защиты вашего кода. По сравнению с базовой версией возможности лицензирования позволяют ограничить доступ к файлам авторизованными машинами. а также контролировать, как долго они могут быть использованы.

Используете непрерывную интеграцию? Версия Pro и Cerberus CI
Версия CI предназначена для пользователей, которые кодируют как часть конвейера CI, и предлагает гибкие временные машины. лицензии. Функции управления лицензиями, такие как активация и деактивация лицензии по запросу. позволяют вам легко управлять своими лицензиями, а автоматические ежедневные выпуски лицензий гарантируют, что вы всегда можете получить доступ к нужные вам лицензии. В комплект входят два слота для лицензий с возможностью докупить дополнительные, поэтому вы можете легко масштабировать по мере необходимости.

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

Для получения более подробной информации, включая информацию о ценах, посетите нашу страницу сравнения продуктов.

С помощью ionCube Encoder вы можете…

  • Защищать PHP-скрипты с помощью скомпилированного байт-кода для лучшей производительности и защиты.
  • Используйте дополнительные ключи шифрования, которые не сохраняются, а генерируются только при необходимости (динамические ключи). Наша уникальная функция обеспечивает значительно повышенную защиту по сравнению с альтернативами, которые хранят ключ дешифрования в защищенном файле или вообще не предлагают шифрование.
  • Создавать закодированные файлы PHP для работы на PHP 8.1 и более ранних версиях.
  • Используйте функции языка PHP до версии PHP 8.1.
  • Шифрование файлов, отличных от PHP, таких как XML и шаблоны.
  • Создать файлы лицензий для ограничения доступа к закодированным файлам (версии Pro/Cerberus).
  • Включить одностороннее преобразование (обфускацию) переменных и имен функций, методов и классов.
  • Кодировать PHP-скрипты оболочки.