Как решить проблему с отображением некорректных символов при извлечении данных из таблицы MySQL?
Всем доброго дня/вечера/утра/денечка! Программа максимум: Приконнектиться к таблице в базе данных, вытащить строку данных из SQL Таблицы и передать ее в метод, который отправляет данные в WooCommerce REST API.
Проблема: Подключаюсь к базе данных, выполняю запрос, получаю "крякозябры" в консоли и соответственно кривая отправка данных в API
Пример кода извлечения данных ниже:
public class DatabaseConnector {
private static final String URL = "jdbc:mysql://DATABASE_IP:3306/default_db?useUnicode=true&characterEncoding=UTF-8"; // тут нейросетка посоветовала указать еще явную кодировку
private static final String USER = "USER";
private static final String PASSWORD = "PASSWORD";
public static void fetchAndProcessData() {
String query = "SELECT id, name, category " +
"FROM default_db.Promelec_Products " +
"WHERE REGEXP_REPLACE(name, '[[:space:]]', '') = name " +
"AND name NOT LIKE '% %'";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
while (rs.next()) { //тут начинаются танцы с бубном
String name = new String(rs.getBytes("name"), StandardCharsets.UTF_8);
String category = new String(rs.getBytes("category"), StandardCharsets.UTF_8);
System.out.println(name + " " + category);
ProductUploader.upload(name, category); //Отправляет данные в REST
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Вывод в консоли (В данном случае name + category) русских букв:
140��1201 140��1201, ������������ ��������� ���������������
А в следствие и кривая отправка данных в API
Сама таблица в БД настроена на: Charset: utf8mb4 Collation:utf8mb4_unicode_ci Оба столбца - это VARCHAR
Метод отправки 100% рабочий, так как инициализированные Строки корректно отправляются в API
А теперь уважаемые знатоки, ВНИМАНИЕ ВООПРОС!!
Как правильно извлечь данные из БД?
p.s. CSV - пробовал, та же петрушка настройка JVM - более менее рабочий метод, но не все буквы нормально декодятся
Вывод show variables like 'char%';
- Variable_name, Value
- 'character_set_client', 'utf8mb4'
- 'character_set_connection', 'utf8mb4'
- 'character_set_database','utf8mb4'
- 'character_set_filesystem', 'binary'
- 'character_set_results', 'utf8mb4'
- 'character_set_server', 'utf8mb4'
- 'character_set_system', 'utf8'
- 'character_sets_dir','/usr/share/mysql/charsets/'
Ответы (2 шт):
Смог решить эту проблему переписав все со Spring'ом (по другому не умею и не стал думать как)
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java:8.0.28'
Использовал эти зависимости
Описал класс сущности @Entity
для взаимодействия с таблицей
Взаимодействовал через интерфейс
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {}
Далее сформировал List и затем дергал данные из List циклом for, как итог никаких проблем с кодировками при извлечении данных из MySQL и корректная отправка в REST API WooCommerce
Так же прикладываю настройки которые необходимо указать в application.properties
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://УказатьHostIp:3306/default_db
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=false
С данной конфигурацией как минимум все запускается, как максимум дам знать позже