MySql 上 varchar 的 unique key 关于空格的表现

用这个表做测试

 

 

看里面的 word 已经做了 unique 的限制了,执行下面的语句:

 

insert ignore into words(word) values('test');

insert ignore into words(word) values('test    '); /* 右边加空格 */

insert ignore into words(word) values('     test'); /* 左边加空格 */

 

看看结果,select * from words;

2 | [test]

1 | [     test]

[] 加上来是为了更好看清空格的

insert 的结果是第二条没插入表内

 

再测试 select,

select * from words where word = 'test';

select * from words where word = 'test   '; /* 右边加空格 */

这两句的结果是一样的。

 

结论

MySql 会对右侧的空格自行处理。

CREATE TABLE `datasync_config` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `corp_id` varchar(36) NOT NULL COMMENT '企业ID', `data_source_id` varchar(36) NOT NULL COMMENT '高级数据源ID', `sync_table_type` varchar(32) NOT NULL COMMENT '同步表类型', `enabled_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否启用', `sync_task_id` varchar(36) NOT NULL COMMENT '同步任务ID', `sync_start_time` varchar(16) NOT NULL COMMENT '同步开始时间', `sync_period` varchar(32) NOT NULL COMMENT '同步周期', `sync_frequency` int(11) NOT NULL COMMENT '同步频率', `sync_dates` varchar(128) DEFAULT NULL COMMENT '同步时间', `target_schema_code` varchar(256) DEFAULT NULL COMMENT '目标表SchemaCode', `real_schema_code` varchar(256) DEFAULT NULL COMMENT '目标表SchemaCode', `field_mapping` text DEFAULT NULL COMMENT '字段映射关系', `extended_properties` text DEFAULT NULL COMMENT '扩展属性', `created_by` varchar(64) NOT NULL COMMENT '创建人ID', `modified_by` varchar(64) NOT NULL COMMENT '更新人ID', `created_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `modified_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_sourceid_type` (`data_source_id`, `sync_table_type`) , KEY `idx_corp_id` (`corp_id`) ) AUTO_INCREMENT = 1 AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMMENT = '数据同步配置表'; 这一句也调整一下,错误提示在:AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC 处
最新发布
04-01
<think>好的,我现在需要帮助用户解决他们提供的MySQL建表语句中的错误。首先,用户提到错误提示出现在`AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC`这一部分。我需要先仔细分析这个语句的结构,找出可能的语法问题。 首先,回顾一下MySQL的CREATE TABLE语法。用户提供的语句中有几个部分需要注意: 1. **AUTO_INCREMENT相关设置**:用户使用了`AUTO_INCREMENT = 1`和`AUTO_INCREMENT_MODE = 'ORDER'`。我需要确认这两个参数的有效性。根据我所知,MySQL中的`AUTO_INCREMENT`用于设置自增起始值,但`AUTO_INCREMENT_MODE`并不是MySQL的标准选项。可能用户混淆了其他数据库的语法,比如MariaDB的`AUTO_INCREMENT_MODE`,但即使如此,MariaDB中的选项也不包括'ORDER'。这可能是一个无效的参数,导致语法错误。 2. **表选项的顺序和语法**:在表定义的最后,用户将`AUTO_INCREMENT`、`AUTO_INCREMENT_MODE`、`DEFAULT CHARSET`、`ROW_FORMAT`和`COMMENT`放在一起。需要确认这些选项的合法性以及正确的顺序。通常,表选项如`DEFAULT CHARSET`、`ROW_FORMAT`、`AUTO_INCREMENT`应该用空格分隔,而不是等号。正确的语法应该是`AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='数据同步配置表'`。而`AUTO_INCREMENT_MODE`在这里可能完全无效,需要移除。 接下来,我需要验证这些猜想。查阅MySQL 8.4的官方文档,确认支持的表选项。根据文档,`AUTO_INCREMENT`用于设置初始值,而`AUTO_INCREMENT_MODE`并不是MySQL的有效选项。因此,这个参数是导致错误的主要原因。需要将其删除。 另外,检查其他部分是否有潜在问题。例如,`datetime(3)`中的小数秒精度是MySQL 5.6.4及以上版本支持的,没有问题。`UNIQUE KEY`和索引的定义也正确。因此,主要问题集中在`AUTO_INCREMENT_MODE`和表选项的语法上。 修复后的语句应该移除`AUTO_INCREMENT_MODE = 'ORDER'`,并将表选项调整为正确的语法。同时,确保`AUTO_INCREMENT=1`的位置正确,通常放在表选项的最前面或者适当的位置,但根据MySQL的语法,表选项的顺序不影响,但格式必须正确。 另外,用户之前的问题涉及到使用sed替换SQL文件中的内容,但这次可能只是需要修正这个CREATE TABLE语句。用户可能是在尝试调整表结构时遇到了语法错误,需要指导如何正确修改。 最后,确保修复后的语句在MySQL 8.4中能够正确执行,并且所有选项都符合当前版本的支持范围。例如,`ROW_FORMAT=DYNAMIC`在默认使用Barracuda格式的情况下是有效的,而`DEFAULT CHARSET=utf8mb4`也是正确的字符集设置。 总结需要进行的修改步骤: 1. 删除无效的`AUTO_INCREMENT_MODE = 'ORDER'`。 2. 调整表选项的语法,使用等号而非空格,并正确排列。 3. 确保其他部分如索引、列定义没有语法错误。 验证修改后的语句是否能够正确执行,并且解释每个修改的原因,以帮助用户理解问题所在,避免未来再犯类似错误。</think>--- ### 一、错误原因解析 --- #### 1. **`AUTO_INCREMENT_MODE` 语法错误** - **MySQL 原生语法中不存在 `AUTO_INCREMENT_MODE`** 参数,这是 **MariaDB 特有的扩展语法**(但即使 MariaDB 中该参数也不支持 `ORDER` 值) - **错误定位**:MySQL 8.4 会直接报错 `You have an error in your SQL syntax` #### 2. **表选项语法格式问题** MySQL 表选项(如 `AUTO_INCREMENT`, `DEFAULT CHARSET`)需遵循以下规则: - **等号两侧不需要空格**:`AUTO_INCREMENT=1`(而非 `AUTO_INCREMENT = 1`) - **多个选项用空格分隔**:`DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC` --- ### 二、修正后的 SQL 语句 --- ```sql CREATE TABLE `datasync_config` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `corp_id` varchar(36) NOT NULL COMMENT '企业ID', `data_source_id` varchar(36) NOT NULL COMMENT '高级数据源ID', `sync_table_type` varchar(32) NOT NULL COMMENT '同步表类型', `enabled_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否启用', `sync_task_id` varchar(36) NOT NULL COMMENT '同步任务ID', `sync_start_time` varchar(16) NOT NULL COMMENT '同步开始时间', `sync_period` varchar(32) NOT NULL COMMENT '同步周期', `sync_frequency` int(11) NOT NULL COMMENT '同步频率', `sync_dates` varchar(128) DEFAULT NULL COMMENT '同步时间', `target_schema_code` varchar(256) DEFAULT NULL COMMENT '目标表SchemaCode', `real_schema_code` varchar(256) DEFAULT NULL COMMENT '目标表SchemaCode', `field_mapping` text DEFAULT NULL COMMENT '字段映射关系', `extended_properties` text DEFAULT NULL COMMENT '扩展属性', `created_by` varchar(64) NOT NULL COMMENT '创建人ID', `modified_by` varchar(64) NOT NULL COMMENT '更新人ID', `created_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `modified_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_sourceid_type` (`data_source_id`, `sync_table_type`), KEY `idx_corp_id` (`corp_id`) ) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='数据同步配置表'; ``` --- ### 三、关键修改点说明 --- #### 1. **移除无效参数** - **删除 `AUTO_INCREMENT_MODE = 'ORDER'`**:该参数在 MySQL 中不存在 #### 2. **标准化表选项格式** - **语法修正**:`AUTO_INCREMENT=1`(移除空格) - **合并选项**:`DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC`(用空格分隔) #### 3. **验证其他细节** - **时间精度语法**:`datetime(3)` 正确(支持毫秒级存储) - **索引定义**:`UNIQUE KEY` 和普通索引语法正确 --- ### 四、关于自增模式的补充说明 --- 如果确实需要控制自增ID的生成顺序,MySQL 8.4 可通过以下方式实现: ```sql -- 设置全局自增模式(默认是连续模式) SET @@GLOBAL.innodb_autoinc_lock_mode = 1; -- 0:传统模式, 1:连续模式, 2:交错模式 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值