1

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

4

4 回答 4

3

引用MySQL 参考

列的长度CHAR固定为您在创建表时声明的长度。长度可以是 0 到 255 之间的任何值。CHAR存储值时,它们会用空格右填充到指定的长度。检索值时CHAR,将删除尾随空格。

所以没有办法解决它。如果您使用的是 MySQL 5.0.3 或更高版本,那么 usingVARCHAR可能是最好的方法(开销只有 1 个额外字节):

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

如果您使用的是 MySQL < 5.0.3,那么我认为您只需要检查返回的长度,或者使用空格以外的字符。

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

于 2012-07-30T19:48:22.247 回答
2

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

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

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

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

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

于 2012-07-30T21:20:36.933 回答
1

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

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

于 2012-07-30T19:50:43.993 回答
1

尽管 Gordon 的回答本身可能仍然是正确的,但有比提到的解决方案更高的版本。
在您的代码中运行SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

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

于 2017-07-29T17:22:04.283 回答