¿Cuál es la forma correcta para que los complementos creen tablas con consideraciones especiales de clasificación / clasificación?

4

Estoy usando WordPress > = 3.8. Los valores predeterminados de conjunto de caracteres / intercalación en wp-config.php son

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', ''); // Becomes utf8_general_ci

Estoy en una situación en la que utf8_general_ci sería adecuado , pero algo más específico ( utf8_danish_ci ) siempre podrá describir mejor mis datos. También sucede que los datos, que se obtienen de una fuente externa, siempre serán UTF-8.

Estoy desarrollando un complemento que crea una tabla

CREATE TABLE plugin_table(
    some_id INT NOT NULL,
    some_data VARCHAR(100) NOT NULL,
    PRIMARY KEY  (some_id)
) ENGINE=InnoDB;

¿Cuál es la forma correcta de manejar el conjunto de caracteres y / o la recopilación?

Una solución es usar la declaración anterior, recurriendo a la configuración global. Como se mencionó, esto funcionará en mi situación y, desde la perspectiva del desarrollador, creo que es razonable requerir que se especifique utf8 o utf8mb4 .

La otra solución es establecer explícitamente la configuración del conjunto de caracteres / intercalación:

...) ENGINE=InnoDB [DEFAULT CHARSET=utf8] [COLLATE utf8_danish_ci];

Esto me permitirá configurar la tabla de la manera más adecuada para los datos que necesito almacenar, y en las pruebas confirmé que la letra Å , que se trata de manera diferente por utf8_general_ci y utf8_danish_ci , se compara correctamente Este parece para funcionar, pero no sé si es una buena o mala práctica y, en particular, no sé si esto podría causar complicaciones en otros lugares (por ejemplo, ¿debería cambiar la configuración cuando consultando la tabla?).

Esta pregunta tiene varios primos, pero esto no parece ser un duplicado. La respuesta que más se acerca también menciona el método explícito anterior, con un comentario que puede ser más apropiado usar el valores predeterminados "para que el usuario pueda anularlos si tienen una buena razón".

Si iba a hacer un gran esfuerzo para utilizar la configuración del núcleo, parece una tontería especificar estas configuraciones en primer lugar.

Es importante entender que nunca habrá una "buena razón" para usar el no-UTF-8. Con respecto a la colación, la pregunta es menos clara.

La pregunta se reduce a lo siguiente: dada una configuración de núcleo que no es UTF-8, que se consideraría no compatible, ¿debo tomar medidas para que mi complemento se comporte correctamente?

    
pregunta Quail 28.04.2014 - 12:19

1 respuesta

1

Creo que este problema lo maneja WooCommerce en su complemento. También crea sus propias tablas y así es como cuidan la parte de Collation. (Me refiero al archivo class-wc-install.php de WooCommerce). Han escrito el siguiente código en la función create_tables

global $wpdb;

$collate = '';

if ( $wpdb->has_cap( 'collation' ) ) {
    if ( ! empty($wpdb->charset ) ) {
        $collate .= "DEFAULT CHARACTER SET $wpdb->charset";
    }
    if ( ! empty($wpdb->collate ) ) {
        $collate .= " COLLATE $wpdb->collate";
    }
}

Y luego esta variable $ cotejar se agrega al final de la consulta CREATE TABLE .

Entonces, en este caso, la consulta puede tener este aspecto:

CREATE TABLE plugin_table(
    some_id INT NOT NULL,
    some_data VARCHAR(100) NOT NULL,
    PRIMARY KEY  (some_id)
) $collate;

Para que descubran el Cotejo y el conjunto de caracteres de WordPress y los agreguen.

Espero que ayude :)

    
respondido por el WisdmLabs 26.07.2014 - 19:50

Lea otras preguntas en las etiquetas