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