Establezca el valor de character_set_client en utf8mb4

12

Estoy tratando de convertir mi DB a utf8mb4seguir esta guía . Yo he puesto:

[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

Pero el valor de character_set_clienty character_set_resultsaún no cambiará a 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 |
+--------------------------+--------------------+

¿Qué estoy haciendo mal? ¿Cómo consigo esos valores establecidos en utf8mb4?

qwaz
fuente

Respuestas:

14

Divulgación: soy el autor de Cómo admitir Unicode completo en bases de datos MySQL , la guía que está siguiendo.

  1. ¿Dónde guardó la configuración modificada? Verifique de dónde mysqldcarga las opciones predeterminadas. Suele ser /etc/my.cnf( como se menciona en la guía ), pero puede ser diferente en su sistema. Ejecute el siguiente comando para averiguarlo:

    $ 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. ¿Reiniciaste mysqldcorriendo mysqld restartdespués de hacer los cambios?

Mathias Bynens
fuente
1. Guarde los cambios en \xampp\mysql\bin\my.ini. No pude ejecutar mysqld --help --verbose 2> /dev/null | grep -A1 'Default options', ya que da el siguiente error: 'grep' is not recognized as an internal or external command, operable program or batch file.Soy nuevo en estas cosas, por lo que podría estar haciendo algo mal.
qwaz
2. Reinicé mysqld, y luego me da las siguientes advertencias: 19/02/2014 10:25:17 0 [Advertencia] El uso del prefijo de opción único character_set_client en lugar de character-set-client-handshake está en desuso y se eliminará en un lanzamiento futuro. Utilice el nombre completo en su lugar. 2014-02-19 10:25:17 0 [Advertencia] mysqld: ignorando la opción '--character-set-client-handshake' debido al valor no válido 'utf8mb4'
qwaz
1
¿Por qué tienes skip-character-set-client-handshakeen tu archivo de configuración? Es una opción de línea de comandos, no una variable.
Mathias Bynens
1
Tuve que reinstalar el servidor local; volví a ver a tu guía y todo salió bien. Agradezco su respuesta y ayuda. Volveré a su respuesta y la votaré tan pronto como tenga suficientes representantes para hacerlo.
qwaz
3
He intentado esto pero aún así character_set_client, character_set_connection, character_set_results, collation_connectionse muestra como utf8. ¿Alguna idea de por qué esto no funciona?
Sarita
2

También he seguido esa guía, sin embargo, el mismo problema apareció nuevamente. El problema real radica en el comando utilizado para crear la base de datos, ya que toma DEFAULT CHARACTERcomo argumento y si eso no se pasa durante la ejecución, se pasa un conjunto de caracteres predeterminado que no se pasa utfmb4.

A continuación se detallan los pasos que seguí para solucionarlo:

  1. Cree una base de datos ficticia con utf8mb4juego de caracteres.

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  2. Copie la estructura y los datos reales a esta base de datos ficticia de la base de datos real

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

  3. Descartar la base de datos actual

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
  4. Crear nueva base de datos

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  5. Finalmente, vuelva a colocar la estructura de la tabla y los datos en la base de datos original.

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

Si va a utilizar el procedimiento mencionado anteriormente, asegúrese de leer detenidamente las líneas mencionadas a continuación.

Requisitos previos y mi status quo:

  • Haga una copia de seguridad de toda su estructura, datos, procedimientos almacenados, funciones, disparadores, etc.
  • mysql --version mysql Ver 14.14 Distrib 5.7.22, para Linux (x86_64) usando el contenedor 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
  • Estoy usando un cliente Java que es 'mysql:mysql-connector-java:5.1.30'

  • Mi cadena de conexión es jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
Obi Wan - PallavJha
fuente