UTF8mb4 unicode, нарушающий драйвер MariaDB JDB C - PullRequest
2 голосов
/ 03 августа 2020

У меня есть названия продуктов, которые содержат символы Юникода

⚠️?ПРОЧИТАЙТЕ! РАБОТАЮЩАЯ ЦИФРОВАЯ КАМЕРА KODAK DC215 ZOOM 1.0MP - ПРОДАВЕЦ В Великобритании

Запрос в heidi SQL показывает, что это нормально

введите описание изображения здесь

Сегодня утром я установил новую MariaDB, переместившись с MySQL, но когда записи извлекаются через запрос ColdFusion с использованием MariaDB JDB C, я получаю

java.lang.StringIndexOutOfBoundsException: begin 0, end 80, length 74
    at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3410)
    at java.base/java.lang.String.substring(String.java:1883)
    at org.mariadb.jdbc.internal.com.read.resultset.rowprotocol.TextRowProtocol.getInternalString(TextRowProtocol.java:238)
    at org.mariadb.jdbc.internal.com.read.resultset.SelectResultSet.getString(SelectResultSet.java:948)

Сортировка поля productname - utf8mb4_unicode_520_ci, я пробовал несколько вариантов. Я попытался установить это на уровне таблицы и базы данных, где это позволяло.

Строка подключения JDB C в администраторе ColdFusion: jdbc:mysql://localhost:3307/usedlens?useUnicode=true&characterEncoding=UTF-8

Я заметил, что база данных live production где MariaDB использовался с самого начала, у меня нет этой проблемы, но кодировка по умолчанию - latin1, и та же запись является базой данных как

???? ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ! РАБОЧАЯ ЦИФРОВАЯ КАМЕРА KODAK DC215 ZOOM 1.0MP - ПРОДАВЕЦ В Великобритании

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Вот как мы удаляем высокие символы ASCII, сохраняя при этом любые символы, которые могут быть спасены:

string function ASCIINormalize(string inputString=""){
    return createObject( 'java', 'java.text.Normalizer' ).normalize( javacast("string", arguments.inputString) , createObject( 'java', 'java.text.Normalizer$Form' ).valueOf('NFD') ).replaceAll('\p{InCombiningDiacriticalMarks}+','').replaceAll('[^\p{ASCII}]+','');
}

productname = ASCIINormalize(productname);

/*
Comparisons using java UDF versus reReplace regex:

"ABC   Café ’test"  (note: High ASCII non-normal whitespace characters used.)
   ASCIINormalize = "ABC Cafe test"
   reReplace = "ABC Caf test"

"čeština"
   ASCIINormalize = "cestina"
   reReplace = "etina"

"Häuser Bäume Höfe Gärten"
   ASCIINormalize = "Hauser Baume Hofe Garten"
   reReplace = "Huser Bume Hfe Grten"
*/
1 голос
/ 04 августа 2020

Это связано с последовательностью символов высокого кода ASCII, которые образуют смайлы. Я столкнулся с аналогичными проблемами при экспорте данных MS SQL в файл UTF-8 для преобразования в Excel с помощью стороннего инструмента. В этом случае база данных и файл были правильными, но сторонний инструмент выдавал sh при обнаружении символов эмодзи.

Наш подход к этому заключался в преобразовании эмодзи в их псевдонимы, чтобы информация не терялась в процессе. (Если вы удалите символы высокого ASCII, вы можете потерять некоторый контекст.) Чтобы дезинфицировать смайлы для использования псевдонимов, я написал этот ColdFusion cf-emoji- java (CF C) для использования emoji- java (файл JAR) для преобразования смайлов в их безопасные для ASCII7 псевдонимы.

emojijava = new emojijava();
emojijava.parseToAliases('I like ?');   // I like :pizza:
0 голосов
/ 04 августа 2020

Так как ...

  • Я не занимаюсь поддержкой смайлов
  • Мои данные - это просто названия продуктов, ориентированные на Великобританию, Европу и США для в обозримом будущем
  • Я не хочу иметь go из-за той же проблемы с производством (уже по умолчанию latin1_swedish_ci)

Я решил ..

Соответствие продукции, поэтому я установил для базы данных, таблицы и полей значение latin1_swedish_ci с помощью

Как изменить НАБОР СИМВОЛОВ (и СОВЕРШЕНИЕ) во всей базе данных?

и удалите символы, отличные от ASCII, в названии продукта

== edit не делайте этого, он убирает слишком много полезных символов ==

<cfset productname = reReplace(productname, "[^\x20-\x7E]", "", "ALL")>
...