在mysql中用utf8应该使用utf8mb4格式而不是utf8

首先说一下在mysql使用UTF-8时,应选择utf8mb4而不是utf8,具体原因请看下方

之前在项目中向utf8编码的mysql存储数据时总是提示错误,经过很长时间才知道原因,mysql的utf8并不是4字节的UTF-8而是3字节的,原因是MySQL 从 4.1 版本开始支持 UTF-8,也就是 2003 年,而今天使用的 UTF-8 标准(RFC 3629)是随后才出现的。

旧版的 UTF-8 标准(RFC 2279)最多支持每个字符 6 个字节。2002 年 3 月 28 日,MySQL 开发者在第一个 MySQL 4.1 预览版中使用了 RFC 2279。

同年 9 月,他们对 MySQL 源代码进行了一次调整:“UTF8 现在最多只支持 3 个字节的序列”。

是谁提交了这些代码?他为什么要这样做?这个问题不得而知。在迁移到 Git 后(MySQL 最开始使用的是 BitKeeper),MySQL 代码库中的很多提交者的名字都丢失了。2003 年 9 月的邮件列表中也找不到可以解释这一变更的线索。

在这个不合法的字符集发布了之后,MySQL 就无法修复它,因为这样需要要求所有用户重新构建他们的数据库。最终,MySQL 在 2010 年重新发布了“utf8mb4”来支持真正的 UTF-8。

 

以下是一个简单的示例,演示如何在Java Web项目中使用MVC模式实现后端管理员RSA加密登录,使用MySQL数据库进行数据存储: Model: ```java package model; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; public class RSA { private static final String ALGORITHM = "RSA"; private static final int KEY_SIZE = 2048; private PublicKey publicKey; private PrivateKey privateKey; public RSA() { try { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM); keyPairGenerator.initialize(KEY_SIZE); KeyPair keyPair = keyPairGenerator.generateKeyPair(); publicKey = keyPair.getPublic(); privateKey = keyPair.getPrivate(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } public PublicKey getPublicKey() { return publicKey; } public PrivateKey getPrivateKey() { return privateKey; } } ``` Controller: ```java package controller; import model.RSA; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @Controller public class LoginController { @RequestMapping("/") public String index(Model model) { RSA rsa = new RSA(); model.addAttribute("publicKey", rsa.getPublicKey()); return "index"; } @RequestMapping("/login") public String login(HttpServletRequest request, HttpSession session) { String username = request.getParameter("username"); String password = request.getParameter("password"); // 进行RSA解密 String decryptedPassword = RSAUtil.decrypt(password, rsa.getPrivateKey()); // 检查用户名和密码是否正确 if (username.equals("admin") && decryptedPassword.equals("admin123")) { session.setAttribute("username", username); return "redirect:/dashboard"; } else { return "redirect:/"; } } @RequestMapping("/logout") public String logout(HttpSession session) { session.invalidate(); return "redirect:/"; } } ``` View: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>Login</h1> <form action="/login" method="post"> <label for="username">Username:</label> <input type="text" name="username" id="username" required><br><br> <label for="password">Password:</label> <input type="password" name="password" id="password" required><br><br> <input type="hidden" name="publicKey" value="${publicKey}"> <button type="submit">Login</button> </form> </body> </html> ``` 在MySQL数据库中创建一个名为“users”的表,包含以下字段:id(INT)、username(VARCHAR)、password(VARCHAR)和email(VARCHAR)。在表中添加一个管理员用户“admin”,密码为RSA加密后的字符串。 RSA加密和解密的具体实现可以使用第三方库,例如BC库。需要将库添加到项目中的pom.xml文件中,并在代码中使用相应的类和方法。 此示例提供了一个简单的MVC实现,您可以根据实际情况进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值