Я изучил JDBC некоторое время назад и подключился к MySQL, чтобы получить данные. Согласно данным примера учителя, мне пришлось сохранить некоторую информацию, такую как имена, и все они были на английском языке. Я не хотел использовать английский в то время, поэтому я сохранил имя своего соседа по комнате. Хе -хе, в результате, что -то пошло не так.
Подключитесь к оператору базы данных:
Статическая конечная строка db_url = "jdbc: mysql: // localhost/filemanage";
Заявление запроса:
Приватная статическая конечная строка TheuserQuery = "Выберите имя, пароль, роль из userInfo, где имя =?";
Я использую свое имя для запроса, NullPointerException, очевидно, что с моим именем не было найдено соответствующих данных, и оно существует в базе данных. Почему это?
Ответ от Baidu - китайский искаженный код. Решение состоит в том, чтобы изменить оператор базы данных подключения на:
Статическая конечная строка db_url = "jdbc: mysql: // localhost/filemanage? useUnicode = true & hareverencoding = gbk";
Попробуйте еще раз!
Ничего страшного! Но почему это? Что это за два параметра? Почему проблема была решена после добавления?
Эти два параметра объясняются следующим образом:
Значения по умолчанию для обоих параметров являются ложными. Другими словами, когда мы указываем набор символов, используемый для соединения при подключении MySQL, все нормально. Но я до сих пор мало знаю о механизме, поэтому я продолжаю проверять его.
Оказывается, есть процесс преобразования набора символов, когда соединение MySQL выполняет запросы и другие операции:
1. Когда MySQL Server получает запрос, преобразует данные запроса из FARCES_SET_CLIENT в FARCES_SET_CONNECTION;
2. Перед выполнением внутренних операций преобразование запрошенных данных из Parmate_set_connection в внутренний набор символов операции. Метод определения следующим образом:
• Используйте значение набора символов для каждого поля данных;
• Если вышеуказанное значение не существует, используйте значение набора символов по умолчанию (расширение MySQL, стандарт не-SQL) соответствующей таблицы данных;
• Если приведенное выше значение не существует, используется значение набора набора символов по умолчанию соответствующей базы данных;
• Если вышеуказанное значение не существует, используйте символ_SET_SERVER, чтобы установить значение.
3. Преобразовать результат операции из внутренней операции, установленного в символ_SET_RESULT.
Что представляют эти наборы символов?
FARCES_SET_SERVER: Набор символов Внутренней работы по умолчанию
farmate_set_client: набор символов, используемый данными клиента
farmate_set_connection: набор символов подключения слоя
Parmate_set_results: набор символов результатов запроса
FARCES_SET_DATABASE: набор символов по умолчанию в данный момент выбранной базы данных
Parmate_set_system: система метаданных систем (имя поля и т. Д.) Набор символов
Я также нашел несколько общих вопросов. Хотя они отличаются от моих, они имеют большую справочную ценность.
• Перед тем, как вставить UTF8-кодируемые данные в таблицу данных с набором символов по умолчанию, набор символов подключения, набор символов подключения-UTF8.
При вставке, в соответствии с настройками по умолчанию сервера MySQL, характер_SET_CLIENT, Характер_SET_CONNECTION и характер_SET_RESULTS - это latin1;
Данные операции вставки пройдут процесс преобразования набора символов Latin1 => latin1 => utf8. Во время этого процесса каждый вставленный китайский символ будет сохранен от исходных 3 байтов до 6 байт;
Результат во время запроса пройдет процесс преобразования набора символов UTF8 => UTF8, а сохраненные 6 байтов возвращаются нетронутыми, что приводит к искаженному коду ...
• Установите набор символов подключения в UTF8, прежде чем вставить UTF8, кодируемые данными в таблицу данных с набором символов по умолчанию, является Latin1.
При вставке, символ_SET_CLIENT, характер_SET_CONNECTION и характер_SET_RESULT - все это UTF8;
Данные вставки будут преобразованы через набор символов UTF8 => utf8 => latin1. Если исходные данные содержат символы Unicode, кроме диапазона /U0000 ~ /u00ff, они будут преобразованы в "?" (0x3f) символ, потому что он не может быть представлен в наборе символов Latin1. В будущем, независимо от того, что установлен набор символов соединения, его контент не может быть восстановлен.
(Эта часть выходит из блога Brother Bird, а ссылка прикреплена позже)
Таблицы в моей базе данных устанавливаются с помощью кодирования UTF8, но когда я впервые подключился, я не установил набор символов подключения, поэтому по умолчанию есть Latin1. После преобразования из UTF8 => Latin1 генерируется искаженное код. Кодирование GBK, которое я использовал во второй раз, и я не использовал кодирование UTF8. Почему это нормально? На самом деле, это то же самое. Китайцы не находятся в кодировании латинского 1, а в GBK и UTF8, поэтому проблем не будет.
Приведенное выше является решением искаженного исключения соединения JDBC с MySQL. Если у вас все еще есть какие -либо вопросы, вы можете обсудить это в области комментариев ниже.