Проблемы с кодировкой в ​​базе данных Mysql - PullRequest
2 голосов
/ 15 января 2011

У меня есть таблица в схеме Mysql 5.1.Заявление для создания этой таблицы:

CREATE TABLE `prova` (

  `id` varchar(150) NOT NULL,
  `name` varchar(150) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)

) ENGINE=InnoDb DEFAULT CHARSET=ucs2;

У меня также есть Java-приложение, работающее на Ubuntu 10.10, которое записывает записи в эту таблицу с интерфейсом Connector / J 5.1.14.Вставка записей выполняется с помощью класса Prepared Statement.

При вставке нескольких записей, которые отличаются для отмеченного символа (например, ('aki kaurismäki', 'aki kaurismäki') и ('aki kaurismaki', 'aki kaurismaki')) Я получаю исключение Дубликат ключа на второй записи.Я попытался напечатать запрос в PreparedStatement перед выполнением, и он кажется правильным (я попытался выполнить этот запрос вручную из клиента командной строки mysql и получить любую ошибку).

Как я мог решить эту проблему?Заранее спасибо, Антонио

Ответы [ 3 ]

0 голосов
/ 15 января 2011

Вероятно, это связано с тем, что для сопоставления установлено одинаковое сравнение символов, если они акцентированы, или даже просто другой регистр (верхний и нижний регистр)Что вам, вероятно, нужно сделать, это установить параметры сортировки в двоичную форму, если вы хотите, чтобы акцентированные символы сравнивались таким образом.Недостатком этого является то, что он также будет чувствительным к регистру, что может или не может быть то, что вы хотите.Я не думаю, что есть сортировка для чувствительного к акценту, но не чувствительного к регистру.

0 голосов
/ 15 января 2011

Может быть, это связано с сопоставлением таблицы?

Примеры эффекта сопоставления http://dev.mysql.com/doc/refman/5.0/en/charset-collation-effect.html

Наборы символов соединения и сопоставления http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

0 голосов
/ 15 января 2011

Это потому, что, как сказано в комментарии, кодировки Unicode в MySQL внутренне нормализуют акцентированные символы в сравнениях, что приводит к

 kaurismäki = kaurismaki

из руководства :

Чтобы дополнительно проиллюстрировать, следующие равенства выполняются как в utf8_general_ci, так и в utf8_unicode_ci (эффект, который это оказывает в сравнениях или при поиске, см. В разделе 9.1.7.8, «Примеры эффекта сравнения»):

Ä = A 
Ö = O 
Ü = U

в моем понимании, создание столбца индекса ucs2_bin должно разобраться.Двоичное сравнение не нормализует акцентированные символы.

...