将ascii表中0-255之间的任何字符存储到mysql varchar(22)中?

xxe27gdn  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(396)

我连接了一个由21个ascii字符组成的字符串(可以是0-255之间的任何ascii字符),并尝试将该字符串存储到mysql数据库表中的varchar中。但是,它似乎没有正确地存储到数据库中——有时字符串不知何故太长了,或者当它不太长并且我重新读取时,它会给我错误的字符。
允许我这样做的排序规则/配置是什么?我使用php作为编程语言,通过putty在linux服务器上运行。
表的架构:

ID ...
FirstName ... 
LastName ... 
Email ...
HoursRange | varchar(22) | YES | | NULL | |

php代码:($hoursrange是一个168位的字符串,我将其转换为21个字符的字符串)

$toBytes = "";
for($i = 0; $i < 168; $i+=8){
    $decVal = bindec(substr($hoursRange, $i, $i+8)); // this becomes decimal
    $toBytes = $toBytes . chr($decVal);
}

然后我将其存储到数据库中:

$notice->addSubscriber($firstName, $lastName, $email, $toBytes);

添加订阅服务器(函数接受4个参数):

$stmt = $this->conn->prepare("INSERT INTO Subscribers (FirstName, LastName, Email, HoursRange) VALUES(:fname, :lname, :email, :hoursRange)");
$stmt->bindparam(":fname", $FirstName);
$stmt->bindparam(":lname", $LastName);
$stmt->bindparam(":email", $Email);
$stmt->bindparam(":hoursRange", $hoursRange);

$stmt->execute();
return $stmt;
qnakjoqk

qnakjoqk1#

使用 BINARY(21) ,而不是任何形式的 CHAR . 一个很好的方法 INSERTUNHEX('...') . 同样地 SELECT HEX(...) 很方便。也 0b'...' 将允许您使用0和1的字符串而不是十六进制。
ascii仅为0..127。解决你的问题。
看不见 SHOW CREATE TABLE ,我们很难判断问题是什么。如果所讨论的列是 CHARACTER SET ascii ,则在尝试存储外部128个值时,会发生一些不愉快的事情。
为了 CHARACTER SET latin1 ,它可能会通过。 utf8 以及 utf8mb4 很可能对你的价值观嗤之以鼻。
也许你想要 VARBINARY 或者 BLOB ? 没有字符集概念的;只有8位字节。

相关问题