Estou tentando descobrir a diferença entre algumas mensagens de aviso relacionadas ao truncamento de dados. Considere a seguinte tabela:
CREATE TABLE `txttest` (
`mycol` text NOT NULL )
ENGINE=InnoDB DEFAULT CHARSET=utf8;
Comportamento praticamente esperado:
mysql > insert into txttest (mycol) values (repeat('a',65535));
Query OK, 1 row affected (0.17 sec)
mysql > insert into txttest (mycol) values (repeat('a',65536));
Query OK, 1 row affected, 1 warning (0.16 sec)
mysql > show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 'mycol' at row 1 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)
No entanto, quando estou usando caracteres multibyte, o estado de aviso esperado ocorre, mas a mensagem é diferente:
mysql > insert into txttest (mycol) values (repeat('é',65536/2-1));
Query OK, 1 row affected (0.17 sec)
mysql > insert into txttest (mycol) values (repeat('é',65536/2));
Query OK, 1 row affected, 1 warning (0.16 sec)
mysql > show warnings;
+---------+------+----------------------------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xC3\xA9' for column 'mycol' at row 1 |
+---------+------+----------------------------------------------------------------+
1 row in set (0.00 sec)
As tentativas do Google não são muito úteis, pois estou principalmente executando pastas desta mensagem para diferentes contextos.
Basicamente, o que eu quero saber é: isso é simplesmente o código de texto/erro que o Mysql usa ao truncar uma sequência de caracteres multibyte ou há algo mais revelador que eu deveria extrair dessa mensagem?
Inicialmente, pensei que isso significava que a sequência de bytes estava sendo dividida de tal forma que resultava em caracteres malformados. As tentativas de tentar fazer isso não funcionaram (por exemplo, o mysql parecia bom em reconhecer limites de bytes adequados para uma codificação de caracteres).
Editar:
Depois de reexaminar, parece ser a divisão de caracteres que inicialmente descartei. Eu tive um peido de um cérebro olhando para ele inicialmente.
É uma tentativa de armazenar uma string de 2 bytes em um byte
Como o comprimento máximo de TEXT é 65535, ele pode conter com segurança 32767 (65536/2 - 1) caracteres de 2 bytes sem uma mensagem de erro.
Qualquer tentativa de adicionar 32768 caracteres de 2 bytes resultará em
Incorrect string value: '\xC3\xA9' for column 'mycol' at row 1
porque o 32768º caractere não tem espaço para ser inserido no mycol.Na realidade, você não obtém um personagem malformado . Você realmente pode um campo TEXT cuja contagem de caracteres de 2 bytes e comprimento é 32767. O último caractere é simplesmente perdido e não é considerado.
Para ter certeza, execute este
O último INSERT não terá comprimento 65536 por 65534.