Defina o valor de character_set_client como utf8mb4

12

Estou tentando converter meu banco de dados para utf8mb4seguir este guia . Eu arrumei:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake

Mas o valor de character_set_cliente character_set_resultsainda não será alterado para utf8mb4.

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

O que estou fazendo errado? Como faço para definir esses valores em utf8mb4?

qwaz
fonte

Respostas:

14

Divulgação: sou o autor de Como dar suporte completo ao Unicode nos bancos de dados MySQL , o guia que você está seguindo.

  1. Onde você salvou as configurações modificadas? Verifique de onde mysqldcarrega as opções padrão. Geralmente é /etc/my.cnf( como mencionado no guia ), mas pode ser diferente no seu sistema. Execute o seguinte comando para descobrir:

    $ mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
    
  2. Você reiniciou mysqldexecutando mysqld restartdepois de fazer as alterações?

Mathias Bynens
fonte
1. Salvei as alterações \xampp\mysql\bin\my.ini. Não consegui executar mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'- pois isso gera o seguinte erro: 'grep' is not recognized as an internal or external command, operable program or batch file.Eu sou novo nessas coisas, então posso estar fazendo algo errado.
Qwaz
2. Reiniciei o mysqld e, depois de receber os seguintes avisos: 2014-02-19 10:25:17 0 [Aviso] O uso do prefixo de opção exclusiva character_set_client em vez do conjunto de caracteres-cliente-handshake foi descontinuado e será removido em uma versão futura. Por favor, use o nome completo. 2014-02-19 10:25:17 0 [Aviso] mysqld: opção de ignição '--character-set-client-handshake' devido ao valor inválido 'utf8mb4'
qwaz
1
Por que você tem skip-character-set-client-handshakeno seu arquivo de configuração? É uma opção de linha de comando, não uma variável.
Mathias Bynens
1
Eu tive que reinstalar o servidor local; percorreu seu guia novamente e tudo deu certo. Agradeço sua resposta e ajuda. Voltarei à sua resposta e a votarei assim que tiver representantes suficientes para fazê-lo.
Qwaz
3
Eu tentei isso, mas ainda character_set_client, character_set_connection, character_set_results, collation_connectioné mostrado como utf8. Alguma idéia de por que isso não está funcionando?
Sarita
2

Também segui esse guia, no entanto, o mesmo problema apareceu novamente. O problema real está no comando usado para criar o banco de dados, pois ele é usado DEFAULT CHARACTERcomo argumento e, se isso não for passado durante a execução, é passado um conjunto de caracteres padrão que não é utfmb4.

Abaixo estão as etapas que segui para corrigi-lo:

  1. Crie um banco de dados fictício com utf8mb4conjunto de caracteres.

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
    
  2. Copie a estrutura e os dados reais para esse banco de dados fictício do banco de dados real

    mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy

  3. Descartar banco de dados atual

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
    
  4. Criar novo banco de dados

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
    
  5. Por fim, coloque a estrutura da tabela e os dados de volta no banco de dados original

    mysqldump -uroot -proot_password your_db_name_dummy | mysql -uroot -proot_password your_db_name

Se você for usar o procedimento acima mencionado, leia também cuidadosamente as linhas abaixo mencionadas.

Pré-requisitos e meu status quo:

  • Faça backup de toda a sua estrutura, dados, procedimentos armazenados, funções, gatilhos, etc.
  • mysql --version mysql Ver 14.14 Distrib 5.7.22, para Linux (x86_64) usando o wrapper EditLine

  • cat /etc/my.cnf

    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    init-connect = 'SET NAMES utf8mb4
    collation-server = utf8mb4_unicode_ci
    
  • Estou usando o cliente java que é 'mysql:mysql-connector-java:5.1.30'

  • Minha cadeia de conexão é jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
Obi Wan - PallavJha
fonte