Главная > Unix-like, Windows, Администрирование > MySQL: создаём БД в правильной кодировке.

MySQL: создаём БД в правильной кодировке.

Изначально пост хотел озаглавить "о кроказябрах в сотый раз", но решил обойтись более официозной формулировкой, хотя, быть может, первый вариант более отражает суть, т.к. все эти вещи описаны уже много раз, но всё равно с ними периодически возникают проблемы.

Почему-то, в очередной раз создавая БД в mysql, в результате на веб-морде получаю "кракозябры". Казалось бы, 2013й год, ан нет, высокомерные вавилоняне, не могли башенку поскромней построить - был бы один язык на всех и никаких проблем с кодировками. Ну, что было, то было, а БД рекомендую создавать вот так (если конечно вам нужна кодировка utf8):

CREATE DATABASE <dbname> CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Хотя, раз на раз не приходится, другие БД и без этого обходились. Вероятно, ORM django в этом плане более хитёр, умён и прозорлив - создаёт таблички сразу с юникодом, в отличие от sqlalchemy. По крайней мере, мои наблюдения таковы, что для django-проектов не было проблем с кодировкой, а вот с sqlalchemy - опять наткнулся (или это на самом деле проблемы с моей памятью).

Если это не решает вашей проблемы, то смотрите какую кодировку использует клиент при подключении, в какую перекодирует, какую отдаёт web-сервер или в какой кодировке попадают сами данные в БД.

Пожалуйста, оцените полезность и качество данной статьи. Одна звезда - плохо, 5 - хорошо.
1/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.2/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.3/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.4/5.5/5. (Еще не оценили)
Загрузка...
  1. Kvothe
    30 июля 2013 в 23:49 | #1

    А зачем нужен COLLATE?

  2. lizz
    5 августа 2013 в 13:15 | #2

    @Kvothe
    Если не указать COLLATE, то будет использоваться дефолтное значение. Само значение указывает, грубо говоря, на порядок букв для сравнения при сортировке. utf8_general_ci работает немного скорее, но менее точно, чем utf8_unicode_ci. utf8_bin сравнивает символы в бинарном формате. Есть ещё language-specific значения с доп. правилами, можете попробовать использовать utf8_russian_ci.

    Вообще, некоторые люди рекомендуют использовать utf8_unicode_ci, если вы точно не знаете зачем вам другой вариант (поправил пост).

    P.S. Где-то могу быть неточным, т.к. в теме пришлось самому только что разбираться более подробно, но примерно так оно работает. :)

  1. Пока что нет уведомлений.