Нарушилась кодировка в БД MySQL > регистрозависимость поиска по русским символам

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

DRUG_ADDICT
Сообщения: 11
Зарегистрирован: 08 апр 2009, 01:55

есть БД:
запрос show variable; показывает:

Код: Выделить всё

character_set_client = utf8
character_set_connection =  utf8
character_set_database = utf8
character_set_filesystem = binary
character_set_results = utf8
character_set_server = utf8
character_set_system = utf8
collation_connection = utf8_general_ci
collation_database = utf8_general_ci
collation_server = utf8_general_ci
делал в putty (SSH)...
*************************************
ПЕРВЫЙ ВАРИАНТ:
когда выполняю запрос в php (сам php файл в UTF-8):

mysql_query("INSERT INTO `database`.`table` (`text`) VALUES ('Привет');");

в БД записывается это: привет < смотрю через phpMyAdmin.
на странице (сам файл страницы в UTF-8 так же установлен content="text/html; charset=utf-8") вывожу это, вижу нормальный русский текст, тобишь "Привет".


ВТОРОЙ ВАРИАНТ:
делаю "насильно" после соединения с БД:
mysql_query("SET names 'utf8' COLLATE 'utf8_general_ci'");
и выполняю тот же выше приведенный запрос:
mysql_query("INSERT INTO `database`.`table` (`text`) VALUES ('Привет');");

в БД записывается слово "Привет" < смотрю через phpMyAdmin. вывожу это на страницу, вижу нормальный русский текст... в то время как то что я записывал ранее выводится уже как привет

*************************************
объясните мне пожалуйста почему так происходит при ПЕРВОМ ВАРИАНТЕ?
как перекодировать БД если туда всё записано по ПЕРВОМУ ВАРИАНТУ - вернее, объясните сам алгоритм, что на что кодировать?
есть альтернатива перекодированию?

PS. модуль php:
iconv - есть;
php-mbstring - нету, возможности установить - нету;


- для чего это? ответ: по первому варианту в БД с установленной utf8_general_ci поиск русских символов регистроЗАВИСИМ, когда по ВТОРОМУ ВАРИАНТУ поиск регистроНЕзависим.

огромное спасибо за ранее!
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Скорее всего с COLLATE самой базы проблемы, подобный глюк встречался - решение: убить, создать заного, phpmyadmin со всем справится.
[syntax=Delphi] [/syntax]
DRUG_ADDICT
Сообщения: 11
Зарегистрирован: 08 апр 2009, 01:55

Duncon писал(а):Скорее всего с COLLATE самой базы проблемы, подобный глюк встречался - решение: убить, создать заного, phpmyadmin со всем справится.
да, потому что кириллица сохраняется по ПЕРВОМУ ВАРИАНТУ вот в такой символике привет - по этому и регистрозависимо.

