Моя система имеет дело с испанскими данными. Я использую laravel + mysql. Моя сортировка базы данных — latin1 — сортировка по умолчанию, и моя структура таблиц выглядит примерно так:
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) CHARACTER SET latin1 NOT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=298 DEFAULT CHARSET=utf8mb4;
Есть несколько вопросов:
Я загружаю данные из файла в БД. Это хорошая практика для
utf8_encode ($ name) перед вставкой в БД? В настоящее время я делаю это,
еще ошибка сравнения: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_unicode_ci,COERCIBLE) for operation '='
Если использование utf8_encode — путь, нужно ли мне utf8_encode даже имя, которое я хочу найти? то есть выберите … где имя =
utf8_encoded (имя)?
Есть ли недостатки или лучший способ справиться с вышесказанным? Как я делаю испанский впервые (персонажи с акцентами).
Ваш product.name
столбец имеет набор символов latin1
, Ты знаешь что. Это также имеет сопоставление latin1_swedish_ci
, Это по умолчанию. Оригинальные разработчики MySQL — шведские. Поскольку вы работаете на испанском языке, вы, вероятно, хотите использовать latin1_spanish_ci
для вашего сопоставления; это сортирует Ñ
после N
, Другие латиноязычные сопоставления сортируют их вместе.
Потому что ваш product.name
столбец хранится в латинице 1, это плохой, не хорошо, идея использовать utf8_encode()
на текст, прежде чем сохранить его в этом столбце.
Ваш лучший способ действий, особенно если ваше приложение новое, состоит в том, чтобы сделать набор символов для всех столбцов utf8mb4
, Это означает изменение определенного набора символов вашего name
колонка. Затем вы можете конвертировать текстовые строки в Unicode перед их сохранением.
Вероятно, было бы целесообразно сделать сопоставление по умолчанию для каждой таблицы. utf8mb4_spanish_ci
также. Объединения запекаются в индексы для varchar()
колонны. (Если вы работаете на традиционном испанском языке, в котором ch
это отдельное письмо, используйте utf8mb4_spanish2_ci
.)
Других решений пока нет …