Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que uma coluna de texto não pode ter um valor padrão no MySQL?


O Windows MySQL v5 gera um erro, mas o Linux e outras versões apenas geram um aviso. Isso precisa ser corrigido. WTF?

Veja também uma tentativa de corrigir isso como bug #19498 no MySQL Bugtracker:

Bryce Nesbitt em 4 de abril de 2008 16:36:
No MS Windows a regra "no DEFAULT" é um erro, enquanto em outras plataformas geralmente é um aviso. Embora não seja um bug, é possível ficar preso por isso se você escrever código em uma plataforma branda e depois executá-lo em uma plataforma estrita:

Pessoalmente, eu vejo isso como um bug. A pesquisa por "A coluna BLOB/TEXT não pode ter um valor padrão" retorna cerca de 2.940 resultados no Google. A maioria deles são relatórios de incompatibilidades ao tentar instalar scripts de banco de dados que funcionaram em um sistema, mas não em outros.

Estou enfrentando o mesmo problema agora em um webapp que estou modificando para um dos meus clientes, originalmente implantado no Linux MySQL v5.0.83-log. Estou executando o Windows MySQL v5.1.41. Mesmo tentando usar a versão mais recente do phpMyAdmin para extrair o banco de dados, ele não informa um padrão para a coluna de texto em questão. No entanto, quando tento executar uma inserção no Windows (que funciona bem na implantação do Linux), recebo um erro de nenhum padrão na coluna ABC. Eu tento recriar a tabela localmente com o padrão óbvio (com base em uma seleção de valores exclusivos para essa coluna) e acabo recebendo a tão útil coluna BLOB/TEXT não pode ter um valor padrão .

Novamente, não manter a compatibilidade básica entre plataformas é inaceitável e é um bug.

Como desativar o modo estrito no MySQL 5 (Windows):

  • Edite /my.ini e procure por linha
    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    

  • Substitua-o por
    sql_mode='MYSQL40'
    

  • Reinicie o serviço MySQL (assumindo que é mysql5)
    net stop mysql5
    net start mysql5
    

Se você tiver acesso root/admin, poderá executar
mysql_query("SET @@global.sql_mode='MYSQL40'");