MySQL/MariaDB: сменить кодировку колонки в таблице

Автор: | 06/04/2015
 

mariadb_logoПри добавлении в таблицу текста на кириллице — в результате получаются знаки «???».

Происходит это потому что для поля не была установлена кодировка UTF-8.

Например:

MariaDB [money_test]> insert into money_transactions_j values(null, 2015-05-07, 10, 'текст', 1, 1);
Query OK, 1 row affected, 2 warnings (0.01 sec)
MariaDB [money_test]> select * from money_transactions_j;
+----+---------------------+-----------------+------------------+----------------+---------------------+
| id | transaction_date    | transaction_sum | transaction_desc | source_type_id | transaction_type_id |
+----+---------------------+-----------------+------------------+----------------+---------------------+
|  1 | 2015-05-07 17:07:40 |            1000 | test1            |              1 |                   1 |
|  2 | 2015-05-07 17:07:53 |            1000 | ?????????        |              1 |                   1 |
|  3 | 0000-00-00 00:00:00 |              10 | text             |              1 |                   1 |
|  4 | 0000-00-00 00:00:00 |              10 | ?????            |              1 |                   1 |
+----+---------------------+-----------------+------------------+----------------+---------------------+
4 rows in set (0.00 sec)

Что бы изменить кодировку отдельной колонки — выполняем:

MariaDB [money_test]> ALTER TABLE money_transactions_j CONVERT TO CHARACTER SET 'utf8';
Query OK, 4 rows affected (0.39 sec)
Records: 4  Duplicates: 0  Warnings: 0

Проверяем:

MariaDB [money_test]> insert into money_transactions_j values(null, 2015-05-07, 10, 'текст', 1, 1);
Query OK, 1 row affected, 1 warning (0.01 sec)
MariaDB [money_test]> select * from money_transactions_j where id='5';
+----+---------------------+-----------------+------------------+----------------+---------------------+
| id | transaction_date    | transaction_sum | transaction_desc | source_type_id | transaction_type_id |
+----+---------------------+-----------------+------------------+----------------+---------------------+
|  5 | 0000-00-00 00:00:00 |              10 | текст            |              1 |                   1 |
+----+---------------------+-----------------+------------------+----------------+---------------------+
1 row in set (0.00 sec)

Ещё один пример выполнения ALTER поля.

Поле transaction_date имеет тип DATETIME.

Что бы изменить его на DATE — выполняем:

MariaDB [money_test]> ALTER TABLE money_transactions_j MODIFY transaction_date DATE;
Query OK, 21 rows affected, 16 warnings (0.27 sec)
Records: 21  Duplicates: 0  Warnings: 16

MariaDB [money_test]> desc money_transactions_j;
+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
| transaction_date    | date         | YES  |     | NULL    |                |
| transaction_sum     | int(11)      | NO   |     | NULL    |                |
| transaction_desc    | varchar(255) | NO   |     | NULL    |                |
| source_type_id      | int(11)      | NO   | MUL | NULL    |                |
| transaction_type_id | int(11)      | NO   | MUL | NULL    |                |
+---------------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)