2012-07-30 66 views
0

我有一个名为PremiseID的主键的数据库表。字符字段可以保留尾部空格字符吗?

其MySQL列定义是CHAR(10)。

进入列的数据总是10位数字,可以是9位数字后跟空格,如“113091000”或9位数字后跟字母,如“113091000A”。

我试过将这些值之一写入测试MySQL数据库表t1中的表中。它有三列

mainid integer 
parentid integer 
premiseid char(10) 

如果我插入具有以下值的行:1,1,'113091000 '并尝试读取行回来,“113991000”值将被截断,所以它读取“113091000”;那是空间被删除。如果我插入一个数字,如'113091000A',则保留该值。

如何获得CHAR(10)字段保留空格字符?

我有一个解决此问题的编程方法。这将是len('113091000'),意识到它是九个字符,然后意识到9个推测的长度有一个空格后缀的数字。

回答

2

要从MySQL reference引用:

一个CHAR列的长度是固定的,当你创建表所声明的长度。长度可以是从0到255之间的任何值。当存储CHAR值时,它们将空格填充到指定的长度。当检索到CHAR值时,删除尾随空格。

所以没有办法绕过它。如果你使用MySQL 5.0.3或更高版本,然后使用VARCHAR可能是要走(开销仅为1额外的字节)的最佳方式:

VARCHAR值不填充存储,当他们。尾随空格的处理取决于版本。从MySQL 5.0.3开始,根据标准SQL存储和检索值时会保留尾随空格。在MySQL 5.0.3之前,将尾部空格存储到VARCHAR列时将从值中删除;这意味着空间也没有被检索到的值。

如果你使用MySQL 5.0.3 <,那么我认为你必须要检查返回的长度,或使用一个空格以外的字符。

可能最便携的解决方案是只使用CHAR并检查返回的长度。

1

标准CHAR(10)列将始终有尾随空格,以便将字符串填充到所需的10个字符长度。因此,任何故意拖尾的空格都会混入并且通常会被数据库适配器剥离。

如果可能,请转换为VARCHAR(10)列,如果要保留尾随空格。您可以使用ALTER TABLE声明执行此操作。

2

问:如何获得CHAR(10)字段保留空格字符?

实际上,该空间被保留和存储。这是删除空格的值的检索。 (删除返回值的尾部空格是一个记录的“功能”。)

一个选项(作为解决方法)是修改您的SQL查询以将尾随空格附加到返回的值,例如,

SELECT RPAD(premiseid,10,' ') AS premiseid FROM t1 

,将与返回的值作为一个字符串为10个字符的长度,用空格填充如果该值小于10个字符,或者如果它再被截断至10个字符。

1

尽管戈登的答案本身可能还是正确的,但在后来的版本中还是提到了解决方案。
在您的代码中运行SET sql_mode ='PAD_CHAR_TO_FULL_LENGTH';

通过此会话设置,您将检索CHAR(10)全长的完美列,而VARCHAR不会在未预先输入尾随空格的情况下进行检索。如果你不需要空格,你总是可以rtrim()。

相关问题