Задавайте вопросы, мы ответим
Вы не зашли.
есть БД:
запрос 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 поиск русских символов регистроЗАВИСИМ, когда по ВТОРОМУ ВАРИАНТУ поиск регистроНЕзависим.
огромное спасибо за ранее!!!
Отредактированно DRUG_ADDICT (10.01.2010 06:33:33)
Неактивен
вот есть идея:
рас браузер по ПЕРВОМУ ВАРИАНТУ всё отображается нормально, то наверно есть и способ всё оттуда вытащить в таком виде который мы наблюдаем на странице (ПЕРВЫЙ ВАРИАНТ), а затем уже нормально перелапатить БД в UTF-8 - т.к. русские символы UTF-8 в среде cp1251 будут отображаться как символы + русские буквы, сейчас же мы видим символы + латинские буквы - это на лицо неверная кодировка, как вот её вернуть в нормальное состояние не понятно.
понятно что точно не так:
*символы + латинские буквы (utf8) > конвертирование > символы + русские буквы (utf8)*
тут наверно скорее как я писал вышет так будет:
*символы + латинские буквы (utf8) > конвертирование > cp1251*
-- но вот КАК?!
Неактивен
не смог прочитать весь пост, но может set charchter_set = cp1251 тебе поможет! посмотри точный синтаксис, а то я че-т подзабыл...
Неактивен
kiligin написал:
не смог прочитать весь пост,
смешно стало? мне тоже смешно
kiligin написал:
но может set charchter_set = cp1251 тебе поможет! посмотри точный синтаксис, а то я че-т подзабыл...
установили переменные:
set character_set_client = cp1251;
set character_set_connection = cp1251;
set character_set_database = cp1251;
set character_set_results = cp1251;
set character_set_server = cp1251;
set collation_connection = cp1251_general_ci;
set collation_database = cp1251_general_ci;
set collation_server = cp1251_general_ci;
всё тоже самое, нет русского текста.
Неактивен
не смог, потому что не спал сутки... писал записку к диплому.
по крайней мере в моем приложении с использованием ado+odbc при добавлении в бд русских сиволов, в самой бд хранится чёрти-что. а вот при выводе из бд в приложение все ожидаемо. odbc и mysql настроены на испоьзование cp1251.
Раннее в бд вводились русские символы в формате latin1. Сейчас они отображаются также ожидаемо.
Следовательно:
- попробуй саму бд настроить на нужный шрифт (create database namedb ... default caheacter_set = cp1251 [или это к таблицам применяется, точно не помню]);
- попробуй настроить коннектор к бд на использование той же кодировки.
у меня пока все мысли по этому поводу.
Неактивен
Видимо, php у Вас при подключении ставит свою кодировку. SET NAMES делать
всегда правильно и всегда нужно. Просто потому что php верить нельзя
Неактивен
paulus написал:
Видимо, php у Вас при подключении ставит свою кодировку. SET NAMES делать
всегда правильно и всегда нужно. Просто потому что php верить нельзя
так... а как узнать какую? хммм... phpinfo(); ?
вот что есть:
Accept-Charset windows-1251,utf-8;q=0.7,*;q=0.7 SQLite Encoding UTF-8 _SERVER["HTTP_ACCEPT_CHARSET"] windows-1251,utf-8;q=0.7,*;q=0.7 HTTP_ACCEPT_CHARSET windows-1251,utf-8;q=0.7,*;q=0.7
или не так? и почему то на двух разных машинах получается php "врет" одинаково, на одной фряха, на другой suse linux... всё по дефолту, вроде... на suse точно по дефолту...
а вот пример бд:
/*!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 */; 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 ; INSERT INTO `text` (`ID`, `text`) VALUES (1, 'ПÐ*Ивет'), (2, 'привет'), (3, 'Привет');
вот INSERT INTO по русски...
1 Привет
2 привет
3 ПРИвет
и вот такая бд получается когда просто без set names записываешь в бд:
mysql_query("INSERT INTO `database`.`table` (`text`) VALUES ('Привет');");
< при этом файл сам в utf8 (ещё рас пишу), вот ч за фигня
блин, перечитал уже весь Список доступных статей: Базы данных вот это особенно My SQL 4.1 и любые проблемы с русскими буквами
делал как написано:
Тестирование:
Попробуйте в phpMyAdmin-е выполнить запрос вида «SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица», где таблица и поле соответствующая таблица и поле с русским текстом, а кодировка — кодировка из проблемы №1.
Результат тестирования:
Если буквы (но необязательно слова) стали русскими, значит текст в базе лежал не в правильной кодировке и его нужно сконвертировать.
Если буквы стали русскими, а слова нет («бнопня»), значит неверно выбрана одна из русских кодировок – пробуйте другие, пока не получится русских слов.
были русские буквы + символы, но далее написано что нужно ПРАВИЛЬНО сконвертировать, но как ( вот читал 9.1.12. Column Character Set Conversion не помогло! все команды перепробовал!
когда я записываю в файл эти данные (смотрим пример данных в бд INSERT INTO ...) в файл записывается нормальный русский текст, может какой то бекап скрипт написать уже чтоле пццц ((
Неактивен
А наши статьи читали? Или только сторонние?
1. Найдите нормальный клиент. Например, консоль. Убедитесь, что эта
консоль нормально настроена в кодировке, которую Вы знаете. Например,
можно явно проверить, что моя консоль настроена, показывает русские
буквы и работает в utf8:
aquatica:~$ LANG=ru_RU.UTF-8 date Пнд Янв 11 14:20:40 MSK 2010
2. В этом клиенте подключитесь к серверу и выполните явно установку
клиентской кодировки: SET NAMES utf8.
3. После этого проверьте, в какой кодировке лежат данные. Если данные
написаны кракозяблами — их надо преобразовывать (см статью, например).
4. Если данные написаны по-русски, то ничего преобразовывать не надо,
надо менять существующие приложения так, чтобы они корректно работали
с текущими данными.
Неактивен
paulus написал:
А наши статьи читали? Или только сторонние?
ща буду сатреть, но в начале:
paulus написал:
1. Найдите нормальный клиент. Например, консоль. Убедитесь, что эта
консоль нормально настроена в кодировке, которую Вы знаете. Например,
можно явно проверить, что моя консоль настроена, показывает русские
буквы и работает в utf8:
есть, putty по SSH
выполняю:
ssh:~ # locale
LANG=POSIX
LC_CTYPE=ru_RU.UTF-8
...
ssh:~ # LANG=ru_RU.UTF-8 date
Пнд Янв 11 20:20:34 IRKT 2010
ssh:~ # mysql -u root -h localhost -p
Enter password: *********
paulus написал:
2. В этом клиенте подключитесь к серверу и выполните явно установку
клиентской кодировки: SET NAMES utf8.
есть сэр!
mysql> USE database;
Database changed
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM text;
+----+----------------------------+
| ID | text |
+----+----------------------------+
| 26 | ПРИвет |
| 25 | привет |
| 24 | Привет |
+----+----------------------------+
3 rows in set (0.00 sec)
(( а вот когда делаю без SET names utf8;
mysql> USE database;
Database changed
mysql> SELECT * FROM text;
+----+--------------+
| ID | text |
+----+--------------+
| 26 | ПРИвет |
| 25 | привет |
| 24 | Привет |
+----+--------------+
3 rows in set (0.00 sec)
во как получается!
paulus написал:
4. Если данные написаны по-русски, то ничего преобразовывать не надо,
надо менять существующие приложения так, чтобы они корректно работали
с текущими данными.
вот я и пишу, что ет то что у меня в бд не utf8 (+ см. рис.) - это не понятно что! но это "не понятно что" вылазит на страницу в браузере (и в SSH как видели) абсолютно адекватно, и нормально все отображаться... поиск естественно по такому регистроЗАВИСИМ и ещё есть много минусов и вообще так не надо... надо перекодировать, только вот снова вопрос: как это сделать и что на что кодировать... ((
ну чтож... буду смотреть статьи, начну с той что Вы мне посоветовали http://sqlinfo.ru/articles/info/5.html
Неактивен
Ну вот если не делать SET NAMES, то там будет написана кодировка, в которой
реально лежат данные. Остается только перекодировать
Неактивен
paulus написал:
Ну вот если не делать SET NAMES, то там будет написана кодировка, в которой
реально лежат данные. Остается только перекодировать
вау ))))))) АБАЛДЕТЬ!
сделал:
mysql> show variables;
... | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | | collation_connection | latin1_swedish_ci | | collation_database | utf8_general_ci | | collation_server | latin1_swedish_ci ...
блин... вот только слышал я что с кодировки latin1 русский текст не када не получится перекодировать... хотя ет наверно не так или... хм
буду пробовать!!!
ОГРОМНОЕ ВАМ СПАСИБО!!!
Неактивен
Никогда — это неправда, в статье написано, как это сделать
Неактивен
вы конечно извиняйте меня, но не могу я понять как мне экспортировать бд... эххх... выяснили мы что там вся кириллица хранится у меня в latin1 (?при этом выводится корректно в консоли с кодировкой utf8?) на сколько мне известно в >mysqldamp нельзя указывать кодировку, ну вот я пишу:
ssh:~ #>mysqldump -u root -p -h localhost utf > /home/user/dump.sql
получаю файл с этими крокозябрами.
то есть по статье я должен получить резервную копию уже с русскими буквами... но такого не происходит...
rssh:~ #>recode utf8..latin1 /home/user/dump.sql
и это не приносит результатов, вижу все те же каракули только чуть другого вида... тоже самое и с iconv
пробовал так же latin1..utf8
...
Неактивен
как в
mysql> копировать бд я без понятия, в инете не нашел такого, кажется нельзя вообще... а именно там latin1 по умолчанию стоит, может оттуда бы и экспортировал нормально бд, а с
ssh:~ #>mysqldump видать в utf8 всё записывает в файл dump.sql... и показывает так же как и в
mysql> после set names utf8
mysql> SET NAMES koi8r; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM text; +----+--------------+ | ID | text | +----+--------------+ | 26 | ???▒???▒???? | | 25 | ???????▒???? | | 24 | ???????▒???? | +----+--------------+ 3 rows in set (0.00 sec) mysql> SET NAMES utf8; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM text; +----+----------------------------+ | ID | text | +----+----------------------------+ | 26 | ПРИвет | | 25 | привет | | 24 | Привет | +----+----------------------------+ 3 rows in set (0.00 sec) mysql> SET NAMES cp1251; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM text; +----+--------------+ | ID | text | +----+--------------+ | 26 | ???▒?????▒?▒ | | 25 | ?????????▒?▒ | | 24 | ?????????▒?▒ | +----+--------------+ 3 rows in set (0.00 sec) mysql> SET NAMES latin1; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM text; +----+--------------+ | ID | text | +----+--------------+ | 26 | ПРИвет | | 25 | привет | | 24 | Привет | +----+--------------+ 3 rows in set (0.00 sec)
Отредактированно DRUG_ADDICT (12.01.2010 16:37:59)
Неактивен
Ненене; у Вас сами данные в utf8, а метаданные таблички говорят, что она в
latin1, и соединение в latin1.
mysqldump --default-character-set=latin1 -B dbname | sed 's/latin1/utf8/' >dump.sql
Получится дамп в utf8 (должен легко читаться в консоли utf8 по-русски), который
потом можно будет залить назад
Неактивен
paulus написал:
Ненене; у Вас сами данные в utf8, а метаданные таблички говорят, что она в
latin1, и соединение в latin1.
mysqldump --default-character-set=latin1 -B dbname | sed 's/latin1/utf8/' >dump.sql
Получится дамп в utf8 (должен легко читаться в консоли utf8 по-русски), который
потом можно будет залить назад
получилось! ЕЩЁ РАС ВАМ СПАСИБО ОГРОМНОЕ!!!
Неактивен