Подтвердить что ты не робот

Обновление 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
4b9b3361

Ответ 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-байтных блоках и, таким образом, искажает сохраненные символьные данные.