UTF-8, кодирующий принципы и белый список фильтров utf8mb4 (вызвано следующими причинами: java.sql.BatchUpdateException: неверное значение строки)

В эти дни встречаются данные Mysql сообщенных для падения ошибки кодирования:

Caused by: java.sql.BatchUpdateException: Incorrect string value: '\xF0\x9F\x98\x8A',...' for column 'statement_text' at row 1

Caused by: java.sql.BatchUpdateException: Incorrect string value: '\xF0\xA0\x81\x81%'...' for column 'statement_sample' at row 1

Интернет обеспечивает большую часть решения заключается в изменении конфигурации базы данных, но база данных, если пул подключений не может гарантировать, что вы не указали UTF-8 Shi других соединений, он не может избежать загрязнений других соединений пула соединений. Вот еще одно решение, отфильтровывая специальные символы.

Сегмент 1 UTF-8 кодировке

UTF-8 (8-битовый формат преобразования Unicode) является переменной длины символов Unicode для кодирования, также префикс кода. Он может быть использован для представления любого символа в стандарте Unicode, и кодирование первого байта по-прежнему совместим с ASCII, что делает программное обеспечение обработки исходных символов ASCII не требуется или только небольшая часть изменений, вы можете продолжать использовать. Таким образом, он постепенно становится кодированный электронной почты, веб-страниц и другого хранения или отправить текст, принятый приоритет.

1.0 Символы методы запроса

http://www.fileformat.info/info/unicode/char/xxxxx/index.htm

Заменить ххую необходимость запроса символов шестнадцатеричной кодировку

УЛЫБАЯСЬ пример FACE эмодзи кодирования является 1f60a: запрос адреса
символ кодируется как 61: Запрос адреса

1,1 Ascii

только 128 US-ASCII символов один байт, кодирующий (диапазон Юникода U + 0000 до U + 007F)

например

