MYSQL 不接受空格

Posted

技术标签:

【中文标题】MYSQL 不接受空格【英文标题】:MYSQL not accepting whitespaces 【发布时间】:2015-05-27 15:03:14 【问题描述】:

我在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');

在第二行插入中,我希望我的“姓名”字段包含空格。 但是当我运行第二个查询时,它给出了主键违规错误。

有没有一种方法可以在具有主键的表中插入空格?

【问题讨论】:

看这个:***.com/questions/11714534/… 【参考方案1】:

VARCHAR 列中的值是可变长度字符串。你可以声明 一个 VARCHAR 列可以是 1 到 255 之间的任意长度,就像 CHAR 列。但是,与 CHAR 相比,VARCHAR 值使用以下方式存储 只需要尽可能多的字符,加上一个字节来记录 长度。不填充值;相反,删除了尾随空格 存储值时。 (此空间删除不同于 SQL-99 规范。)

您可能需要 lpad、rpad 或空格

如果你正在为 html 开发,你可以用不同的字符替换空格,一旦你查询你用空格替换字符,你甚至可以使用" ",它会在你的 html 浏览器中插入一个空格

【讨论】:

这很有趣,我从来不知道 VARCHAR 会自动删除空格。这些年来我一直在使用 php 修剪函数。哦,哈哈。 太棒了!使用修剪函数开发可能仍然更安全,你永远不知道它是否会改变某个版本并使代码更容易理解 @Dave:我没有使用 php 或任何其他工具。我在 mysql 中手动插入数据。 @kawade 如果我可能会问,你为什么要使用这个空间?不能换成别的吗? @Dave:Dave 我正在将数据从 oracle 迁移到 mysql,我们在 oracle 中有数据,我们无法从表中删除该数据。这就是为什么我需要这样做【参考方案2】:

如果您需要插入带有空格的值,您可以使用name nvarchar(20) 而不是varchar(20)

注意: 确切的问题是,对于 SQL 规范,如果您比较两个不同长度的字符串,SQL 所做的第一件事就是通过添加尾随空格使它们的长度相同。

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

最后幸运的是,如果该字段是唯一索引或主键,则不可能在两个不同的行中包含“a”和“a”。如果它不是 UNIQUE INDEX 或主键字段,那么您将不得不使用带有额外字符的 RTRIM、LTRIM 和 LEN 函数,例如 LEN('a'+'#')=2 和 LEN('a '+'# ')=3。

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

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

我已经看到字符或字符串主键系统在转换为整数时大大加快了速度。

【讨论】:

@kawade : 你在修改表格后插入了任何带有空格的值吗?

以上是关于MYSQL 不接受空格的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 输入查询字符串不接受空格制表符而是字母

连接字符串时,剃刀不接受空格作为第一个字符吗?

Win32 中仅接受文本框(编辑控件)中的字符和空格

c++ boost xml解析器ptree.get函数——不接受节点名中的空格

QT4 设计器在信号/槽编辑器中不接受“&”引用和“”空格字符

mysql对后空格不敏感 mysql数据库对空格的查询处理