Цитата:
Подскажите, а у меня такая же проблема, только меня mysql_query('SET NAMES cp1251;'); не полечило.... у меня и так везде в таблицах ср1251 прописана.... А я даже через ПхпМайАдмин данных на руском не завести, не вызвать немогу... Подскажите в чём грабли могут быть?
Объясню детальнее, т.к. вопрос вижу частый
1. Важно какие физически данные хранятся в таблице, это зависит от того как они туда попали (что было в INSERT, какая кодировка соединения была при INSERT или откуда была получена БД, например из старой версии MySQL). Посмотреть как выглядят символы можно открыв *.MYD файл в текстовом редакторе, если в блокноте есть читабельный текст - значит 1251, если непонятные символы - UTF8
2. Важно какая кодировка присвоена текущему конекту к БД. Посмотреть её можно выполнив SHOW VARIABLES LIKE '%char%' и SHOW VARIABLES LIKE '%collat%'
3. Важно какая для текущего столбца присвоена в описании кодировка. Посмотреть можно SHOW CREATE TABLE tbl_foo;
Чтобы всё нормально работало, в п.1.2.3 кодировки должны совпадать.
1. Если неправильная кодировка внутри, то надо сделать
ALTER TABLE foo CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_ukrainian_ci;
Но надо убедиться что в текущем описании таблицы (п.3.) стоит правильное описание текущей кодировки, если скажем физически лежит UTF8, а в описании числится latin1, то при конвертации будут применены правила latin1->cp1251 и получится фигня.
2. Изменять кодировку для соединения можно:
а) явно в каждом конекте через комманды
SET character_set_client =foo
SET character_set_results =foo
SET character_set_connection=foo
эти команды можно дать проще:
а1) Макрос "SET NAMES foo"
а2) Макрос "SET CHARACTER SET foo" (collation будет задаваться не явно, а от выбранной mysql_select_db)
б) указать административно на сервере my.cnf:
skip-character-set-client-handshake
init-connect="SET CHARACTER SET cp1251"
3. Изменять описание таблицы можно через ALTER TABLE или перезаливкой дампа таблицы с правильным CREATE TABLE
Ещё следует иметь ввиду, что в случае, когда при создании баз (CREATE DATABASE), создании таблиц (CREATE TABLE) и создании столбцов (ALTER TABLE) если ЯВНО не указать кодировку для описания, будет применена родительская, для БД - дефолтная сервера, для таблицы - дефолтная БД, для столбца - дефолтная таблицы.
Это влияет на импорт дампа без четкого указания кодировки:
CREATE TABLE ... ENGINE=MyISAM
DEFAULT CHARSET=utf8Поменять дефолтный серверный чарсет и колейшен можно в my.cnf:
character_set_server = cp1251
collation_server = cp1251_ukrainian_ci
Тогда неявно созданные DATABASE будут иметь именно эту кодировку и сравнение.