3 заметки с тегом
charset РСС
6 апреля 2011, 11:17
MySQL: utf8_unicode_ci и utf8_general_ci
Увидел в проекте странный коллейшон у базы utf8_unicode_ci. Решил почитать что за зверь, и нашёл на сайте мускула простой ответ:
То есть желательно от неё избавиться, хотя могут возникнуть некоторые проблемы с поиском и тегами :)
For any Unicode character set, operations performed using the _general_ci collation are faster than those for the _unicode_ci collation. For example, comparisons for the utf8_general_ci collation are faster, but slightly less correct, than comparisons for utf8_unicode_ci. The reason for this is that utf8_unicode_ci supports mappings such as expansions; that is, when one character compares as equal to combinations of other characters. For example, in German and some other languages “ß” is equal to “ss”. utf8_unicode_ci also supports contractions and ignorable characters. utf8_general_ci is a legacy collation that does not support expansions, contractions, or ignorable characters. It can make only one-to-one comparisons between characters.Дам вольный перевод:
Для всех юникодовых кодировок операции сравнения происходят быстрее с _general_ci (на 30%), но они менее правильные чем с _unicode_ci (ещё генерал_си не чувствительна к регистру). _unicode_ci поддерживает отображения, в виде разложения, то есть для одного символа “ß” одной языковой группы может соответствовать пара других символов “ss” другой языковой группы. _general_ci есть наследственным коллейшеном, что не поддерживает расширений, сокращений или игнорируемых символов.
То есть желательно от неё избавиться, хотя могут возникнуть некоторые проблемы с поиском и тегами :)
1 комментарий2 августа 2009, 15:42
MySQL convert All tables (encoding, alter)
Иногда нужно поменять кодировку БД (появился новый язык, и нужен утф8 срочно, или поменялась ЦМС, или власть сменилась).
Хм, у нас для этого есть стандартные команды:
Не смешно :( но выход есть, всё теми же стандартными фишками ;)
ЗЫ: все таблички то в нужной кодировочке, а база то нет ;) не забываем
Хм, у нас для этого есть стандартные команды:
ALTER TABLE sometable CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci; ALTER TABLE sometable DEFAULT CHARACTER SET cp1251; # another way ALTER TABLE articles CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci ALTER TABLE articles DEFAULT CHARACTER SET utf8Казалось бы, всё просто ;) Но а если таблиц 100, 200, 300 о_О это что по одной колбасить? :D
Не смешно :( но выход есть, всё теми же стандартными фишками ;)
# мы возьмём и используем ИнфоСхему ;) use information_schema; # Запихаем все таблички базы someDB в МЕМ select TABLE_SCHEMA, TABLE_NAME from TABLES where TABLE_SCHEMA = "someDB"; # Нарисуем команды select CONCAT("Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci; Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` DEFAULT CHARACTER SET cp1251;") as MySQLCMD from TABLES where TABLE_SCHEMA = "someDB"; # Думаете всё? Магия произошла? нееет! # Теперь смотрим в аутпут, копируем все команды, # и выполняем огромный запрос. # Для удобства советую phpMyAdmin
ЗЫ: все таблички то в нужной кодировочке, а база то нет ;) не забываем
ALTER DATABASE `someDB` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
26 мая 2008, 15:24
«cp1251 vs Mysql» и знаки вопроса (windows-1251)
после коннекта нужно вставить магические строчки :)
что это даст?:
* первые 2 строчки будут считывать с базы не «????», а нормальный текст;
* следующие строчки дадут возможность записывать в базу текст в правильной кодировке, а не «????» :)
@mysql_query("SET NAMES cp1251"); @mysql_query("SET CHARACTER SET cp1251"); @mysql_query("SET character_set_client = cp1251"); @mysql_query("SET character_set_connection = cp1251"); @mysql_query("SET character_set_results = cp1251");
что это даст?:
* первые 2 строчки будут считывать с базы не «????», а нормальный текст;
* следующие строчки дадут возможность записывать в базу текст в правильной кодировке, а не «????» :)
