Ну ось. Злий кодування latin1 немає і в помині, можна перевіряти наш пологовий будинок)))
І ось той страшний удар граблями, який так довго відтягувався! Уважний читач міг помітити, що коли була зроблена спроба примусово змінити кодування стовпчика, що містить дані в latin1, то на кожну запис, що містить російські літери, у MySQL був Варнінг! Це був крик про те, що сервер не знає, яким чином можна перевести дані з latin1 в cp1251, ну і кращого способу, ніж замінити символом не latin1 питаннячко, він не знайшов :))). Пологовий будинок безповоротно втрачений тому, що тепер замість кирилиці в базі містяться вопросики.
Питаннячко можна було уникнути
Насправді, ситуація, коли спочатку виставлена неправильна кодування, зустрічається часто-густо. Симптоми можна виявити наступним чином:
Саме ці змінні відповідають за дефолтні значення кодувань.
- character_set_client - кодування, в якій дані будуть надходити від клієнта
- character_set_connection - кодування за замовчуванням для всього, що в рамках з'єднання не має кодування
- character_set_database - кодування за замовчуванням для баз
- character_set_filesystem - кодування для роботи з файловою системою (LOAD DATA INFILE, SELECT. INTO OUTFILE, і т.д.)
- character_set_results - кодування, в якій буде обраний результат
- character_set_server - кодування, в якій працює сервер
- character_set_system - кодування, в якій задаються ідентифікатори MySQL, завжди UTF8
- character_sets_dir - папка з кодуваннями
ВАЖЛИВО: Якщо character_sets_dir встановлена невірно, то робота з кодуваннями буде під загрозою. Не намагайтеся змінювати її значення, якщо ви не впевнені в своїх силах. Якщо ви системний адміністратор, то перед установкою краще ознайомитися з мануалом.
Найбільш значимі для простих користувачів такі змінні: character_set_client, character_set_results, character_set_connection. Оскільки саме вони відповідають за внесення, вилучення інформації і створення таблиць / баз відповідно. Якими вони можуть бути?
Будь-яку з цих кодувань можна використовувати на свій смак. Зазвичай російськомовні користувачі вважають за краще cp1251 або utf8, але по суті, неважливо, в якому кодуванні зберігаються дані, важливо, щоб вона була з самого початку правильно вказана і дані були коректно внесені.
Налаштування кодувань
Мануал пропонує нам три варіанти завдання кодувань:
УВАГА. Перші два варіанти працюють тільки в рамках поточного з'єднання. Це означає, що під час наступного підключення всі налаштування повернуться в початковий стан! Щоб не виставляти кодування кожен раз, потрібно скористатися третім варіантом.
Варіант 1 - Через names
Але краще, коли кодування налаштовується прямо в з'єднанні.
Що робити, якщо дані внесені в неправильному кодуванні
Якщо база / таблиця / дані були створені / внесені в кодуванні відмінною від потрібної, то необхідно зробити наступне:
Цей варіант підходить майже для всіх випадків, за винятком деяких особливих ситуацій, наприклад, коли порівняння, виставлене за замовчуванням, недоречно для деяких полів. Приклад - поле для зберігання пароля, необхідно порівнювати його з урахуванням регістру, тоді як за замовчуванням виставляється порівняння без урахування регістру.
Правильний варіант роботи з MySQL
Таким чином, клієнт працює в KOI8-R, але дані зберігаються в cp1251, MySQL знає про це і робить перекодування на льоту.
Ну і на ціпок:
Вибирати дані можна в будь-якому кодуванні, так само, як і вносити, головне - правильно повідомити про це MySQL.