create - set collation mysql
CΓ³mo almacenar caracteres emoji en la base de datos MySQL (9)
Estoy usando el personaje Emoji en mi proyecto.
Que los caracteres se guardan (??) en la base de datos mysql.
Había utilizado la clasificación predeterminada de la base de datos en
utf8mb4_general_ci
.
Muestra
1366 Valor de cadena incorrecto: ''/ xF0 / x9F / x98 / x83 / xF0 / x9F ...'' para la columna ''comentario'' en la fila 1
1) Base de datos: cambie la clasificación predeterminada de la base de datos como
utf8mb4
.
2) Tabla: Cambiar la clasificación de la tabla como
CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
.
Consulta:
ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
3) Código:
INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES (''273'', ''3'', ''Hdhdhdhππππhzhzhzzhjzj ζη±δ½ β'', 49, 1, ''2016-09-13 08:02:29'', ''2016-09-13 08:02:29'')
4) Establecer
utf8mb4
en la conexión de la base de datos:
$database_connection = new mysqli($server, $user, $password, $database_name);
$database_connection->set_charset(''utf8mb4'');
Bueno, no necesita cambiar todo el conjunto de caracteres DB. En lugar de eso, puede hacerlo cambiando la columna al tipo de blob .
ALTERAR TABLA mensajes MODIFICAR contenido BLOB;
El comando para modificar la columna es:
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;
Y necesitamos usar type =
BLOB
El ejemplo para modificar es el siguiente: -
ALTER TABLE messages MODIFY content BLOB;
Comprobé que mySQL y otras bases de datos más recientes no necesitan
''''
para usar el comando en table_name, column_name, etc.
Recuperar y guardar datos:
guarde directamente el contenido del chat en la columna y para recuperar datos, obtenga datos como matriz de
(byte[])
de la columna db y luego conviértalos en una
string
por ejemplo (código Java)
new String((byte[]) arr)
El punto principal no se ha mencionado en las respuestas anteriores que,
Necesitamos pasar una cadena de consulta con las opciones
"useUnicode=yes"
y
"characterEncoding=UTF-8"
en la cadena de conexión
Algo como esto
mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
He actualizado mi base de datos y tabla para actualizar de utf8 a utf8mb4 . Pero nada me funciona. Luego intenté actualizar el tipo de datos de la columna a blob , por suerte funcionó para mí y los datos se guardaron. Incluso mi base de datos y mi tabla son CHARACTER SET utf8 COLLATE utf8_unicode
Si está utilizando Solr + Mysql + Java, puede usar:
Esto se puede usar:
- case1: Cuando no quieres alterar DB.
- case2: cuando tienes que importar emoticones desde tu Mysql al núcleo de Solr.
En el caso anterior, esta es una de las soluciones para almacenar sus emoticones en su sistema.
Pasos para usarlo:
Biblioteca utilizada: import java.net.URLDecoder; import java.net.URLEncoder;
- Usa urlEncoder para codificar tu String con emoticones.
- Almacénelo en DB sin alterar el MysqlDB.
- Puede almacenarlo en solr core (forma decodificada) si lo desea o puede almacenar forma codificada.
- Al buscar estos emoticones desde el núcleo de DB o Solr, ahora puede decodificarlos utilizando urlDecoder.
Ejemplo de código:
import java.net.URLDecoder;
import java.net.URLEncoder;
public static void main(String[] args) {
//SpringApplication.run(ParticipantApplication.class, args);
System.out.println(encodeStringUrl("πΊπΈπ¨π³π―π΅π©πͺπ³πΊπππ3β£5β£3β£βΌγ½ββπ¦ππ¦πβββββ¬
β¬β¬
β¬
ππΉπππ³π¬ππ§ππΏ "));
System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}
public static String encodeStringUrl(String url) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}
public static String decodeStringUrl(String encodedUrl) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
paso 1, cambia el juego de caracteres predeterminado de tu base de datos:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
paso 2, establece el juego de caracteres al crear la tabla:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
o alterar la mesa
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;
Tanto las bases de datos como las tablas
deben tener el juego de caracteres
utf8mb4
y la clasificación
utf8mb4_unicode_ci
.
Al crear una nueva base de datos , debe usar:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Si tiene una base de datos existente y desea agregar soporte:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
También debe establecer el conjunto de caracteres y la clasificación correctos para sus tablas:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
o cámbielo si tiene tablas existentes con muchos datos:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Tenga en cuenta que
utf8_general_ci
ya no es la mejor práctica recomendada.
Vea las preguntas y respuestas relacionadas:
¿Cuál es la diferencia entre utf8_general_ci y utf8_unicode_ci en ?
Mi respuesta solo se suma a la respuesta de Selvamani P.
Es posible que también deba cambiar las consultas de
SET NAMES utf8mb4
con
SET NAMES utf8mb4
.
Eso hizo el truco para mí.
Además, este es un gran artículo para portar su sitio web de utf8 a utf8mb4. En particular, el artículo destaca 2 puntos buenos sobre índices y tablas de reparación después de convertirlos a utf8mb4:
ÍNDICES
Al convertir de utf8 a utf8mb4, la longitud máxima de una columna o clave de índice no cambia en términos de bytes. Por lo tanto, es más pequeño en términos de caracteres, porque la longitud máxima de un carácter ahora es de cuatro bytes en lugar de tres. [...] El motor de almacenamiento InnoDB tiene una longitud de índice máxima de 767 bytes, por lo que para las columnas utf8 o utf8mb4, puede indexar un máximo de 255 o 191 caracteres, respectivamente. Si actualmente tiene columnas utf8 con índices de más de 191 caracteres, deberá indexar un número menor de caracteres cuando use utf8mb4.
TABLAS DE REPARACIÓN
Después de actualizar el servidor MySQL y realizar los cambios necesarios explicados anteriormente, asegúrese de reparar y optimizar todas las bases de datos y tablas. No hice esto de inmediato después de la actualización (no pensé que fuera necesario, ya que todo parecía funcionar bien a primera vista), y me encontré con algunos errores extraños en los que las declaraciones de ACTUALIZACIÓN no tenían ningún efecto, aunque no Se arrojaron errores.
Lea más sobre las consultas para reparar tablas en el artículo.