【问题标题】:MYSQL not accepting whitespacesMYSQL 不接受空格
【发布时间】: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');

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

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

【问题讨论】:

标签: mysql primary-key


【解决方案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 : 你在修改表格后插入了任何带有空格的值吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2020-03-25
  • 2017-10-06
  • 2021-09-03
  • 2016-08-20
  • 1970-01-01
相关资源
最近更新 更多