我在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'字段有空格。 但是当我运行第二个查询时,它会给出主键冲突的错误。
我是否可以在具有主键的表中插入空格?
答案 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时字符或字符串主键系统从根本上加速。