убить те поля (или всю БД) что содержат такие вот знаки - не вариант, БД уже этой целый года, туда вся эта кириллица таким образом и записывалась :( раньше было наплевать, а сейчас надо регистроНЕзависимый поиск сделать. эх...

идея: рас браузер по ПЕРВОМУ ВАРИАНТУ всё отображается нормально, то наверно есть и способ всё оттуда вытащить в таком виде который мы наблюдаем на странице (ПЕРВЫЙ ВАРИАНТ), а затем уже нормально перелапатить БД в UTF-8 - т.к. русские символы UTF-8 в среде cp1251 будут отображаться как символы + русские буквы, сейчас же мы видим символы + латинские буквы - это на лицо неверная кодировка, как вот её вернуть в нормальное состояние не понятно.

понятно что точно не так:
*символы + латинские буквы (utf8) > конвертирование > символы + русские буквы (utf8)*

тут наверно скорее как я писал вышет так будет:
*символы + латинские буквы (utf8) > конвертирование > cp1251*
-- но вот КАК?! :(
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Тогда берёшь эту http://sypex.net/encoding/ утилиту сливаешь всё в принудительной кодеровке на комп себе, следом пересоздаёшь (я бы базу №2 создал и с ней пробовал) базу и вгоняешь обратно, следом радуешся результату.
[syntax=Delphi] [/syntax]
DRUG_ADDICT
Сообщения: 11
Зарегистрирован: 08 апр 2009, 01:55

Duncon писал(а):Тогда берёшь эту http://sypex.net/encoding/ утилиту сливаешь всё в принудительной кодеровке на комп себе, следом пересоздаёшь (я бы базу №2 создал и с ней пробовал) базу и вгоняешь обратно, следом радуешся результату.
не помогло =(
хоть как делал уже, соединение устанавливаю utf8 (auto) копирую бд, затем восстанавливаю в cp1251, вижу в бд: ГђВќГ‘Ж’ ГђВЅГђВёГ‘в
устанавливаю соединение cp1251, копирую бд, затем восстанавливаю в cp1251 вижу в бд: ?? ???????‚???µ?» (это ровняется к тому что данные уничтожены вовсе)

все ^_^ тоже самое делаю (как вышет) только при восстановлении насильно использую utf8, результат аналогичен. ну правда что, в последнем, знаков вопросов чуть меньше :D

=((( я в отчаяние...
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Базу пересоздавал в нужной кодировке? (перед импортом обратно)
[syntax=Delphi] [/syntax]
DRUG_ADDICT
Сообщения: 11
Зарегистрирован: 08 апр 2009, 01:55

Duncon писал(а):Базу пересоздавал в нужной кодировке? (перед импортом обратно)
хмммм, тоже самое :(

скопировал бд в auto (utf8)
создал бд в cp1251_general_ci (!сравнение!) залил туда:
в forced->cp1251 - вижу русские буквы с символами (за вместо русского текста);
в forced->utf8 - вижу латинские буквы c символами;

создал бд в utf8_general_ci (!сравнение!) залил туда:
в forced->cp1251 - вижу русские буквы с символами;
в forced->utf8 - вижу латинские буквы с символами;


скопировал бд в cp1251
Кодировка соединения и таблицы не совпадает:
Таблица `text` -> utf8 (соединение cp1251)
создал бд в cp1251_general_ci (!сравнение!) залил туда:
.....
создал бд в utf8_general_ci (!сравнение!) залил туда:
.....
короче перечислять не буду ибо во всех способах (когда копирую бд в define('CHARSET', ' cp1251'); ) было это: ???‹?»?µ?·?°?µ?‚:?’?‹?????»?µ??

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

ps. спасибо что помогаете, я на ~8 форумах по программированию и mysql создал такую тему (одновременно с этой) не кто ещё не ответил кроме вас... эххх, чтож за фигня то =( я могу пример скрипта (php) дать который записывает у меня так в бд (без SET names 'utf8'), как по первому варианту... и пример самой бд с таким текстом, типа привет, правда, может скрипт у вас нормально будет записывать в бд, тогда хотя бы пример самой бд, вот даже щас кину:

Код: Выделить всё

-- phpMyAdmin SQL Dump
-- version 3.2.4
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Янв 10 2010 г., 17:44
-- Версия сервера: 5.0.67
-- Версия PHP: 5.2.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- База данных: `utf`
--

-- --------------------------------------------------------

--
-- Структура таблицы `text`
--

CREATE TABLE IF NOT EXISTS `text` (
  `ID` int(11) NOT NULL auto_increment,
  `text` varchar(255) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ;

--
-- Дамп данных таблицы `text`
--

INSERT INTO `text` (`ID`, `text`) VALUES
(1, 'ПÐ*Ивет'),
(2, 'привет'),
(3, 'Привет');
вот INSERT INTO по русски...
1 Привет
2 привет
3 ПРИвет
попробуйте s Supex Dump, мож у меня что не так :( :(
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Тут немного другой прикол, принудительно приводится к кодировке при экспорте, результат базы ни о чем не говорит. 1251 иногда помогает
mysql_query("SET NAMES `cp1251`"); после коннекта прописать (utf8 это обычно дефолтовый язык работы - не требуется).
Тут варианта 2 дать мне доступ к базе и к ftp или дать мне саму базу если есть прямой доступ к файлам. Кривые бэкапы делу не помогут. Ну или 3 вариант мучаться и думать где косяк.
[syntax=Delphi] [/syntax]
DRUG_ADDICT
Сообщения: 11
Зарегистрирован: 08 апр 2009, 01:55

Duncon писал(а):Тут немного другой прикол, принудительно приводится к кодировке при экспорте, результат базы ни о чем не говорит. 1251 иногда помогает
комментарий в скрипте:
define('CHARSET', 'cp1251');
// Кодировка соединения с MySQL при восстановлении
// На случай переноса со старых версий MySQL (до 4.1), у которых не указана кодировка таблиц в дампе
// При добавлении 'forced->', к примеру 'forced->cp1251', кодировка таблиц при восстановлении будет принудительно заменена на cp1251
// Можно также указывать сравнение нужное к примеру 'cp1251_ukrainian_ci' или 'forced->cp1251_ukrainian_ci'
то есть, имели введу наверное при импорте, ок?
ещё рас для справки: при экспорте в cp1251:
// Кодировка соединения с MySQL
// auto - автоматический выбор (устанавливается кодировка таблицы), cp1251 - windows-1251, и т.п.
define('CHARSET', 'cp1251');
файл БД вешает в 3 раза меньше, а вся кириллица в нём, отображаться как вопросительные знаки.
Duncon писал(а):mysql_query("SET NAMES `cp1251`"); после коннекта прописать (utf8 это обычно дефолтовый язык работы - не требуется).
Тут варианта 2 дать мне доступ к базе и к ftp или дать мне саму базу если есть прямой доступ к файлам. Кривые бэкапы делу не помогут. Ну или 3 вариант мучаться и думать где косяк.
сайт находится в локальной сети и к нему нет доступа из вне - с ftp не получится, в базу могу дать она 140мб вешает, база торрент-трекера :o
хотя я выше привел пример той базы, вернее как там хранится русский текст =( этого должно быть достаточно наверное...
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Хоть гиг мне всёравно, я не могу дистанционно понять где проблема, дальше в приват (с 10 мессаги можно писать будет), заодно сетку укажи может я в ней сижу :) Код трекера тоже в архив.
[syntax=Delphi] [/syntax]
Ответить