\xE4\xB8\xAD\xE6\x96\x87
é hexadecimal para 中文
("Língua chinesa"). No MySQL, isso funcionará com
utf8
ou utf8mb4
. No entanto, como existem vários caracteres chineses que precisam de 4 bytes, você está correto em usar utf8mb4. Enquanto isso, o COLLATION
(por exemplo, utf8mb4_unicode_ci) não importa para a questão em questão. O charset da coluna individual é importante, não o do banco de dados. E o kludge 191 é necessário apenas em 5.5 e 5.6. Forneça
SHOW CREATE TABLE
. Outra maneira de estabelecer os parâmetros de conexão é emitir
SET NAMES utf8mb4
imediatamente após a conexão. (Isso não é o preferido, mas pode valer a pena tentar. Deve ser uma solução alternativa para o problema do Gorm mencionado.) Você está recebendo a mensagem de erro ao conectar? Ou ao emitir uma consulta específica? Em caso afirmativo, forneça essa consulta.
Verifique se
skip-character-set-client-handshake
não está sendo usado. Verifique a "prática recomendada" em https://stackoverflow.com/a/38363567/1766831
Adendos Como você mencionou um procedimento armazenado, sugiro que você faça
SHOW CREATE PROCEDURE
para ver com qual charset ele foi construído. Veja um exemplo do que pode acontecer:mysql> SET NAMES latin1;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE PROCEDURE x () BEGIN END ;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW CREATE PROCEDURE x \G
*************************** 1. row ***************************
Procedure: x
sql_mode: NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `x`()
BEGIN END
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: utf8mb4_unicode_520_ci
1 row in set (0.00 sec)
mysql> DROP PROCEDURE x;
Query OK, 0 rows affected (0.01 sec)
contra:
mysql> SET NAMES utf8mb4;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE PROCEDURE x () BEGIN END ;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE PROCEDURE x \G
*************************** 1. row ***************************
Procedure: x
sql_mode: NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `x`()
BEGIN END
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
Database Collation: utf8mb4_unicode_520_ci
1 row in set (0.00 sec)
Se você não vir utf8mb4 em seu
PROCEDURE
e FUNCTION
declarações, reconstruí-las.