Лучший способ убедиться, что база данных MySQL полностью в UTF8

После некоторых проблем со строками UTF8 и без UTF8 мы стандартизируем UTF8. Одна вещь, которую мне нужно сделать, это проверить, что все в UTF8 в базе данных MySQL? Что мне нужно проверить?

  • Набор символов по умолчанию для сервера
  • Набор символов по умолчанию для каждой базы данных
  • У каждого текстового столбца есть набор символов? Как я могу проверить это?

Я думал поместить все это в плагин nagios, чтобы проверить, что все в UTF8. Предложения?

5 ответов

Решение

Рори, во-первых, ты прав, когда хочешь следить за тем, что создается в твоих базах данных. Хотя мы все реализуем шаги по предотвращению ошибок, вы не можете предполагать, что ошибки не закрадываются. Я делаю очень похожую вещь, поскольку большая часть нашей инфраструктуры требует UTF8.

Следующие запросы подходят для проверки статистики:

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, COUNT(0) AS COUNT FROM information_schema.SCHEMATA GROUP BY DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME;
# to filter schema use SCHEMA_NAME in the where clause
SELECT TABLE_COLLATION, COUNT(0) AS COUNT FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL GROUP BY TABLE_COLLATION;
# to filter schema use TABLE_SCHEMA in the where clause
SELECT CHARACTER_SET_NAME, COLLATION_NAME, COUNT(0) AS COUNT FROM information_schema.COLUMNS WHERE CHARACTER_SET_NAME IS NOT NULL AND COLLATION_NAME IS NOT NULL GROUP BY CHARACTER_SET_NAME, COLLATION_NAME;
# to filter schema use TABLE_SCHEMA in the where clause

Следующие запросы будут полезны для задания cron, которое отправит вам электронное письмо, если будут найдены какие-либо результаты:

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE DEFAULT_CHARACTER_SET_NAME NOT LIKE '%utf8%' OR DEFAULT_COLLATION_NAME NOT LIKE '%utf8%';
# to filter schema use SCHEMA_NAME in the where clause
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL AND TABLE_COLLATION NOT LIKE '%utf8%';
# to filter schema use TABLE_SCHEMA in the where clause
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE CHARACTER_SET_NAME NOT LIKE '%utf8%' OR COLLATION_NAME NOT LIKE '%utf8%';
# to filter schema use TABLE_SCHEMA in the where clause

Эти запросы работают для MySQL >= 5.0. Если вам нужна помощь в написании работы cron, дайте мне знать.

У меня также есть проблема с моими разработчиками (в основном командой Ruby on Rails), создающими таблицы InnoDB, когда они не нужны. Чтобы сохранить это в тайне, я отслеживаю промежуточную базу данных с помощью cron, который вызывает:

SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE ENGINE = 'InnoDB';

Я бы сделал что-то вроде mysqldump --all-database --no-data | grep -i персонаж

Jure1873 предлагает использовать grep, и я заметил, что awk более уместен. Вот что я бросил вместе.

mysqldump --all-databases --no-data | awk '{gsub("[`;]","");};/^USE /{db=$2;};/CREATE TABLE /{table=$3;};/^\) ENGINE/{sub(".*CHARSET=","");if(!match($1,"utf8")){print db ":" table ":" $1;}}'

Вот оно с повышенной читабельностью:

mysqldump --all-databases --no-data | \
awk '
    {
        gsub("[`;]","");
    };
    /^USE /{
        db=$2;
    }; \
    /CREATE TABLE /{
        table=$3;
    }; \
    /^\) ENGINE/{
        sub(".*CHARSET=","");
        if(!match($1,"utf8")){
            print db ":" table ":" $1; 
        }   
    }   
'
dbs=$(echo 'show databases;' | mysql | grep -v '^Database$' | tr "\n" " ")

for d in ${dbs}; do
 tables=$(echo 'show tables' | mysql $d | grep -v '^Tables' | tr "\n" " ")
 for t in ${tables}; do
  echo "**************** DB ${d} TABLE ${t}"
  mysqldump --no-data ${d} ${t} | grep  COLLATE | grep -v utf && echo "DB ${d} TABLE ${t} !!!!"
  mysqldump --no-data ${d} ${t} | grep  CHARSET | grep -v utf && echo "DB ${d} TABLE ${t} !!!!"
 done
done

Nagios - действительно неправильный инструмент для этого. Nagios - это больше для мониторинга сервисов, а не проверки неправильной конфигурации. Лучшим инструментом будет какой-то инструмент управления конфигурацией, например, puppet или cfengine, чтобы убедиться, что файлы конфигурации имеют правильные настройки.

Что касается собственно конфигурации, руководство по MySQL содержит очень обширную главу о наборе символов и кодировании.

Другие вопросы по тегам