Aprendi o JDBC há algum tempo e conectei ao MySQL para obter dados. De acordo com os dados de amostra do professor, tive que salvar algumas informações como nomes, e todos eram em inglês. Eu não queria usar o inglês na época, então salvei o nome do meu colega de quarto. Hehe, como resultado, algo deu errado.
Conecte -se à instrução do banco de dados:
String final estática db_url = "jdbc: mysql: // localhost/filemaning";
Declaração de consulta:
String final estática privada theUserQuery = "Selecione nome, senha, função do userInfo onde nome =?";
Estou usando meu nome para consultar, NullPointerException, é óbvio que nenhum dado correspondente foi encontrado com meu nome e existe no banco de dados. Por que isso?
A resposta do Baidu é um código chinês ilegal. A solução é modificar a instrução de banco de dados de conexão para:
String final estática db_url = "jdbc: mysql: // localhost/FileManagement? useUnicode = true & caracteryEncoding = gbk";
Tente de novo!
Tudo bem! Mas por que isso é isso? Quais são esses dois parâmetros? Por que o problema foi resolvido após adicioná -lo?
Esses dois parâmetros são explicados da seguinte forma:
Os valores padrão para ambos os parâmetros são falsos. Em outras palavras, quando especificamos o conjunto de caracteres usado para a conexão ao conectar o MySQL, tudo é normal. Mas ainda não sei muito sobre o mecanismo, então continuo verificar.
Acontece que existe um processo de conversão de conjunto de personagens quando a conexão MySQL executa consulta e outras operações:
1. Quando o MySQL Server recebe a solicitação, converte os dados da solicitação de caractere_set_client para caractere_set_connection;
2. Antes de executar operações internas, converta os dados solicitados de caracteres_set_connection para o conjunto de caracteres da operação interna. O método de determinação é o seguinte:
• Use o valor da configuração do conjunto de caracteres para cada campo de dados;
• Se o valor acima não existir, use o valor padrão de configuração do conjunto de caracteres (extensão MySQL, padrão não-SQL) da tabela de dados correspondente;
• Se o valor acima não existir, o valor padrão de configuração do conjunto de caracteres do banco de dados correspondente será usado;
• Se o valor acima não existir, use caractere_set_server para definir o valor.
3. Converta o resultado da operação do caractere de operação interno definido como caractere_set_results.
O que esses conjuntos de personagens representam?
Caracter_set_server: conjunto de caracteres de operação interna padrão
Caracter_set_client: o conjunto de caracteres usado pelos dados de origem do cliente
Caracter_Set_Connection: Conjunto de caracteres da camada de conexão
Caracter_Set_Results: Conjunto de caracteres de resultados de consulta
Caracter_set_database: o conjunto de caracteres padrão do banco de dados atualmente selecionado
Caracter_set_system: metadados do sistema (nome do campo, etc.) Conjunto de caracteres
Eu também encontrei algumas perguntas comuns. Embora sejam diferentes dos meus, eles são de grande valor de referência.
• Antes de inserir dados codificados por UTF8 em uma tabela de dados com o conjunto de caracteres padrão é UTF8, o conjunto de caracteres de conexão é UTF8.
Ao inserir, de acordo com as configurações padrão do servidor MySQL, caractere_set_client, caractere_set_connection e caractere_set_results são latin1;
Os dados da operação de inserção passarão pelo processo de conversão do conjunto de caracteres de latim1 => latim1 => utf8. Durante esse processo, cada caractere chinês inserido será salvo dos 3 bytes originais a 6 bytes;
O resultado durante a consulta passará pelo processo de conversão do conjunto de caracteres de UTF8 => UTF8, e os 6 bytes salvos são retornados intactos, resultando em código ilegal ...
• Defina o caractere de conexão definido como UTF8 antes de inserir dados codificados por UTF8 em uma tabela de dados com o conjunto de caracteres padrão é Latin1.
Ao inserir, caractere_set_client, caractere_set_connection e caractere_set_results são todos UTF8;
Os dados de inserção serão convertidos através do conjunto de caracteres de utf8 => utf8 => latin1. Se os dados originais contiver caracteres unicode que não /u0000 ~ /u00ff, eles serão convertidos para o "?" (0x3f) Símbolo porque não pode ser representado no conjunto de caracteres de latim1. No futuro, não importa o conjunto de caracteres de conexão, seu conteúdo não pode ser restaurado.
(Esta parte é extraída do blog do irmão Bird, e o link está anexado mais tarde)
As tabelas no meu banco de dados estão todas definidas com a codificação UTF8, mas quando eu conectei, não defini o conjunto de caracteres de conexão, então o padrão é Latin1. Após a conversão de UTF8 => Latin1, o código ilegal é gerado. A codificação GBK que usei pela segunda vez e não usei a codificação UTF8. Por que está tudo bem? Na verdade, é a mesma coisa. O chinês não está na codificação Latin1, mas no GBK e UTF8, então não haverá problemas.
O exposto acima é a solução para a exceção distorcida da conexão JDBC com o MySQL. Se você ainda tiver alguma dúvida, poderá discuti -lo na área de comentários abaixo.