Неверное строковое значение: '\\xA0Consu' для столбца, даже если столбец имеет кодировку utf8mb4.

Я запускаю скрипт Python для вставки записи в таблицу. Я читаю данные из электронной таблицы, содержащие ячейки со специальными символами.

В моем сценарии я запускаю следующие команды перед выполнением следующих команд:

SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
SET character_set_connection=utf8mb4;
SET collation_connection = utf8mb4_unicode_ci;

Вот структура моей таблицы:

CREATE TABLE `staging` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`d_date` date NOT NULL,
`m_date` date NOT NULL,
`market` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'US',
`cola` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
`colb` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=265 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Кодировка таблицы: UTF8MB4 Сопоставление таблицы: UTF8MB4_UNICODE_CI

Переменные среды:

ПОКАЗАТЬ ПЕРЕМЕННЫЕ, КАК '%collation%';

collation_connection    latin1_swedish_ci
collation_database  utf8mb4_unicode_ci
collation_server    utf8mb4_unicode_ci

ПОКАЗАТЬ ПЕРЕМЕННЫЕ, КАК '%char%';

character_set_client    latin1
character_set_connection    latin1
character_set_database  utf8mb4
character_set_filesystem    binary
character_set_results   latin1
character_set_server    utf8mb4
character_set_system    utf8
character_sets_dir  /usr/local/mysql-5.7.20-macos10.12-x86_64/share/charsets/

Запрос:

insert into staging (d_date, m_date, market, cola, colb ) 
values ('2019-07-18', '2019-07-01', 'US', 'ARCA', 'Sodius\xa0Consumer Auto');

Ошибка:

_mysql_exceptions.OperationalError: (1366, "Incorrect string value: '\\xA0Consu...' for column 'colb' at row 1")

Ожидаемый результат: строка должна быть вставлена ​​в базу данных.


person Amit S    schedule 19.07.2019    source источник
comment
Этот строковый литерал, показанный в операторе INSERT, должен оцениваться без ошибок. Символ обратной косой черты будет удален, потому что символ, следующий за ним, не образует допустимую управляющую последовательность MySQL. Sodiusxa0Con... (Если sql_mode включает NO_BACKSLASH_ESCAPES, то символ обратной косой черты будет рассматриваться как обычный символ.) Я подозреваю, что оператор SQL, показанный в вопросе, со строковым литералом, не является фактическим оператором. казнен.   -  person spencer7593    schedule 20.07.2019
comment
@ spencer7593 да, запрос не является точным запросом. Я скопировал это из вывода команды.   -  person Amit S    schedule 20.07.2019
comment
Настоящее слово - Sodius † Consumer Auto.   -  person Amit S    schedule 20.07.2019


Ответы (1)


Это говорит о том, что кодировка в клиенте UTF-8: SET NAMES utf8mb4;

Это говорит о том, что кодировка в клиенте latin1:\xa0.

Это говорит о том, что cola будет в кодировке UTF-8, вне зависимости от того, что у клиента: cola varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL.

Они говорят, что вы сделали SET NAMES latin1:

character_set_client    latin1
character_set_connection    latin1
character_set_results   latin1

Если вам действительно нужен \xA0 (жесткий пробел), то весь текст в клиенте тоже должен быть latin1, и вы должны сказать SET NAMES latin1 (или... -- есть несколько способов сделать это).

Если вам все равно, какой тип пространства вы используете, используйте простое пространство.

Если остальная часть клиента использует UTF-8, и вам нужен «неразрывный пробел», тогда ИСПОЛЬЗУЙТЕ \xc2a0 (кодировка UTF-8).

person Rick James    schedule 19.07.2019
comment
Привет Рик, Большое спасибо за ваш ответ. Понятно. Теперь работает. - person Amit S; 20.07.2019