еще раз про win32, MySQL4.1.x и кодировки SET NAMES в связке php4\php5

slach

Новичок
еще раз про win32, MySQL4.1.x и кодировки SET NAMES в связке php4\php5

хух... вот мы тут попробовали с mysq4.x на mysql4.1.x мигрировать
нахватались под win32

1) всегда помните
php_mysql.dll всего лишь враппер для libmysql.dll,СЛЕДИТЕ за тем, какая libmysql.dll лежит у вас c:\windows\system32 и в других каталогах доступных через PATH

2) следите за тем, с каким my*.ini или my*.cnf запускается ваш клиент и сервер
и какие там настройки
default-character-set
и
character-sets-dir

учитывайте, что в php4 php_mysql.dll (до определенных версий. может в 4.3.11 уже поправили) собирается для 4.0.x и 3.23.x libmysql.dll, и пытается выхватить настройки из c:\my.cnf

кроме того, постоянно проскакивает глючок, когда php как клиент при коннекте ищет charset'ы в папке c:\mysql\share\charsets причем в формате .conf а не в новомодном *.xml
и номера чарсетов у php4 mysql3.x\4.x клиента отличаются от номеров которые посылает сервер mysql4.1 при установлении коннекта

поэтому если при запуске mysql.exe от mysql3.x
вы видите ошибки вида

File 'c:\mysql\share\charsets\?.conf' not found (Errcode: 22)
Character set '#51' is not a compiled character set and is not specified in the 'c:\mysql\share\charsets\Index' file

значит у вас одновременно на машине mysql4.0.x\3.23.x и mysql4.1.x и на mysql4.1.x стоит default_character_set не включенный в c:\mysql\share\charsets\Index

рецепт простой
идем в mysql4.1.x\share\charsets\Index.xml
ищем там id="51"
понимаем что это cp1251 родимый
добавляем c:\mysql\share\charsets\Index строку
cp1251 51
проверяем

3) всегда помните, php_mysql.dll собирается по умолчанию как клиент с charset'ом latin1, этот чарсет устанавливается при вызове mysql_connect и вы ничего с этим поделать не можете, кроме вызова SET NAMES ваш_charset, с которым собрана ваша база

4) важно понимать, что установка SET NAMES НИКАК не влияет на default_character_set который используется при СОЗДАНИИ таблиц по CREATE TABLE без указания collation и charset, они берутся из my*.ini директивы default-character-set
чтобы это поправить используйте комбинацию
SET NAMES ваш_чарсет;
SET character_set_database=ваш_чарсет;
SET character_set_server=ваш_чарсет;
в принципе можно прописать эти переменные в my*.ini файл в раздел [client]

5) можно запускать mysqld-nt.exe и т.п. с указанием принудительных настроек через директиву --defaults-file=[путь до вашего my*.ini]

6) инсталяция mysql4.1.x как СЕРВИСА с вашими настройка
mysqld-nt.exe --install mysql417 --defaults-file=C:\\usr\\local\\mysql4.1.7\\my-slach.ini
пользуйте \\ при конвертации mysql время от времени съедает слеши =)


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

жду по всем пунктам комментариев
но ВНЯТНЫХ
 

Oleg Marchuk

Человек
7) Перед обновлением MySQL, сделайте дамп всех баз данных. После обновления востановите их из дампа.
 

slach

Новичок
=)) восстановление из ДАМПА от mysql4.0.x 3.x может не проканать

если только не ставить default-character-set нормальный

плюс к этому тонкости есть с max_allowed_packet
плюс тонкости с сожержимым ПАРОЛЯ, если восстанавливать дамп myisam базы с названием mysql
всякие там old_password в my*.ini писать надо
 

дедушка АУ

Новичок
PHP:
<charset name="cp1251">
  <family>Cyrillic</family>
  <description>Windows Cyrillic</description>
  <alias>windows-1251</alias>
  <alias>ms-cyr</alias>
  <alias>ms-cyrillic</alias>
  <collation name="cp1251_bulgarian_ci"	id="14">
    <order>Belarusian</order>
    <order>Bulgarian</order>
    <order>Macedonian</order>
    <order>Russian</order>
    <order>Serbian</order>
    <order>Mongolian</order>
    <order>Ukrainian</order>
  </collation>
  <collation name="cp1251"	id="51">
    <order>Belarusian</order>
    <order>Bulgarian</order>
    <order>Macedonian</order>
    <order>Russian</order>
    <order>Serbian</order>
    <order>Mongolian</order>
    <order>Ukrainian</order>
  </collation>  
  <collation name="cp1251_ukrainian_ci"	id="23"	order="Ukrainian"/>
  <collation name="cp1251_bin"		id="50"	order="Binary"	flag="binary"/>
  <collation name="cp1251_general_ci"	id="51" flag="primary">
    <order>Belarusian</order>
    <order>Bulgarian</order>
    <order>Macedonian</order>
    <order>Russian</order>
    <order>Serbian</order>
    <order>Mongolian</order>
    <order>Ukrainian</order>
  </collation>
  <collation name="cp1251_general_cs"	id="52">
    <order>Belarusian</order>
    <order>Bulgarian</order>
    <order>Macedonian</order>
    <order>Russian</order>
    <order>Serbian</order>
    <order>Mongolian</order>
    <order>Ukrainian</order>
  </collation>
</charset>
куда добавлять строку и какую??? такая же проблема не могу решить. изза нее команда "at" через exec работать отказывается ((
 
Сверху