char字段可以保留尾随空格字符吗?

时间:2012-07-30 19:36:54

标签: mysql char

我有一个带有名为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的长度,推断该数字有一个空格后缀。

4 个答案:

答案 0 :(得分:3)

引用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 :(得分:2)

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

实际上,该空间被保留并存储。它是删除空间的值的检索。 (删除返回值上的尾随空格是一个记录在案的“特征”。)

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

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

这将使用长度为10个字符的字符串返回您的值,如果值小于10个字符,则用空格填充,如果长度超过,则将其截断为10个字符。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

虽然戈登的回答可能仍然是正确的,但是在后来的版本中提到了一个解决方案 在您的代码中运行 SET sql_mode ='PAD_CHAR_TO_FULL_LENGTH';

使用此会话设置,您将在CHAR(10)的全长上检索完美列,而在预先没有输入尾随空格时,VARCHAR不会。如果您不需要空格,则可以始终使用rtrim()。