español - mysql wikipedia
¿Cómo corregir los errores de "Valor de cadena incorrecta"? (19)
1 - Debe declarar en su conexión la propiedad de codificar UTF8. http://php.net/manual/en/mysqli.set-charset.php .
2 - Si está utilizando la línea de comando mysql para ejecutar un script, debe usar el indicador, como: Cmd: C:/wamp64/bin/mysql/mysql5.7.14/bin/mysql.exe -h localhost -u root -P 3306 --default-character-set=utf8 omega_empresa_parametros_336 < C:/wamp64/www/PontoEletronico/PE10002Corporacao/BancoDeDadosModelo/omega_empresa_parametros.sql
Después de notar que una aplicación tendía a descartar correos electrónicos aleatorios debido a errores de valor de cadena incorrectos, pasé por utf8
y utf8
muchas columnas de texto para usar el utf8
caracteres de la columna utf8
y la columna predeterminada ( utf8_general_ci
) para que los aceptara. Esto corrigió la mayoría de los errores e hizo que la aplicación dejara de tener errores sql cuando también llegaba a correos electrónicos no latinos.
A pesar de esto, algunos de los correos electrónicos siguen causando que el programa acierte errores de valor de cadena incorrectos: (Incorrect string value: ''/xE4/xC5/xCC/xC9/xD3/xD8...'' for column ''contents'' at row 1)
La columna de contenido es un tipo de MEDIUMTEXT
MEDIUMTEXT que utiliza el utf8
caracteres de la columna utf8_general_ci
y el utf8_general_ci
columnas utf8_general_ci
. No hay banderas que pueda alternar en esta columna.
Teniendo en cuenta que no quiero tocar ni mirar el código fuente de la aplicación a menos que sea absolutamente necesario:
- ¿Qué está causando ese error? (Sí, sé que los correos electrónicos están llenos de basura al azar, pero pensé que utf8 sería bastante permisivo)
- ¿Cómo puedo arreglarlo?
- ¿Cuáles son los efectos probables de tal solución?
Una cosa que consideré fue cambiar a utf8 varchar ([algún número grande]) con la bandera binaria activada, pero no estoy familiarizado con MySQL, y no tengo idea de si tal solución tiene sentido.
Agregué el binario antes del nombre de la columna y resolví el error del juego de caracteres.
insertar en los valores de la tabla A (binary stringcolname1);
Aunque su intercalación está configurada en utf8_general_ci, sospecho que la codificación de caracteres de la base de datos, tabla o incluso columna puede ser diferente.
ALTER TABLE tabale_name MODIFY COLUMN column_name VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
En general, esto sucede cuando inserta cadenas a columnas con codificación / intercalación incompatible.
Obtuve este error cuando tuve TRIGGER, que heredan la intercalación del servidor por algún motivo. Y el valor predeterminado de mysql es (al menos en Ubuntu) latin-1 con intercalación sueca. Aunque tenía una base de datos y todas las tablas configuradas para UTF-8, aún no había configurado my.cnf
:
/etc/mysql/my.cnf:
[mysqld]
character-set-server=utf8
default-character-set=utf8
Y esto debe enumerar todos los factores desencadenantes con utf8- *:
select TRIGGER_SCHEMA, TRIGGER_NAME, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION from information_schema.TRIGGERS
Y algunas de las variables enumeradas por esto también deberían tener utf-8- * (sin codificación latin-1 u otra):
show variables like ''char%'';
En mi caso, primero me encuentro con un ''???'' en mi sitio web, luego reviso el juego de caracteres de Mysql, que ahora es latino, así que lo cambio a utf-8, luego reinicio mi proyecto, luego recibí el mismo error, luego descubrí que olvidé cambiar el juego de caracteres de la base de datos y cambiar a utf-8, boom, funcionó.
Ese error significa que o bien tiene la cadena con codificación incorrecta (por ejemplo, está tratando de ingresar la cadena codificada ISO-8859-1 en la columna codificada en UTF-8), o la columna no admite los datos que está tratando de ingresar.
En la práctica, el último problema es causado por la implementación MySQL UTF-8 que solo admite caracteres UNICODE que necesitan de 1 a 3 bytes cuando se representan en UTF-8. Consulte "Valor de cadena incorrecto" cuando intente insertar UTF-8 en MySQL mediante JDBC. para detalles.
Hay buenas respuestas aquí. Solo estoy agregando el mío ya que encontré el mismo error, pero resultó ser un problema completamente diferente. (Tal vez en la superficie lo mismo, pero una causa raíz diferente.)
Para mí, el error ocurrió en el siguiente campo:
@Column(nullable = false, columnDefinition = "VARCHAR(255)")
private URI consulUri;
Esto termina siendo almacenado en la base de datos como una serialización binaria de la clase URI
. Esto no levantó ningún indicador con pruebas unitarias (usando H2) o pruebas de integración / CI (usando MariaDB4j ), estalló en nuestra configuración similar a la producción. (Sin embargo, una vez que se entendió el problema, fue bastante fácil ver el valor incorrecto en la instancia de MariaDB4j, simplemente no hizo estallar la prueba). La solución fue construir un mapeador de tipos personalizado:
package redacted;
import javax.persistence.AttributeConverter;
import java.net.URI;
import java.net.URISyntaxException;
import static java.lang.String.format;
public class UriConverter implements AttributeConverter<URI, String> {
@Override
public String convertToDatabaseColumn(URI attribute) {
return attribute.toString();
}
@Override
public URI convertToEntityAttribute(String field) {
try {
return new URI(field);
}
catch (URISyntaxException e) {
throw new RuntimeException(format("could not convert database field to URI: %s", field));
}
}
}
Utilizado de la siguiente manera:
@Column(nullable = false, columnDefinition = "VARCHAR(255)")
@Convert(converter = UriConverter.class)
private URI consulUri;
En lo que respecta a Hibernate, parece que tiene un montón de mapeadores de tipos proporcionados , incluso para java.net.URL
, pero no para java.net.URI
(que es lo que necesitábamos aquí).
He probado todas las soluciones anteriores (que aportan puntos válidos), pero nada funcionaba para mí.
Hasta que encontré que mis asignaciones de campo de tabla MySQL en C # estaban usando un tipo incorrecto: MySqlDbType.Blob . Lo cambié a MySqlDbType.Text y ahora puedo escribir todos los símbolos UTF8 que quiero.
ps El campo de tabla My MySQL es del tipo "Texto largo". Sin embargo, cuando autogeneré las asignaciones de campo utilizando el software MyGeneration, estableció automáticamente el tipo de campo como MySqlDbType.Blob en C #.
Curiosamente, he estado utilizando el tipo MySqlDbType.Blob con caracteres UTF8 durante muchos meses sin problemas, hasta que un día intenté escribir una cadena con algunos caracteres específicos.
Espero que esto ayude a alguien que está luchando por encontrar una razón para el error.
Hola, también recibí este error cuando uso mis bases de datos en línea del servidor GoDaddy, creo que tiene la versión de MySQL de 5.1 o más. pero cuando lo hago desde mi servidor localhost (versión 5.7) estuvo bien después de que creé la tabla desde el servidor local y la copié al servidor en línea usando mysql yog, creo que el problema es con el juego de caracteres
La solución para mí al ejecutar este valor de cadena Incorrecta: ''/ xF8'' para el error de columna con scriptcase era asegurarme de que mi base de datos está configurada para utf8 general ci y también mis colaciones de campo. Luego, cuando realizo la importación de datos de un archivo csv, cargo el csv en el UE Studio y lo guardo con formato como utf8 y Voila. Funciona como un encanto, 29000 registros no hay errores. Previamente estaba tratando de importar un csv creado por Excel.
La tabla y los campos tienen la codificación incorrecta; sin embargo, puede convertirlos a UTF-8.
ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;
Lo que hice, primero fue cambiar el tipo de columna a BLOQUE LARGO, inserté datos y luego cambié el tipo de columna a VARCHAR (255) ya que los datos no eran tan sensibles, tomé el riesgo y también fue enorme (alrededor de 40k entradas). Sugiero que puedas probar esto si solo no tienes datos que no quieras distorsionar.
Los tipos de utf-8 de MySQL no son en realidad utf-8 correctos; solo utiliza hasta tres bytes por carácter y admite solo el plano multilingüe básico (es decir, no Emoji, ni plano astral, etc.).
Si necesita almacenar valores desde planos Unicode superiores, necesita las codificaciones utf8mb4 .
No recomendaría la respuesta de Richies, porque está arruinando los datos dentro de la base de datos. No solucionaría su problema sino que trataría de "ocultarlo" y de no poder realizar las operaciones esenciales de la base de datos con los datos falsos.
Si encuentra este error, los datos que está enviando no están codificados en UTF-8, o su conexión no es UTF-8. Primero, verifique que la fuente de datos (un archivo, ...) realmente sea UTF-8.
Luego, verifique la conexión de su base de datos, debe hacer esto luego de conectarse:
SET NAMES ''utf8'';
SET CHARACTER SET utf8;
Luego, verifique que las tablas donde se almacenan los datos tengan el conjunto de caracteres utf8:
SELECT
`tables`.`TABLE_NAME`,
`collations`.`character_set_name`
FROM
`information_schema`.`TABLES` AS `tables`,
`information_schema`.`COLLATION_CHARACTER_SET_APPLICABILITY` AS `collations`
WHERE
`tables`.`table_schema` = DATABASE()
AND `collations`.`collation_name` = `tables`.`table_collation`
;
Por último, verifique la configuración de su base de datos:
mysql> show variables like ''%colla%'';
mysql> show variables like ''%charac%'';
Si la fuente, el transporte y el destino son UTF-8, su problema desapareció;)
Para solucionar este error, actualicé mi base de datos MySQL a utf8mb4, que es compatible con el conjunto completo de caracteres Unicode siguiendo este detallado tutorial . Sugiero revisarlo detenidamente, porque hay bastantes errores (por ejemplo, las claves de índice pueden llegar a ser demasiado grandes debido a las nuevas codificaciones, después de las cuales debe modificar los tipos de campo).
Primero compruebe si su default_character_set_name es utf8.
SELECT default_character_set_name FROM information_schema.SCHEMATA S WHERE schema_name = "DBNAME";
Si el resultado no es utf8, debe convertir su base de datos. Al principio debes guardar un vertedero.
Para cambiar la codificación del juego de caracteres a UTF-8 para todas las tablas en la base de datos especificada, escriba el siguiente comando en la línea de comando. Reemplace DBNAME con el nombre de la base de datos:
mysql --database=DBNAME -B -N -e "SHOW TABLES" | awk ''{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}'' | mysql --database=DBNAME
Para cambiar la codificación del conjunto de caracteres a UTF-8 para la base de datos misma, escriba el siguiente comando en el indicador mysql >. Reemplace DBNAME con el nombre de la base de datos:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Ahora puede volver a intentar escribir el carácter utf8 en su base de datos. Esta solución me ayuda cuando intento subir 200000 filas de archivos csv a mi base de datos.
Resolví este problema hoy al alterar la columna al tipo ''LONGBLOB'' que almacena bytes sin formato en lugar de caracteres UTF-8.
La única desventaja de hacer esto es que usted debe encargarse de la codificación usted mismo. Si un cliente de su aplicación usa codificación UTF-8 y otro usa CP1252, puede enviar sus correos electrónicos con caracteres incorrectos. Para evitar esto, siempre use la misma codificación (por ejemplo, UTF-8) en todas sus aplicaciones .
Consulte esta página http://dev.mysql.com/doc/refman/5.0/en/blob.html para obtener más detalles sobre las diferencias entre TEXT / LONGTEXT y BLOB / LONGBLOB. También hay muchos otros argumentos en la web discutiendo estos dos.
"/xE4/xC5/xCC/xC9/xD3/xD8"
no es válido UTF-8. Probado usando Python:
>>> "/xE4/xC5/xCC/xC9/xD3/xD8".decode("utf-8")
...
UnicodeDecodeError: ''utf8'' codec can''t decode bytes in position 0-2: invalid data
Si está buscando una forma de evitar los errores de decodificación dentro de la base de datos, la codificación cp1252 (también conocida como "Windows-1252", también conocida como "Windows Western European") es la codificación más permisiva; cada byte es un punto de código válido.
Por supuesto, ya no va a entender el UTF-8 genuino ni ninguna otra codificación que no sea cp1252, pero parece que no le preocupa demasiado.
Incorrect string value: ''/xD0/xBE/xDO/xB2. ...'' for ''content'' at row 1
un error similar ( Incorrect string value: ''/xD0/xBE/xDO/xB2. ...'' for ''content'' at row 1
). Intenté cambiar el conjunto de caracteres de la columna a utf8mb4
y luego el error cambió a ''Data too long for column ''content'' at row 1''
.
Resultó que mysql me muestra un error erróneo. Volví el conjunto de caracteres de la columna a utf8
y cambié el tipo de columna a MEDIUMTEXT
. Después de eso, el error desapareció.
Espero que esto ayude a alguien.
Por cierto, MariaDB en el mismo caso (he probado el mismo INSERT allí) simplemente corta un texto sin error.