Обновление mysql одним символом
Я использую mysql и в обновлениях "items" таблицы в переменной image_url "успешно" без предупреждений. Но на самом деле обновление не работает: оно добавляет значение с пробелом и удаляет последний символ значения, которое я ему даю.
Вот обновление:
UPDATE items
SET image_url = 'http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jpg'
WHERE id=38;
Вот выбор:
select * from items\G;
Вот одна строка вывода:
...
image_url: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jp
...
обратите внимание на отсутствие "g" в конце и дополнительное пространство в начале.
Как это остановить?
Вот информация о системе, которая может помочь:
mysql> show variables LIKE '%version%';
+-------------------------+-------------------------+
| Variable_name | Value |
+-------------------------+-------------------------+
| innodb_version | 5.5.46 |
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.5.46-0ubuntu0.14.04.2 |
| version_comment | (Ubuntu) |
| version_compile_machine | i686 |
| version_compile_os | debian-linux-gnu |
+-------------------------+-------------------------+
7 rows in set (0.00 sec)
EDIT 1 Описание таблицы:
mysql> desc items;
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
...
| image_url | varchar(255) | NO | | NULL | |
...
EDIT 2 Проверка триггеров:
mysql> show triggers \G
Empty set (0.00 sec)
EDIT 3 Другой пример:
Я выполняю все эти команды из командной строки. Другой пример:
UPDATE items SET image_url = 'http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jpg33333333333333' WHERE id=38;
select * from items\G;
...
image_url: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jpg3333333333333
...
EDIT 4 Проверка длины входов и выходов:
mysql> select image_url,length(image_url) from items where id=38\G;
*************************** 1. row ***************************
image_url: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jp
length(image_url): 61
1 row in set (0.00 sec)
http://www.lettercount.com/ дает http://ecx.images-amazon.com/images/I/61Dz5t8wjQL.SX522.jpg, что имеет смысл, учитывая, что обновление не меняет длину строки, просто удаляя последние символы и добавляя пробел в начало,
РЕДАКТИРОВАТЬ 5 Попытка кодирования:
кодировка base64:
aHR0cDovL2VjeC5pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS82MUR6NXQ4d2pRTC5fU1g1MjJfLmpwZw ==
mysql> UPDATE items SET image_url = 'aHR0cDovL2VjeC5pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS82MUR6NXQ4d2pRTC5fU1g1MjJfLmpwZw==' WHERE id=38;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select image_url,length(image_url) from items where id=38\G;
*************************** 1. row ***************************
image_url: aHR0cDovL2VjeC5pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS82MUR6NXQ4d2pRTC5fU1g1MjJfLmpwZw=
length(image_url): 84
1 row in set (0.00 sec)
: aHR0cDovL2VjeC5pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS82MUR6NXQ4d2pRTC5fU1g1MjJfLmpwZw =
дает:
http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jpg
РЕДАКТИРОВАТЬ 6 Проверка наличия вставки также:
mysql> INSERT INTO items (url, image_url) VALUES('http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jpg', 'http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jpg');
Query OK, 1 row affected, 2 warnings (0.03 sec)
предупреждения - это то, что я не дал все значения, где значения NULL: NO в этой вставке
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------+
| Warning | 1364 | Field 'created_at' doesn't have a default value |
| Warning | 1364 | Field 'updated_at' doesn't have a default value |
+---------+------+-------------------------------------------------+
2 rows in set (0.00 sec)
mysql> select image_url,length(image_url),url from items where id=39\G;
*************************** 1. row ***************************
image_url: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jp
length(image_url): 61
url: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jp
1 row in set (0.00 sec)
Таким образом, он также терпит неудачу при вставке.
РЕДАКТИРОВАТЬ 7 создать информацию о таблице
mysql> show create table items\G;
*************************** 1. row ***************************
Table: items
Create Table: CREATE TABLE `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
...
`image_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`color` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
...
`store` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_items_on_id` (`id`),
KEY `index_items_on_url` (`url`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)
ERROR:
No query specified
EDIT 8 Дополнительная информация о таблицах и столбцах
select * from information_schema.columns where table_name='items' and column_name='image_url'\G;
*************************** 2. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: development_database
TABLE_NAME: items
COLUMN_NAME: image_url
ORDINAL_POSITION: 5
COLUMN_DEFAULT: NULL
IS_NULLABLE: NO
DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 255
CHARACTER_OCTET_LENGTH: 765
NUMERIC_PRECISION: NULL
NUMERIC_SCALE: NULL
CHARACTER_SET_NAME: utf8
COLLATION_NAME: utf8_unicode_ci
COLUMN_TYPE: varchar(255)
COLUMN_KEY:
EXTRA:
PRIVILEGES: select,insert,update,references
COLUMN_COMMENT:
2 rows in set (0.01 sec)
ERROR:
No query specified
EDIT 9 Показания Charlength
mysql> select image_url,length(image_url),char_length(image_url),url from items where id=39\G;
*************************** 1. row ***************************
image_url: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jp
length(image_url): 61
char_length(image_url): 61
url: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jp
1 row in set (0.00 sec)
ERROR:
No query specified
EDIT 10, показывающий переменные, такие как символ
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
РЕДАКТИРОВАТЬ 11: ПОТЕНЦИАЛЬНЫЙ ВЫПУСК
Ошибка не отображается в таблице пользователей, но она встречается в таблице элементов. Вот разница, которая, по моему мнению, может вызвать проблему. (У меня пока нет решения, так как таблица элементов имеет UTF-8 по какой-либо причине: URL-адреса могут иметь некоторые фанковые символы)
show create table users\G;
ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1
show create table items\G;
ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Ответы
Ответ 1
Честно говоря, я думаю, что это должен быть ответ сообщества, поскольку я был немного позже на сцене, а другие сделали некоторые важные наземные работы что было и не было фактором в этом вопросе.
Эта ссылка может быть релевантной, так как ваш набор символов таблицы utf8
, поэтому последний символ в строке может искажаться (и не сохраняя корректно, тем самым исчезая).
Все строки в EDIT 10, ссылки на которые сопоставляются latin1
или utf8
, должны быть одинаковыми и в идеале должны быть utf8mb4
. Теперь я бы рискнул предположить, что сохранение символов UTF-8 в сопоставлении символов не-true-utf-8 означает, что конечный символ любой строки является неполной ссылкой и поэтому не отображается.
Итак, чтобы решить вашу проблему, выполните команду:
ALTER TABLE items CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Для информации/фона:
utf8mb4
- это полный и полный набор символов UTF-8, поэтому будет отображаться любой символ, который можно использовать в веб-адресе. Если в данных есть некоторые неясные символы, я предлагаю вам изменить столбец на столбец BLOB
, а затем изменить его на столбец utf8mb4
, так как это сохранит правильные определения символов как входные, а не как предполагаемые MySQL на данные уже введены.
Вы не хотите, чтобы набор символов utf8_
в MySQL был так же хорош, как и сломан, то, что вам нужно, utf8mb4
, стандартное определение UTF8 в MySQL скомпрометировано, поскольку оно сохраняет 4-байтные символы в 3-байтных блоках и, таким образом, искажает сохраненные символьные данные.