Я думаю, что varchar (20) требует только 21 байт, а varchar (500) требует только 501 байт. Таким образом, суммарные байты 522, меньше 767. Итак, почему я получил сообщение об ошибке?
blockquote>UTF8 требует 3 байта на символ для хранения строки, поэтому в вашем случае 20 + 500 символов = 20 * 3 + 500 * 3 = 1560 байт, что более чем допустимо 767 байт.
Предел для UTF8 равен 767/3 = 255 символов, для UTF8mb4, который использует 4 байта на символ, это 767 / 4 = 191 символ.
. Если вам нужно использовать более длинный столбец, чем предел, это два решения:
- Используйте «более дешевую» кодировку ( один, который требует меньше байтов на символ). В моем случае мне нужно было добавить уникальный индекс в столбец, содержащий строку SEO-статьи, поскольку я использую только символы
[A-z0-9 \ -]
для SEO, Я использовалlatin1_general_ci
, который использует только один байт на символ, поэтому столбец может иметь длину 767 байт.- Создайте хэш из своего столбца и используйте уникальный индекс только для этого. Другим вариантом для меня было создание другого столбца, в котором будет храниться хэш SEO, этот столбец имел бы
UNIQUE
ключ для убедитесь, что значения SEO уникальны. Я бы также добавил индексKEY
в исходную колонку SEO, чтобы ускорить поиск.
Acc. to Java Docs :
, если поток изменяет коллекцию напрямую, когда она выполняет итерацию по коллекции с быстрым итератором, итератор будет генерировать это исключение.
blockquote>Вы пытаетесь добавить объект
Person
во время повтора с помощью Enhanced For loop .Вы можете выполнить следующую модификацию:
boolean duplicateFound = false; for(Person p : ps) { if(p.name.equals(p1.name)) { duplicates.add(p1); duplicateFound = true; } } if( ! duplicateFound) { ps.add(p1); }
Итераторы, возвращенные ArrayList в природе fail-fast
.
Итераторы, возвращаемые итератором этого класса, и
blockquote>listIterator
fail-fas
t: если список структурно модифицируется в любое время после создания итератора, любым способом, кроме как через собственные методы удаления или добавления итератора, итератор будет бросатьConcurrentModificationException
. Таким образом, перед лицом одновременной модификации итератор быстро и чисто, а не рискует произвольным, недетерминированным поведением в неопределенное время в будущем.Где этот итератор приходит из в то время как я его не использую?
Для расширенного цикла для коллекций
Iterator
используется, поэтому вы не можете вызывать методadd
во время повтора.Итак, ваш цикл то же, что и ниже
for (Iterator<Entry> i = c.iterator(); i.hasNext(); ){
Что такое решение? Тогда?
Вы можете вызвать
iterator.add();
и изменить цикл на основе итератора явно, а не неявно.String inputWord = "john"; ArrayList<String> wordlist = new ArrayList<String>(); wordlist.add("rambo"); wordlist.add("john"); for (ListIterator<String> iterator = wordlist.listIterator(); iterator .hasNext();) { String z = iterator.next(); if (z.equals(inputWord)) { iterator.add("3"); } } System.out.println(wordlist.size());
Теперь, где я могу узнать больше?