2013-05-23 2 views
8

sto facendo funzionare la seguente domanda:MYSQL: come definire o ottenere variabili stringa LONG

Variabili

SET @src = 'Test'; 
SET @tgt = 'Test2'; 
SET @db = 'Test'; 
SET @pk = 'ID, MyPk, etc'; 

SELECT CONCAT(@pk, GROUP_CONCAT(CONCAT(", ", COLUMN_NAME) SEPARATOR "")) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @db 
AND TABLE_NAME = @src 
INTO @cols; 

Esempio

SET @sql = CONCAT('INSERT INTO `', @tgt, '` (SELECT ', @cols, ' FROM `', @src, '`);'); 
PREPARE stm FROM @sql; 
EXECUTE stm; 

funziona ... con tavolini e io può usare questo @cols per molteplici scopi. Tuttavia, smette di funzionare con tabelle di grandi dimensioni (grandi quantità di campi). Ho notato che si rompe a 1024 caratteri. Ignora LIMIT. C'è via per ottenere una variabile più lunga di 1024 caratteri o un modo per aggirare questo problema?

+1

vedere [questa domanda] (http://stackoverflow.com/questions/12294955/storage-limits-of-mysql-user-defined-variables) sui limiti di archiviazione delle variabili definite dall'utente MySQL –

+0

La risposta dice che le stringhe possono contenere 16 MB, quindi non spiega perché si sta tagliando a 1K. – Barmar

+0

Cosa succede se si esegue semplicemente 'SELECT @ sql'? Forse il limite è sulla dimensione delle istruzioni preparate, non sulla dimensione della stringa – Barmar

risposta

1
SET GLOBAL group_concat_max_len = (7*1024); 
SET GLOBAL max_allowed_packet = (50*1024*1024); 

La radice del problema è stata la funzione di group_concat. la documentazione dice group_concat di group_concat_max_len è limitata da max_allowed_packet: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

50% al @echo_me e il 50% a @barmar. Deve essere fatto insieme, altrimenti non funzionerà.

codice completo:

SET GLOBAL group_concat_max_len = (7*1024); 
SET GLOBAL max_allowed_packet = (50*1024*1024); 

SET @src = 'Test'; 
SET @tgt = 'Test2'; 
SET @db = 'Test'; 
SET @pk = 'ID, MyPk, etc'; 

SELECT CONCAT(@pk, GROUP_CONCAT(CONCAT(", ", COLUMN_NAME) SEPARATOR "")) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @db 
AND TABLE_NAME = @src 
INTO @cols; 
+1

Nota che (almeno questo era il mio caso) hai bisogno di chiudere l'attuale connessione/client mysql e avviarne un altro per farlo funzionare. –

2

In breve, è necessario individuare il file di configurazione di MySQL my.cnf e aggiungere o modificare la massima consentita dei pacchetti:

[mysqld] 

max_allowed_packet = 50M 
+0

Non sto utilizzando php. Sto usando MySQL/Workbench/Etc, – Omar

+0

modificato la mia risposta –

+0

ho provato. Ho anche scoperto che puoi fare 'SET GLOBAL max_allowed_packet = 52428800;' (http://dev.mysql.com/doc/refman/5.0/en/program-variables.html). Ma ancora non ha funzionato. – Omar

3

Il limite è il risultato di GROUP_CONCAT(). È possibile modificare questo con:

SET group_concat_max_len = 10000 
-1

Basta usare sopra soluzione:

SET GLOBAL group_concat_max_len = (7*1024); 
SET GLOBAL max_allowed_packet = (50*1024*1024); 

Quindi, fare clic nel database; Connettersi al database; e creare un'altra connessione. Esegui codice in questa connessione appena creata.

+1

Benvenuti in Stack Overflow! Anche se ti ringraziamo per la tua risposta, sarebbe meglio se fornisse un valore aggiuntivo in aggiunta alle altre risposte.In questo caso, la tua risposta non fornisce un valore aggiuntivo, poiché un altro utente ha già pubblicato tale soluzione. Se una risposta precedente ti è stata utile, dovresti votarla invece di ripetere le stesse informazioni. –