2016-01-13 12 views
11

Sto usando mysql e negli aggiornamenti della tabella 'items' sulla variabile image_url 'succeed' senza avvisi. Ma, in realtà, l'aggiornamento sta fallendo: antepone il valore con uno spazio ed elimina l'ultimo carattere del valore che gli ho dato.aggiornamento mysql disattivato da un carattere

Ecco l'aggiornamento:

UPDATE items 
    SET image_url = 'http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jpg' 
    WHERE id=38; 

Ecco select:

select * from items\G; 

Ecco una linea di output:

... 
image_url: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jp 
... 

avviso 'G' mancante al la fine e lo spazio extra all'inizio.

Come fermarlo?

Ecco alcune informazioni di sistema che può aiutare:

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 Descrizione 1 Tabella:

mysql> desc items; 

+-------------+---------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+---------------+------+-----+---------+----------------+ 
... 
| image_url | varchar(255) | NO |  | NULL |    | 
... 

EDIT 2 Controllo per i trigger:

mysql> show triggers \G 
Empty set (0.00 sec) 

EDIT 3 Un altro esempio:

Sto facendo tutti questi comandi dalla riga di comando.Un altro esempio:

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 lunghezza 4 Controllo degli ingressi e delle uscite:

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 caratteri pure, che ha senso dato che l'aggiornamento non cambia la lunghezza del stringa, eliminando solo gli ultimi caratteri e aggiungendo uno spazio all'inizio,

MODIFICA 5 Codifica di prova:

base64 codifica: 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) 

decodifica: aHR0cDovL2VjeC5pbWFnZXMtYW1hem9uLmNvbS9pbWFnZXMvSS82MUR6NXQ4d2pRTC5fU1g1MjJfLmpwZw =

dà: http://ecx.images-amazon.com/images/I/61Dz5t8wjQL._SX522_.jpg

EDIT 6 Verificando inserimento fallisce vedere:

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) 

gli avvertimenti sono, perché non ho dato tutti i valori in cui NULL: NO valori in questo foglietto

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) 

Quindi, non riesce anche sull'inserto.

EDIT 7 fornire informazioni tabella

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 Ulteriori informazioni tavolo e colonna

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 letture 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 variabili che mostra come il carattere

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: IL potenziale problema

L'errore non compare nella tabella degli utenti, ma si verifica nella tabella degli elementi. Ecco la differenza che penso possa causare il problema. (Non ho ancora avere una soluzione in quanto la tabella di voce ha quel UTF-8 per un motivo: URL possono avere alcuni caratteri funky)

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

Tutte le righe in ** EDIT 10 ** che si riferiscono a 'latin1' o' utf8' dovrebbero essere uguali, e idealmente dovrebbe essere 'utf8mb4'. Ora azzarderei a pensare che il salvataggio di caratteri UTF-8 in un confronto di caratteri non true-utf-8 significhi che il carattere finale di ogni stringa è un riferimento incompleto e quindi non viene visualizzato. – Martin

+1

Per vostra informazione 'utf8mb4' è il set completo e completo di UTF-8 e quindi mostrerà ogni carattere che può essere usato in un indirizzo web. Se ci sono alcuni caratteri oscuri nei dati ti suggerisco di cambiare la colonna in una colonna 'BLOB' * prima * e poi di cambiarla in un' utf8mb4', perché questo manterrà le definizioni corrette dei caratteri * come input * piuttosto che * come presupposto da MySQL * sui dati già inseriti. – Martin

+2

No, non vuoi utf8, in MySQL che è buono quanto rotto, quello che vuoi è 'utf8mb4', la definizione UTF8 standard in MySQL è spazzatura e non quello che vuoi. – Martin

risposta

4

Per essere onesti credo che questo dovrebbe essere una risposta comunitaria, come Ero un poco più tardi sulla scena e altri avevano fatto un importante lavoro di terra stabilendo ciò che era e non era un fattore in questo problema.

This link may be relevant, come il set di caratteri tavolo è utf8 così l'ultimo carattere della stringa può essere sempre distorta (e non risparmiando correttamente, quindi scomparire).

Tutte le righe in EDIT 10 cui riferire latin1 o utf8 collazioni carattere impostare dovrebbe essere lo stesso, e idealmente dovrebbe essere utf8mb4. Ora azzarderei a pensare che il salvataggio di caratteri UTF-8 in un confronto di caratteri non true-utf-8 significhi che il carattere finale di ogni stringa è un riferimento incompleto e quindi non viene visualizzato.

Quindi, per risolvere il problema eseguire il comando:

ALTER TABLE items CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 

Per info/sfondo:

utf8mb4 è il carattere piena e completa UTF-8 e quindi mostrerà ogni e qualsiasi personaggio che può essere utilizzato in un indirizzo web. Se ci sono alcuni personaggi oscuri nei dati ti suggerisco di cambiare la colonna a una colonna BLOB prima poi cambiarlo a una colonna utf8mb4, perché questo sarà preservare il carattere corretto definizioni come input piuttosto che come ipotizzato da MySQL sui dati già inseriti

Non si vuole utf8_ set di caratteri, in MySQL, che è buono come rotto, quello che vuoi è utf8mb4, la definizione UTF8 standard MySQL è compromessa perché consente di risparmiare caratteri a 4 byte in blocchi di 3 byte e quindi corrompe dati di carattere salvati.

Problemi correlati