2016-01-13 3 views
11

Я использую mysql и в настройках таблицы «items» для переменной image_url «успешно» без предупреждений. Но на самом деле обновление не работает: оно добавляет значение с пробелом и удаляет последний символ значения, которое я ему даю.mysql update выключен одним символом

Вот обновление:

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 
... 

уведомление недостающий 'г' в конец и дополнительное пространство в начале.

Как это остановить?

Вот некоторая система информации, которая может помочь:

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 61 символов, а также, что имеет смысл, учитывая, что обновление не изменяет длину из строка, просто удаляя последние символы и добавляя пробел в начало,

EDIT 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

EDIT 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) 

Таким образом, это также не на вставке.

EDIT 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) 

EDIT 11: ПОТЕНЦИАЛ ВЫПУСК

ошибка не появляется в таблице пользователей, но это имеет место в таблице пунктов. Вот разница, которая, по моему мнению, может вызвать проблему. (Я до сих пор не имеет решения, так как таблица элемент имеет, что UTF-8 по причине: URLS может иметь какие-то непонятные символы)

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 
+2

Все строки в ** EDIT 10 **, которые ссылаются на 'latin1' или' utf8', должны быть одинаковыми и в идеале должны быть 'utf8mb4'. Теперь я бы рискнул предположить, что сохранение символов UTF-8 в сопоставлении символов не-true-utf-8 означает, что конечный символ любой строки является неполной ссылкой и поэтому не отображается. – Martin

+1

Для вашей информации 'utf8mb4' - полный и полный набор UTF-8, и так будет отображаться любой символ, который можно использовать в веб-адресе. Если в данных есть некоторые неясные символы, я предлагаю вам поменять столбец на столбец 'BLOB' * до *, а затем изменить его на' utf8mb4', потому что это сохранит правильные определения символов * как входные *, а не * как предполагается по MySQL * по уже введенным данным. – Martin

+2

Нет, вы не хотите, чтобы utf8, в MySQL так же хорошо, как и сломанный, то, что вы хотите, это 'utf8mb4', стандартное определение UTF8 в MySQL - это мусор, а не то, что вы хотите. – Martin

ответ

4

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

This link may be relevant, так как набор символов, ваша таблица utf8 так что последний символ в строке может быть получение перекоса (и не экономить правильно, таким образом, исчезает).

все строки в РЕДАКТИРОВАТЬ 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-байтовых блоков и, таким образом развращает сохраненные символьные данные.

Смежные вопросы