Составное уникальное ограничение, дающее ошибку, когда значение отсутствует (строка utf8 урезана) - PullRequest
0 голосов
/ 31 августа 2018

У меня есть таблица, а именно «теги». Структура которого выглядит следующим образом:

CREATE TABLE `tags` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_bin NOT NULL,
  `value` varchar(255) COLLATE utf8_bin NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  UNIQUE KEY `tags_name_value_unique` (`name`,`value`),
  KEY `tags_name_index` (`name`),
  KEY `tags_value_index` (`value`)
  ) ENGINE=InnoDB AUTO_INCREMENT=1380 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Получение похожих ошибок для разных значений. Ошибка частая, но случайная

SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись 'screen_name-Erika S' для ключа 'tags_name_value_unique' (SQL: вставить в tags (name, value, updated_at, created_at ) значения (screen_name, Erika Söll, 2018-08-29 08:21:55, 2018-08-29 08:21:55))

В этом случае значение Erika Söll не присутствовало в БД, тогда как значение Erika S было доступно в БД. У меня есть следующие вопросы:

  • Вставка выполняется со значением Erika Söll , так почему уникальное ограничение дает ошибку для Erika S ?
  • Есть тысячи таких ошибок, и после их анализа кажется, что значение сопоставляется до появления любого немецкого символа, такого как ö, ü, ß и т. Д. Почему индексы ведут себя так?
  • Это как-то связано с одновременным использованием ограничения уникальности и индекса? В этом случае сначала был создан индекс, а позже добавлено уникальное ограничение
  • Как это можно исправить?

Запросы для выбора и вставки значений следующие:

select * from теги where ( имя = 'screen_name' and значение = 'Klaudia-Krauß') limit 1

insert into метки ( имя , значение , updated_at , created_at ) values ('screen_name', 'Klaudia-Krauß', '2018-09-03 04:08:46', '2018-09-03 04:08:46')

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я столкнулся с проблемой сочетания PHP и MySQL. Проблема была связана с кодировкой данных. Данные, которые я получал, представляли собой комбинацию UTF8 и другой кодировки, то есть ISO-8859-1 в моем случае. В качестве исправления я написал следующий код, который решил мою проблему

public static function convertToUTF8($input)
{
    return !mb_check_encoding($input, 'UTF-8') ? utf8_encode($input) : $input;
}

Проверка mb_check_encoding($input, 'UTF-8') позволяет избежать кодирования строк, которые уже кодированы в UTF8.

0 голосов
/ 13 сентября 2018

При вставке в таблицу «Erika Söll» было усечено до «Erika S», то есть непосредственно перед первым акцентированным письмом. Это проблема набора символов. Больше обсуждений здесь , к тому же:

  • Байты, подлежащие сохранению, не кодируются как utf8. Исправьте это.
  • Также проверьте, что во время чтения установлено соединение utf8.

Не зная, используете ли вы PHP, Java, Python и т. Д., Я не могу быть более конкретным. Однако здесь могут быть советы , здесь .

Между тем, вероятно, вам вообще не нужен id, и 4 индекса можно упростить до двух:

PRIMARY KEY(`name`,`value`),
KEY `tags_value_index` (`value`)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...