为每列添加默认值MySQL严格模式

nlejzf6q  于 2022-10-31  发布在  Mysql
关注(0)|答案(3)|浏览(194)

我不能禁用MySQL严格模式,所以我需要添加默认值到表的每一列。
我正在尝试下面:

ALTER TABLE media
CHANGE upload_date upload_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE title title VARCHAR(500) NULL DEFAULT '',
CHANGE slug slug VARCHAR(500) NULL DEFAULT '',
CHANGE meta_title meta_title VARCHAR(500) NULL DEFAULT '',
CHANGE meta_desc meta_desc VARCHAR(500) NULL DEFAULT '',
CHANGE meta_keys meta_keys VARCHAR(500) NULL DEFAULT '',
CHANGE filename filename VARCHAR(300) NULL DEFAULT '',
CHANGE filetype filetype VARCHAR(50) NULL DEFAULT ''

我收到错误SQL错误(1366):不正确的字符串值:'\xD9\x81\xDB\x8C\xD9\x84...'用于列'meta_keys'的第1行
我怎么解决?

lokaqttq

lokaqttq1#

问题是,您必须在启用严格模式之前更改列。否则,每当您INSERT/UPDATE或ALTER TABLE:(时,MySQL将为任何不正确的列值给出错误

dxpyg8gm

dxpyg8gm2#

检查连接和客户端的characterset

- mysql -uroot -p
 - \s

您必须确保客户端和连接字符集与Db的字符集完全相同。

如果不是,则使用以下命令重置连接和客户端字符集。
使用以下命令为客户端到服务器的连接设置正确的字符集和归类

- mysql -uroot -p
- SET NAMES 'charset_name
- /execute/alter/table/query
wlp8pajw

wlp8pajw3#

这个注解有点旧了。在一个sql查询之后生成一些alter表来执行设置默认值。
这个脚本列出了所有没有空状态和值的列。主键也被忽略了。我们可以改进CASE部分的列表。例如,我错过了一些带有日期的案例。

SET @target_database="my_database";
SET @default_text="''";
SET @default_int="0";
SET @default_date="0000-00-00";

select table_schema as database_name,
       table_name,
       column_name,
       data_type,
       CONCAT(
        "ALTER TABLE ",table_schema,".",table_name," MODIFY COLUMN ",column_name," ",column_type," DEFAULT ", 
        CASE 
            when data_type like "%text" then @default_text
            when data_type like "varchar" then @default_text
            when data_type like "%blob" then @default_text
            when data_type like "%int%" then @default_int
        END
       ,";")
from information_schema.columns
where  
      column_default is null
      AND column_key <> "PRI"
      AND is_nullable = "NO"
     AND table_schema not in ('information_schema', 'sys','performance_schema','mysql')
      AND table_schema = @target_database
ORDER BY table_schema,
         table_name,
         ordinal_position;

相关问题