Шестигранный (Java) график
«\ U0060» `
«\ U0061» a
«\ U0062» б
"\ U0063" с
«\ U0064» d
«\ U0065» е

1,2 Latin и т.д.

Latin с дополнительными символами, греческий, кириллица, армянском, иврите, арабском, сирийском и Тана потребностей кодирования два байта (диапазон Юникода U + 0080 до U + 07FF ).

Шестигранный (Java) график подключение запросов
«\ U0550» U ссылка на сайт
«\ U0450» или ссылка на сайт

1.3 китайский и т.д.

Другие базовая многоязычная плоскость (BMP) символы (который включает в себя наиболее часто используемые слова, такие как большинство китайских символов), используя три байта, кодирующий (диапазон Юникода U + 0800 до U + FFFF).

Шестигранный (Java) график подключение запросов
"\ U9AD8" высокая ссылка на сайт
"\ U738B" король ссылка на сайт

1,4 Другие

Другой символ Юникода редко используется вспомогательная плоскость с помощью четырех до шести байт кодировки (диапазон Юникода U + 10000 до U + 1FFFFF используя четыре байта, диапазон Юникода U + 200000 для использования U + 3FFFFFF из пяти байт, диапазон Юникода U + 4000000 на U + 7fffffff используя шесть байтов).

Шестигранный (Java) график подключение запросов
«\ UD83D \ uDE0A» ? ссылка на сайт
"\ UD83D \ uDE0F" ? ссылка на сайт

2 UTF-8 кодировке Байт Значение

  • Для UTF-8, кодирующий любой байт B, B, если первый бит равен 0, то В независимо друг от друга представляют собой символ (ASCII-код);
  • Если первый бит B равен 1, второй бит равен 0, то байты В представляют собой (не-ASCII символы) в многобайтовом характере а;
  • Если первые два бита B 1, третий бит равен 0, то В представляет собой двухбайтовый символ, представленный первого байта;
  • Если верхние три Б 1, четвертые бит равен 0, персонаж Б три байта в первых байтах;
  • Если первые четыре бита B 1, пятый бит равен 0, то В представляет четыре байта в первый байт символа;

Таким образом, для любого байта в UTF-8 кодирования в соответствии с первым, он может определить, следует ли ASCII символов, символ байт байт кодируется в соответствии с предшествующим первым двум, может быть определена; Первые четыре бит (если первые два бита равны 1), может определить, что первый байт является кодировка символов байт, и может определить соответствующий символ, представленный несколькими байтами, первые пять (если первые четыре бита 1 ), то можно определить, является ли кодированной ошибкой данных или есть ли ошибка во время передачи.

Точка Digit код Значения точек с Конечное значение точки кода Последовательность байтов Байт 1 Байт 2 Байт 3 Байт 4 Байт 5 Байт 6
7 U + 0000 U + 007F 1 0xxxxxxx
11 U + 0080 U + 07FF 2 110xxxxx 10xxxxxx
16 U + 0800 U + FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
21 U + 10000 U + 1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
26 U + 200000 U + 3FFFFFF 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
31 U + 4000000 U + 7fffffff 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • В диапазоне ASCII коды, с байтом за пределами диапазона ASCII, он говорит, что байты, которые сформировали представление мы уже видели выше, UTF-8, благо только тогда, когда код ASCII UNICODE файл, файлы сохраняются в виде байта, то ничем не отличается от обычного файла ASCII, когда чтение верно, она совместима с предыдущим файлом ASCII.
  • Больше, чем ASCII код, он будет указывать длину юникода характера бывших первыми байтами выше, такие как двоичное представление верхних три 110xxxxx сказал нам, что это был 2BYTE ЮНИКОДА характер; 1110xxxx было три символов UNICODE, и так далее; ххх позиции битов, представленное кодирования символов двоичных чисел, заполненных. Право х имеет меньше особое значение. Выражая характер только с достаточным количеством последовательности многобайтовой, кодирующей самый короткий. Обратите внимание, что в строке с многобайтовой, числом начала первого байта «1» представляет собой целое число байт в строке.

3 Java-фильтр 4 UTF-8 кодированное слово длины символов (длина слова скрытность 3)

  • Как упоминалось выше 1.2, и 1.3, длина слова кодирования в значительной степени сохранила свои обычные символы, используйте белый список, чтобы сохранить эту часть потребностей персонажа встречаются общий бизнес, фильтр из определенных строк (MYSQL, чтобы решить проблему специальных символов не может быть вставлен ).

  • 4-слово символ Unicode UTF-8 символов ПКМ (вспомогательная плоскость), что больше символов кода U + FFFF Unicode, поэтому нужно только, чтобы получить строку символов каждого кода точки, когда код пункта больше, чем FFFF (или непосредственно использоваться для определения Character.isSupplementaryCodePoint), могут быть отфильтрованы.

Пример кода выглядит следующим образом:

    @Test
    public void filterUtf8mb4Test() {
        String s = "a中\uD83D\uDD11a中";
        log.info(filterUtf8mb4(s));
    }

    public static String filterUtf8mb4(String str) {
        final int LAST_BMP = 0xFFFF;
        StringBuilder sb = new StringBuilder(str.length());
        for (int i = 0; i < str.length(); i++) {
            int codePoint = str.codePointAt(i);
            if (codePoint < LAST_BMP) {
                sb.appendCodePoint(codePoint);
            } else {
                i++;
            }
        }
        return sb.toString();
    }

Выход:

a中a中

4 Некоторые замечания

Я не хочу, чтобы перезапустить программу

Выполните следующие действия в текущем сеансе перед выполнением второго выборов

set character_set_client = utf8mb4;

SET NAMES utf8mb4;

запись модификация сервера

(Для того, чтобы изменить все, изменение над перезапуском)

[client] 
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci
[mysql] 
default-character-set = utf8mb4

Обратитесь к официальной документации
тузда поле Значения
параметра
набору символов

SQL для изменения набора символов

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(length) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

5 ссылок

Набор символов Источник данных
https://zh.wikipedia.org/wiki/UTF-8
http://www.fileformat.info
https://www.cnblogs.com/chrischennx/p/6623610.html
изменять базы данных , пожалуйста , ссылка
https://blog.csdn.net/hzw19920329/article/details/55670782

Опубликовано 27 оригинальных статей · вона похвала 2 · просмотров 50000 +

рекомендация

отblog.csdn.net/jackgo73/article/details/89957646