将ASCII表中的任何字符从0到255存储到MySQL VARCHAR(22)吗?

时间:2018-06-21 14:47:57

标签: php mysql character-encoding collation varchar

我串联了一个由21个ASCII字符组成的字符串(可以是0到255之间的任何ASCII字符),并且我试图将此字符串存储到MySQL数据库表的VARCHAR中。 但是,它似乎无法正确存储到数据库中-有时String有点长,或者当它不太长而我读回时,它给了我错误的字符。

什么排序规则/配置可以使我做到这一点?我使用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 个答案:

答案 0 :(得分:1)

ASCII仅是0..127。解决您的问题。

在没有看到SHOW CREATE TABLE的情况下,我们很难判断问题出在哪里。如果有问题的列是CHARACTER SET ascii,那么当您尝试存储外部128个值时,您会感到讨厌。

对于CHARACTER SET latin1,它可能会通过。

utf8utf8mb4很可能会破坏您的价值观。

也许您想要VARBINARYBLOB?那些没有字符集的概念;只是8位字节而已。