Статистический символ mysql в имени продукта заменяется на? отметить [дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

207
задан Mojtaba Rezaeian 6 May 2015 в 10:47
поделиться

3 ответа

UTF-8 - кодирование переменной длины. В случае UTF-8 это означает, что для хранения одной кодовой точки требуется от одного до четырех байтов. Однако в кодировке MySQL, называемой «utf8», хранится максимум три байта на кодовую точку.

Таким образом, набор символов «utf8» не может хранить все кодовые точки Unicode: он поддерживает только диапазон от 0x000 до 0xFFFF, который называется « Basic Multilingual Plane ». См. Также Сравнение кодировок Unicode .

Это то, что должна сказать об этой документации MySQL :

Набор символов с именем utf8 использует максимум три байта на символ и содержит только символы BMP. Начиная с MySQL 5.5.3, набор символов utf8mb4 использует максимум четыре байта на символ, который поддерживает дополнительные символы:

  • Для символа BMP utf8 и utf8mb4 имеют одинаковые характеристики хранения: одинаковые значения кода, то же кодирование одинаковой длины.
  • Для дополнительного символа utf8 не может хранить символ вообще, а utf8mb4 требует четырех байтов для его сохранения. Поскольку utf8 не может хранить символ вообще, у вас нет дополнительных символов в столбцах utf8, и вам не нужно беспокоиться о преобразовании символов или об утрате данных при обновлении данных utf8 из более старых версий MySQL.

Итак, если вы хотите, чтобы ваша колонка поддерживала сохранение символов, лежащих вне BMP (и вы обычно хотите), например emoji , используйте «utf8mb4». См. Также . Каковы наиболее распространенные символы без символов BMP Unicode в реальном использовании? .

219
ответ дан CodeCaster 19 August 2018 в 18:29
поделиться
  • 1
    Единственные случаи, с которыми я столкнулся (пока), где utf8mb4 был «обязательным», - это китайский и смайлики. Есть неясные алфавиты, которые в этом нуждаются. – Rick James 6 May 2015 в 20:33
  • 2
    Это не должно требоваться для китайского - китайского + корейского + японского, должно быть, все в базовом многоязычном плане, который охватывает MySQL utf8. Тем не менее, нет оснований не использовать utf8mb4 сейчас, и действительно это необходимо для всех новых emoji, например – thomasrutter 26 August 2015 в 02:12
  • 3
    Его также необходимо, если вы используете для хранения зашифрованных паролей и данных в своей базе данных. Я сохранял зашифрованный пароль в mysql, используя обычный формат utf8, который вызывал у меня много проблем с некоторыми паролями случайным образом и очень трудно отлаживать, поэтому я попытался использовать кодировку base64 и исправил проблему временно. Но теперь я знаю причину. – Mojtaba Rezaeian 20 January 2016 в 10:21
  • 4
    Зашифрованные данные @idealidea являются двоичными, и вы не должны хранить двоичные данные в столбце varchar. :) – CodeCaster 20 January 2016 в 10:33
  • 5
    @CodeCaster Конечно, вы правы. Глупо, что я сделал. Но иногда вы предпочитаете показывать двоичные данные в строках: D, он отлично работал на моем опыте. Но теперь я знаю, что это может вызвать более поздние проблемы, такие как поиск, индексирование, производительность и некоторые другие непредвиденные проблемы для механизма базы данных. – Mojtaba Rezaeian 20 January 2016 в 10:46
  • 6
    – D3ad L0cK 27 March 2018 в 09:48

Набор символов utf8mb4 полезен, потому что в наши дни нам нужна поддержка для хранения не только символов языка, но и символов, недавно введенных emojis и т. д.

Хорошее чтение на поддержка полного Unicode в базах данных MySQL от Mathias Bynens также может пролить свет на это.

25
ответ дан Mathieu K. 19 August 2018 в 18:29
поделиться
1
ответ дан simhumileco 31 October 2018 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: