MYSQL不接受空格

时间:2015-03-24 10:35:19

标签: mysql primary-key

我在mysql中创建了一个表:

CREATE TABLE `test1` (
  `age` int(12) NOT NULL DEFAULT '0',
  `name` varchar(20) NOT NULL DEFAULT '',
  `gender` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`age`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我在此表中插入2行:

insert into test1 values(1,'user1','m');
insert into test1 values(1,'user1  ','m');

在第二行插入中,我希望我的'name'字段有空格。 但是当我运行第二个查询时,它会给出主键冲突的错误。

我是否可以在具有主键的表中插入空格?

2 个答案:

答案 0 :(得分:3)

VARCHAR列中的值是可变长度字符串。你可以申报 VARCHAR列为1到255之间的任何长度,就像CHAR一样 列。但是,与CHAR相比,VARCHAR值是使用存储的 只需要多少个字符,加上一个字节来记录 长度。值未填充;相反,删除尾随空格 何时存储值。 (此空间删除与SQL-99不同 规范。)

您可能需要lpad,rpad或空格

如果你正在为html开发,你可以用不同的字符替换空格,一旦你查询你用白色空格替换字符,你甚至可以使用" "将空白空间插入你的空间HTML浏览器

答案 1 :(得分:0)

如果您需要使用空格插入值,则可以使用name nvarchar(20)代替varchar(20)

注意: 确切的问题是,对于SQL规范,如果比较两个不同长度的字符串,SQL首先要做的是通过添加尾随空格使它们达到相同的长度。

因此,如果您的查询比较字符串1' a'和string2' a',string1首先转换为' a'然后比较string2,现在两个字符串是相同的。

最后,幸运的是,如果该字段是一个独特的索引或主键,则不可能有一个' a'和' a'在两个不同的行。如果它不是UNIQUE INDEX或主键字段,那么你将不得不使用RTRIM,LTRIM和LEN函数以及像LEN这样的额外字符(' a' +'#') = 2和LEN(' a' +'#')= 3.

Len(' a')和len(' a')给... 1

你必须记住的是: 插入前删除尾随空格!这将是更好的选择

我已经看到转换为Integer时字符或字符串主键系统从根本上加速。