Pewnego dnia w pracy postanowiłem zaktualizować mysql do wersji 5.1.28-rc.

Po pierwszej zaktualizowanej maszynie widzę w logach ciekawy warning:


[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.db_collation.
[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.character_set_client.
[Warning] Stored routine 'database'.'routine_name': invalid value in column mysql.proc.collation_connection.

W wersji 5.1.28 i nowszych w momencie gdy procedury różnią się kodowaniem od tabel widzimy właśnie taki warning.

Rozwiązaniem jest zmiana kodowania procedur na używane w tabelach.

Przykład błędnego zaimportowania procedury:


mysql (database) > show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | latin1                           |
| character_set_connection | latin1                           |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | latin1                           |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /opt/mysql/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)

mysql (database) > show create procedure exampleG
*************************** 1. row ***************************
           Procedure: example
            sql_mode:
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `example`()
begin select 1; end
character_set_client: latin1
collation_connection: latin1_swedish_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

Baza i tabele są kodowane utf8 tymczasem nasz klient podłączył się z użyciem kodowania latin1.
Nasza procedura przyjęła kodowanie latin1.

Rozwiązanie:
Zmieniamy kodowanie.


mysql (database) > show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /opt/mysql/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)

mysql (database) > DROP PROCEDURE example;
Query OK, 0 rows affected (0.00 sec)

mysql (database) > DELIMITER ||
mysql (database) > create procedure example()
 begin
   select 1;
 end ||
Query OK, 0 rows affected (0.01 sec)

mysql (database) > show create procedure exampleG
*************************** 1. row ***************************
           Procedure: example
            sql_mode:
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `example`()
begin select 1; end
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

Dodajmy jeszcze do my.cnf domyslne kodowanie dla clienta na utf8.


[client]
default_character_set = utf8

Na koniec:


mysql (database) > flush logs;

Odpowiedz
Nick: 
Email: 
WWW: 
Treśą: