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’е выполнить запрос вида «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-скрипты оболочки.