0

PostgreSQL: value too long for type character varying

Импортировал я однажды базу данных PostgreSQL (в кодировке utf-8, конечно же) под управлением ubuntu, и всё шло хорошо, CREATE’ы выполнялись, индексы создавались… И тут, не пойми откуда, стали сыпаться ошибки вида «DatabaseError: value too long for type character varying(50)». Вариант о действительном наличии в запросе значений длиннее, чем положено, сразу отметается, т.к. в Debian всё отлично импортировалось. Значит, косячит PostgreSQL.

Дело в том, что шаблонная база данных template1, копированием которой создаются новые базы данных по умолчанию, изначально имела кодировку не utf-8. Следовательно, для корректного импорта нам нужно её перекодировать.

Для этого подключимся к базе данных и выполним несколько запросов.

$ psql -U postgres

Даём разрешение на подключение к базе данных template0.

UPDATE pg_database SET datallowconn = TRUE WHERE datname = 'template0';

Переключаемся к базе данных template0.

\c template0

Удалаяем опцию «это шаблон» у базы данных template1.

UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';

Удаляем template1.

DROP DATABASE template1;

Создаём новую базу с именем template1 по шаблону template0 с кодировкой UNICODE.

CREATE DATABASE template1 WITH template = template0 encoding = 'UNICODE';

Устанавливаем базе template1 флаг шаблона.

UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

Переключаемся к базе данных template1.

\c template1

Запрещаем подключения к template0.

UPDATE pg_database SET datallowconn = FALSE WHERE datname = 'template0';

Теперь проблем с кодировкой не будет.

PS:
Если нет желания или необходимости трогать базу template1, то можно попробовать просто создать базу с указанием шаблона template0.

CREATE DATABASE %dbname% TEMPLATE template0;

Источники:

  1. StackOverflow: postgresql – Django fixture fails, stating "DatabaseError: value too long for type character varying(50)";
  2. PostgreSQL — Управление базами данных.
0

Сброс root-пароля в MySQL под Debian Lenny

Бывает такое, что пароль предварительно не записывается, и потом, по разным причинам, забывается. Ниже приведён способ как это сделать.

1. Останавливаем демон мускула:

$ /etc/init.d/mysql stop

2. теперь снова запускаем его, но уже в безопасном режиме (и в фоне) через mysql_safe с опцией skip-grant-tables, что даёт нам возможность подключаться к мускулу без пароля:

$ /usr/bin/mysqld_safe --skip-grant-tables &

3. Теперь, когда преграда устранена, можем теперь спокойно войти в мускул без пароля:

$ mysql --user=root mysql

4.Далее, устанавливаем новый пароль и сбрасываем привилегии:

mysql> UPDATE USER SET Password=PASSWORD('%new_password%') WHERE USER='root';
# Query OK, 2 ROWS affected (0.04 sec)
# ROWS matched: 2  Changed: 2  Warnings: 0

mysql> FLUSH privileges;
# Query OK, 0 ROWS affected (0.02 sec)

mysql> exit
# Bye

5. Последний шаг – останавливаем и снова запускаем мускул в нормальном режиме (чтобы никто более не смог зайти без пароля):

$ /etc/init.d/mysql stop
$ /etc/init.d/mysql start

Всё. Вы успешно сбросили пароль от рута.
Для входа используем (с правами рута, естественно):

$ mysql --user=root --pass=%new_password%
$ mysql -u root -p %new_password%

PS:
Есть ещё один способ установить новый root-пароль, через bash, набрав под рутом:

$ mysqladmin -u root password %new_password%

Но лично у меня не сработало.

PPS:
И ещё несколько полезных SQL-запросов:

Назначение всех привилегий на все таблицы во всех базах данных пользователю %user% с паролем %password%:

mysql> GRANT ALL PRIVILEGES ON *.* TO '%user%'@'localhost' IDENTIFIED BY '%password%' WITH GRANT OPTION;

То же самое с возможностью доступа с других хостов:

mysql> GRANT ALL PRIVILEGES ON *.* TO '%user%'@"%" IDENTIFIED BY '%password%' WITH GRANT OPTION;

Назначение определённых привелегий на все таблицы в базе данных %database% пользователю %user% с паролем %password%:

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX ON %database%.* TO '%user%'@"%" IDENTIFIED BY '%password%';

Источники:
1) Resetting a forgotten MySQL root password.
2) Настройка MySQL сервера после установки.