Aprendí JDBC hace algún tiempo y me conecté a MySQL para obtener datos. Según los datos de muestra del maestro, tuve que guardar información como nombres, y todos estaban en inglés. No quería usar inglés en ese momento, así que guardé el nombre de mi compañero de cuarto. Jeje, como resultado, algo salió mal.
Conectarse a la declaración de la base de datos:
Cadena final estática db_url = "jdbc: mysql: // localhost/filemanagement";
Declaración de consulta:
Cadena final estática privada TheUserQuery = "Seleccione Nombre, Contraseña, Role de UserInfo Where Name =?";
Estoy usando mi nombre para consultar, NullPointerException, es obvio que no se encontraron datos correspondientes con mi nombre y existe en la base de datos. ¿Por qué es esto?
La respuesta de Baidu es el código confuso chino. La solución es modificar la instrucción de base de datos de conexión a:
Cadena final estática db_url = "JDBC: mysql: // localhost/filemanaement? UseUnicode = true & caracterSencoding = gbk";
¡Intentar otra vez!
¡Está bien! ¿Pero por qué es esto? ¿Cuáles son esos dos parámetros? ¿Por qué se resolvió el problema después de agregarlo?
Estos dos parámetros se explican de la siguiente manera:
Los valores predeterminados para ambos parámetros son falsos. En otras palabras, cuando especificamos el conjunto de caracteres utilizado para la conexión al conectar MySQL, todo es normal. Pero todavía no sé mucho sobre el mecanismo, así que sigo revisándolo.
Resulta que hay un proceso de conversión de establecimiento de caracteres cuando la conexión MySQL realiza consultas y otras operaciones:
1. Cuando MySQL Server recibe la solicitud, convierte los datos de solicitud de caracteres_set_client a caracteres_set_connection;
2. Antes de realizar operaciones internas, convierta los datos solicitados de caracteres_set_connection al conjunto de caracteres de operación interna. El método de determinación es el siguiente:
• Use el valor de configuración de caracteres para cada campo de datos;
• Si el valor anterior no existe, use el valor de configuración de configuración de caracteres predeterminado (extensión MySQL, estándar no SQL) de la tabla de datos correspondiente;
• Si el valor anterior no existe, se utiliza el valor de configuración de configuración de caracteres predeterminado de la base de datos correspondiente;
• Si el valor anterior no existe, use caracteres_set_server para establecer el valor.
3. Convierta el resultado de la operación del conjunto de caracteres de operación interna en caracteres_set_results.
¿Qué representan estos conjuntos de personajes?
caracteres_set_server: conjunto de caracteres de operación interna predeterminada
caracteres_set_client: el conjunto de caracteres utilizado por los datos de origen del cliente
caracteres_set_connection: conjunto de caracteres de capa de conexión
caracteres_set_results: conjunto de caracteres de resultados de consulta
caracteres_set_database: el conjunto de caracteres predeterminado de la base de datos actualmente seleccionada
caracteres_set_system: conjunto de caracteres metadatos del sistema (nombre de campo, etc.)
También encontré algunas preguntas comunes. Aunque son diferentes de los míos, son de gran valor de referencia.
• Antes de insertar datos codificados por UTF8 en una tabla de datos con el conjunto de caracteres predeterminado es UTF8, el conjunto de caracteres de conexión es UTF8.
Al insertar, de acuerdo con la configuración predeterminada del servidor MySQL, caracteres_set_client, caracteres_set_connection y caracteres_set_results son latin1;
Los datos de la operación de inserción pasarán por el proceso de conversión del conjunto de caracteres de Latin1 => Latin1 => UTF8. Durante este proceso, cada carácter chino insertado se guardará de los 3 bytes originales a 6 bytes;
El resultado durante la consulta pasará por el proceso de conversión del conjunto de caracteres de UTF8 => UTF8, y los 6 bytes guardados se devuelven intactos, lo que resulta en un código confuso ...
• Establezca el conjunto de caracteres de conexión en UTF8 antes de insertar datos codificados por UTF8 en una tabla de datos con el conjunto de caracteres predeterminado es Latin1.
Al insertar, caracteres_set_client, caracteres_set_connection y caracteres_set_results son todos utf8;
Los datos de inserción se convertirán a través del conjunto de caracteres de UTF8 => UTF8 => Latin1. Si los datos originales contienen caracteres Unicode que no sean /U0000 ~ /U00FF, se convertirá en el "?" (0x3f) Símbolo porque no se puede representar en el conjunto de caracteres de Latin1. En el futuro, sin importar el conjunto de caracteres de conexión, su contenido no se puede restaurar.
(Esta parte está extraída del blog de Brother Bird, y el enlace se adjunta más tarde)
Las tablas en mi base de datos están configuradas con la codificación UTF8, pero cuando me conecté por primera vez, no configuré el conjunto de caracteres de conexión, por lo que el valor predeterminado es LATIN1. Después de la conversión de UTF8 => Latin1, se genera código confuso. La codificación GBK que usé por segunda vez, y no usé la codificación UTF8. ¿Por qué está bien? En realidad, es lo mismo. El chino no está en la codificación LATIN1, sino en GBK y UTF8, por lo que no habrá problemas.
Lo anterior es la solución a la excepción de la conexión JDBC a MySQL. Si aún tiene alguna pregunta, puede discutirlo en el área de comentarios a continuación.