Кодировка - в конец запутался Кодировка - в конец запутался
 

News:

cpg1.5.48 Security release - upgrade mandatory!
The Coppermine development team is releasing a security update for Coppermine in order to counter a recently discovered vulnerability. It is important that all users who run version cpg1.5.46 or older update to this latest version as soon as possible.
[more]

Main Menu

Кодировка - в конец запутался

Started by bubastic, April 13, 2008, 07:53:50 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

bubastic

CPG 1.14.16

Версия сервера: 5.0.51
MySQL-кодировка: UTF-8 Unicode (utf8)
Сопоставление соединения с MySQL: UTF8_unicode_ci
Базы данных: (CPG) utf8_general_ci

Сравнение: (когда выбираем БД, напротив назв. табл.)  cp1251_general_ci

в PHPMyAdmin / таблицы (albums) / обзор  -  абракодабра

В самом альбоме почти все отлично,
кодировка в броузере Auto-select / Unicode (UTF-8)
"ш" показывается,
во View Source на всех страницах - русский нормально
кроме:
[URL=http://radikal.ru/F/i024.radikal.ru/0804/1c/e8f3b3100c57.gif.html][IMG]http://i024.radikal.ru/0804/1c/e8f3b3100c57t.jpg[/img][/URL]

и во View Source этой страницы - русский аброкадабра, кроме
$bbcode_data .= '<tr><td>BB-code: [b]Картинка в тексте[/b][url][img][/url]</td></tr>';
$bbcode_data .= '<tr><td><INPUT class="incode" readonly="readonly" onclick="f2(this);" ondblclick=\'copy_clip("'.$name_url.'")\' value='.$img_url.'>

bubastic


Makc666

#2
Прочитайте данную тему Кодировка в MySQL 4.1.* и MySQL 5.* повнимательнее...

Также не ясно, зачем у Вас "Сравнение: (когда выбираем БД, напротив назв. табл.)  cp1251_general_ci". 

bubastic

Вот этого я не знаю, как создалось, так создалось

Спасибо за линк, сейчас посмотрю, но перед тем как писать в этот пост проглядел посты и ФАКи и не нашел однозначных ответов, сплошная каша и мешанина.

Так-же сегодня проводил эксперемент две базы у хостера и на локале под денвером, одинаковые настройки
в одной Ш пишет, а в другой нет.
Копирую из той которая не пишет в ту которая пишет, Ш заменяется квадратом. Вручную преребиваю имя альбома и все ОК.
Делаю то=же на локале под Дневером фиг там, как был квадрат, так и остался :-(

SHOW VARIABLES LIKE 'character%
Variable_name  Value 
character_set_client utf8
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8

Для обоих баз.
Базы не конвертированные, а ставились нуля :-(



Makc666

#4
Вы не все переменные привели.
Не хватает:
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server utf8_general_ci


Попробуйте так.

Удалите базу галереи.

Создайте новую базу СРАЗУ с сравнением utf8_general_ci

Выполните для данной базы запрос:
SHOW VARIABLES LIKE 'character%

Переменные должны выглядеть вот так:
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
character_sets_dir /usr/local/share/mysql/charsets/
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server utf8_general_ci


Уже после этого устанавливайте галерею в эту созданную вручную базу...

bubastic

#5
Сколько раз я уж так делал......
Да, что-же за ботва такая, остальные скрипты нормальн себя ведут, а CPG всю кровушку испил  ;D

Не выберая базы
character_set_client utf8   
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8

Выбрав БД CPG
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8


bubastic

#6
1. Удалил 
2. Создал со сравнением utf8_general_ci

SHOW VARIABLES для базы

character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server cp1251_general_ci

bubastic

#7
Изыскания: 

Для Денвера правим my.cnf
default-character-set = utf8 (было cp1251)
default-character-set = utf8 (было cp1251)
init-connect = "set names utf8" (было cp1251)

Решило проблему, т.е. получил:
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

В имеющейся базе полный хаос
При перебивке имени альбома, отображается везде (CPG/phpMyAdmin) по русски нормально
Ш отображается нормально

Теперь то, чего я не понял и внимание вопрос
1. при описаном случае используя charsetmgr.php, что во что конвертить, т.к. при всех вариантах кракозябры.
2. у хостера мне некто не разрешит изгалятся, что делать?
3. что делать с остальными базами, ведь весь мир не только CPG, т.е. я к тому что это не вариант
4. как создать/конвертировать базу в UTF8 имея доступ лишь phpMyAdmin

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


В phpMyAdmin при добавлении

Makc666

#8
Quote from: bubastic on April 14, 2008, 08:21:16 PM
1. Удалил
2. Создал со сравнением utf8_general_ci 

SHOW VARIABLES для базы 

character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server cp1251_general_ci

Прочитайте тему Кодировка в MySQL 4.1.* и MySQL 5.* ЕЩЁ РАЗ повнимательнее!!!

Особенно второе сообщение:
http://forum.coppermine-gallery.net/index.php/topic,49624.msg238431.html#msg238431

Там есть ответ на данное ваше сообщение выше...

Quote from: bubastic on April 14, 2008, 09:20:40 PM
Изыскания:

Для Денвера правим my.cnf
default-character-set = utf8 (было cp1251)
default-character-set = utf8 (было cp1251)
init-connect = "set names utf8" (было cp1251)

Решило проблему, т.е. получил:
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

После этого Вам нужно:


  • Удалите базу галереи
  • Создайте новую базу СРАЗУ с сравнением utf8_general_ci
  • Уже после этого устанавливайте галерею в эту созданную вручную базу

Quote from: bubastic on April 14, 2008, 09:20:40 PM
В имеющейся базе полный хаос
При перебивке имени альбома, отображается везде (CPG/phpMyAdmin) по русски нормально
Ш отображается нормально
А что Вы хотели, чтобы там наступил порядок? :)
До ваших изменений в my.cnf как раз был полный хаос с записью в базу данных.
А вот теперь они пишутся правильно, но т.к. ваша база данных уже была создана с кодировкой cp1251, Вам нужно её удалить и пересоздать заново, как описано выше, - это наилучший вариант для Вас, т.к. я понимаю, что галерея у Вас свежая.

Quote from: bubastic on April 14, 2008, 09:20:40 PM
Теперь то, чего я не понял и внимание вопрос
1. при описаном случае используя charsetmgr.php, что во что конвертить, т.к. при всех вариантах кракозябры.
2. у хостера мне некто не разрешит изгалятся, что делать?
3. что делать с остальными базами, ведь весь мир не только CPG, т.е. я к тому что это не вариант
4. как создать/конвертировать базу в UTF8 имея доступ лишь phpMyAdmin

Извините за занудство, но просто хочется для себя, а может и для других все разложить по полочкам
1. charsetmgr.php Вам в исходном варианте тут никак не поможет.

2. Читайте ответ в первом абзаце данного поста, а точнее ответ по ссылке:
http://forum.coppermine-gallery.net/index.php/topic,49624.msg238431.html#msg238431

3. Не совсем понятно, где делать? У хостера или там, где Вы меняли, my.cnf.
У хостера ничего видно не делать. Там где меняли my.cnf - тут без деталей я Вам не буду "городить" ответ, т.к. он может Вас ещё сильнее запутать. Только учтите, что если Вы изменили my.cnf и при этом не конвертировали базы, то у Вас сейчас старая часть базы в одной кодировке, а новая часть пишется в другой кодировке - потом может быть очень плохо из-за этого.

4. Если честно, то никак. Нужно сливать базу через phpMyAdmin. Заливать на сервер с шелом. "Конвертировать" (преобразовавывать) через командную строку на сервере, где есть доступ к шелу (это наилучший вариант). И потом заливать в "правильную" базу через phpMyAdmin обратно.

Quote from: bubastic on April 14, 2008, 09:20:40 PM
В phpMyAdmin при добавлении
Что то Вы видно тут недописали :)

bubastic

#9
Подвожу итог того, что я понял.

Для новой базы
Если есть возможность править у хостера
Quotecd /usr/ports/databases/mysql50-server/
make WITH_CHARSET=utf8 WITH_COLLATION=utf8_general_ci
make install

Если база раскорячена, т.е. "Переменная character_set_database не совпадает с другими переменными character_set_*,"
тогда нужно применять "патч" для файла
../include/functions.inc.php

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

Так?

Не понял Вашей фразы:
QuoteИЛИ
вы конвертируете все таблицы и возможно данные в кодировку UTF (но это зависит от того, находятся ли данные уже в UTF или нет).
Второй метод самый лучший, но в нём от вас требуется, чтобы вы знали, в какой кодировке хранятся данные, а затем вы выполнили конвертацию с изменением или без изменения данных.

4. Если честно, то никак. Нужно сливать базу через phpMyAdmin. Заливать на сервер с шелом. "Конвертировать" (преобразовавывать) через командную строку на сервере, где есть доступ к шелу (это наилучший вариант). И потом заливать в "правильную" базу через phpMyAdmin обратно.

Можно поподробней?

Makc666

#10
Quote from: bubastic on April 15, 2008, 08:13:19 AM
Подвожу итог того, что я понял.
 
Для новой базы
Если есть возможность править у хостера
Если база раскорячена, т.е. "Переменная character_set_database не совпадает с другими переменными character_set_*,"
тогда нужно применять "патч" для файла
../include/functions.inc.php

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

Так?
Нет, не так.
Вам нужно почитать в документации к MySQL разницу между 4.0 и 4.1.
http://dev.mysql.com/doc/refman/4.1/en/charset-upgrading.html
QuoteIt is important to note that the "MySQL 4.0 character set" contains both character set and collation information in one single entity. Beginning in MySQL 4.1, character sets and collations are separate entities. Though each collation corresponds to a particular character set, the two are not bundled together.
+
MySQL 5.0 Reference Manual :: 9 Internationalization and Localization :: 9.1 Character Set Support
http://dev.mysql.com/doc/refman/5.0/en/charset.html

Мне очень трудно это Вам объяснить своими словами, т.к. я боюсь, что Вы меня не поймете.
Если подключение происходит с одной кодировкой, а база данных в другой кодировке, то скрипт должен говорить базе данных, что он записывает данных в базу в той самой другой кодировке.
По умолчанию, галерея производит запись в базу данных, грубо говоря, в кодировке подключения.
Применяя патч, мы заставляем галерею производить запись в базу данных в нужной нам кодировке.

Quote from: bubastic on April 15, 2008, 08:13:19 AMНе понял Вашей фразы:
Quote4. Если честно, то никак. Нужно сливать базу через phpMyAdmin. Заливать на сервер с шелом. "Конвертировать" (преобразовавывать) через командную строку на сервере, где есть доступ к шелу (это наилучший вариант). И потом заливать в "правильную" базу через phpMyAdmin обратно.

Можно поподробней?
Т.к. кодировки были напутаны, то порядок такой:

1. Вы делаете обычный экспорт (т.е. ничего не меняя в его настройках) через phpMyAdmin в формате SQL (original.sql)
2. Заливает файл на хост с шелом
3. Выполняете команды
================================================
(с) Makc666

В первом окне консоли:

mysql -u root -p

DROP DATABASE `test1`;
DROP DATABASE `test2`;

CREATE DATABASE `test1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `test2` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;

use test2;

set names utf8; source /dumps/original.sql;

Во втором окне консоли:

mysqldump -u root -p --create-options --compatible=mysql40 --default-character-set=cp1251 test2 > /dumps/dump.sql

В первом окне консоли:

use test1;

set names cp1251; source /dumps/dump.sql;

Во втором окне консоли:

mysqldump -u root -p --create-options --default-character-set=cp1251 test1 > /dumps/newbase.sql

(с) Makc666
================================================
4. Получаете файл newbase.sql, который можно заливать куда угодно через phpMyAdmin.
Только нужно помнить, что базу нужно создать заранее с нужным сопоставлением.

P.S.
Всё выше перечисленно выполняется при условии:
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

bubastic

#11
QuoteЕсли подключение происходит с одной кодировкой, а база данных в другой кодировке, то скрипт должен говорить базе данных, что он записывает данных в базу в той самой другой кодировке.

Из примера ниже:
character_set_client utf8
character_set_connection utf8  - подключение
character_set_database cp1251  - база данных
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8

"скрипт должен говорить базе данных, что он записывает данных в базу в той самой другой (dbcharset) кодировке"
if ($CONFIG['dbcharset']) {
   mysql_query("SET NAMES '$CONFIG[dbcharset]'",$result);
  }

$CONFIG['dbcharset'] = "cp1251";


Теперь праильно?

т.е. БД UTF8, но хранит данные в cp1251?

Makc666

#12
Quote from: bubastic on April 15, 2008, 11:57:46 AM
Из примера ниже: 
character_set_client utf8
character_set_connection utf8  - подключение
character_set_database cp1251  - база данных
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8

"скрипт должен говорить базе данных, что он записывает данных в базу в той самой другой (dbcharset) кодировке"
if ($CONFIG['dbcharset']) {
   mysql_query("SET NAMES '$CONFIG[dbcharset]'",$result);
  }

$CONFIG['dbcharset'] = "cp1251";


Теперь праильно?
Если ставить с нуля, перед этим создав новую базу со сравнением cp1251_general_ci, то правильно.
Если не с нуля, то нужно сначала конвертировать базу, как я писал выше.

Quote from: bubastic on April 15, 2008, 11:57:46 AMт.е. БД UTF8, но хранит данные в cp1251?
Я не совсем понимаю Ваш вопрос.
База данных хранится в cp1251 и подключение будет производиться по cp1251.
А UTF8 - это "кодировка" MySQL сервера по умолчанию.

bubastic

#13
Не фига, не Ваша правда

Далее не вопрос, а констатация фактов, а возможно и руководство к действию

Все по порядку SbS

Show Variable
character_set_client utf8
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
collation_connection utf8_general_ci
collation_database cp1251_general_ci
collation_server cp1251_general_ci

Создаю базу со сравнением UTF8_general_ci
отработался запрос CREATE DATABASE `coper` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Show Variable для "coper"
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server cp1251_general_ci

Добавляю в галерее русскими буквами альбом/названия файлов

В phpMyAdmin кракозабры, в галерее Ш показывает

патчу functions.inc.php

Поставил $CONFIG['dbcharset'] = "cp1251";
В галерее все по прежнему, Ш показывает, В phpMyAdmin кракозабры,
после пребивки русских слов без изменений

Поставил $CONFIG['dbcharset'] = "UTF8";
В галерее кракозябры "Шапочка ", в phpMyAdmin кракозабры,
Добавляю русский альбом/название файла - новое показывется правильно, в phpMyAdmin тоже ОК,
Перебиваю кракозабровое название первого альбома/файла - все Ок и в галерее и в phpMyAdmin

P.S. Перебивка аналогична конвертации

Makc666

#14
Quote from: bubastic on April 15, 2008, 11:13:30 PM
Не фига, не Ваша правда
Фига, не фига - это все от воспитания зависит.
Если вы нервничаете и злитесь, то обычно в такие моменты помогает прогулка по окрестности.

Quote from: bubastic on April 15, 2008, 11:13:30 PM
Далее не вопрос, а констатация фактов, а возможно и руководство к действию

Все по порядку SbS

Show Variable
character_set_client utf8   
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
collation_connection utf8_general_ci
collation_database cp1251_general_ci
collation_server cp1251_general_ci
Для ситуации выше нужна:
$CONFIG['dbcharset'] = "cp1251";

Quote from: bubastic on April 15, 2008, 11:13:30 PM
Создаю базу со сравнением UTF8_general_ci
отработался запрос CREATE DATABASE `coper` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Show Variable для "coper"
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server cp1251_general_ci
Для данной ситуации выше нужна:
$CONFIG['dbcharset'] = "utf8";

Quote from: bubastic on April 15, 2008, 11:13:30 PM
Добавляю в галерее русскими буквами альбом/названия файлов

В phpMyAdmin кракозабры, в галерее Ш показывает

патчу functions.inc.php

Поставил $CONFIG['dbcharset'] = "cp1251";
В галерее все по прежнему, Ш показывает, В phpMyAdmin кракозабры,
после пребивки русских слов без изменений
И правильно, что не будет работать.

Вы что не видите, что во втором случае у Вас переменная:
character_set_database utf8
вообще-то utf8 равна, а не cp1251.

В вашем сообщении, как и во всей теме:
Quote from: bubastic on April 14, 2008, 06:54:53 PM
...
character_set_database cp1251
...
речь вообще-то идёт о cp1251, а не о UTF8

Quote from: bubastic on April 15, 2008, 11:13:30 PM
Поставил $CONFIG['dbcharset'] = "UTF8";
В галерее кракозябры "Шапочка ", в phpMyAdmin кракозабры,
Добавляю русский альбом/название файла - новое показывется правильно, в phpMyAdmin тоже ОК,
Перебиваю кракозабровое название первого альбома/файла - все Ок и в галерее и в phpMyAdmin
И правильно кракозябры, потому что база у вас до этого писалась неправильно, если Вы всё точно описали.

Quote from: bubastic on April 15, 2008, 11:13:30 PM
P.S. Перебивка аналогична конвертации
Если Вы говорите о ручной перебивке, то конечно, Вы можете перебивать все поля столько, сколько вашей душе угодно.

bubastic

#15
QuoteФига, не фига - это все от воспитания зависит.
Если вы нервничаете и злитесь, то обычно в такие моменты помогает прогулка по окрестности.

С чего Вы взяли, что я нервничаю, я просто описал процес поиска и решения моей проблемы, а вдруг кому сгодится.
А Вам в любом случае респект за правильные мысли и советы. Токась, Вы как-то объясняете, что простое в сложное превращается  ;D
 

LeaX

#16
Читала-читала. Чувствую - мозги уже дымятся  :o

У меня картина еще разнообразнее чем здесь - аж 3 кодировка
Quotecharacter_set_client     utf8
character_set_connection    utf8
character_set_database    latin1
character_set_filesystem    binary
character_set_results    utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir    /usr/share/mysql/charsets/
collation_connection    utf8_unicode_ci
collation_database    latin1_swedish_ci
collation_server    latin1_swedish_ci

Почему три? Ведь здесь укзаны две? Да потому, что вообще-то я переношу готовую галерею, которая у меня выводится на прежнем месте в win-1521, база у нее в utf8 (я и экспортировала из старой базы ее в utf8 и открывается в новой базе она в utf8)

Старая pma у меня 2.11.9.1 (сервер 4.1.22-log), а новая 2.11.3 (5.0.37-standard)
На старом месте у меня кстати тоже была MySQL-кодировка:  UTF-8 Unicode (utf8)
А Сопоставление соединения с MySQL: utf-8_unicode_ci
При этом сравнение в таблицах - cp1251_general_ci

У меня такой вопрос - верно ли будет в этом случае применить вот этот способ
http://forum.coppermine-gallery.net/index.php/topic,49624.msg238431.html#msg238431

И почему когда я вставляю в functions.inc.php этот код

Quotediff -crbBN include/functions.inc.php include/functions.inc.php
*** include/functions.inc.php   Tue Nov  6 07:48:00 2007
--- include/functions.inc.php   Wed Jan  9 12:44:29 2008
***************
*** 184,189 ****
--- 184,192 ----
          }
          if (!mysql_select_db($CONFIG['dbname']))
                  return false;
+                 if ($CONFIG['dbcharset']) {
+                   mysql_query("SET NAMES '$CONFIG[dbcharset]'",$result);
+                 }
          return $result;
  }

У меня вылазит вот такая ошибка
QuoteParse error: syntax error, unexpected T_INCLUDE in /home/admin/domains/lostjate.lgg.ru/public_html/gallery/include/functions.inc.php on line 3037

LeaX

Откуда у меня эта кодировка latin1 взялась вообще не пойму. На старом месте cp1251  :P

LeaX

Даа, вот что на старом месте... откуда эти латины взялись? Экпортировала базу в utf8
Quotecharacter_set_client     utf8
character_set_connection    utf8
character_set_database    cp1251
character_set_results    utf8
character_set_server    cp1251
character_set_system    utf8
character_sets_dir    /usr/local/share/mysql/charsets/
collation_connection    utf8_unicode_ci
collation_database    cp1251_general_ci
collation_server    cp1251_general_ci

LeaX

М-даа, проверила - это у меня оказывается на новом сервере такая вот ерунда.
На старом была cp1251, а на новом этот латин
??? не пойму что мне делать. Латин мне не нужен, потому что это же выходит не русская кодировка?  ???
А мне нужна русская. Хоть какая-нибудь