
关东升
本书是一部系统论述 Python编程语言、 OOP编程思想以及函数式编程思想的立体化教程(含图书、答疑服务、教学课件、源代码及视频教程)。全书共分为四篇:第一篇 Python基础(第 1章 ~第 8章),第二篇 Python进阶(第 9章 ~第 15章),第三篇 Python高级实用库与框架(第 16章 ~第 20章),第四篇项目实战(第 21章 ~第 24章)。主要内容包括开篇综述、搭建开发环境、第一个 Python程序、Python语法基础、 Python编码规范、数据类型、运算符、控制语句、数据结构、函数式编程、面向对象编程、异常处理、常用模块、正则表达式、文件操作与管理、数据交换格式、数据库编程、网络编程、 wxPython图形用户界面编程、Python多线程编程、项目实战 1 网络爬虫与爬取股票数据、项目实战 2 数据可视化与股票数据分析、项目实战 3 PetStore宠物商店项目、项目实战 4 开发 Python版 QQ2006聊天工具。 为便于读者高效学习,快速掌握 Python编程方法,本书作者精心制作了完整的教学课件、完整的源代码与丰富的配套视频教程,并提供在线答疑服务。 海报:
第 24章项目实战 4:开发 Python版 QQ2006聊天工具 【DS】ERROR 1366 (HY000): Incorrect string value: '\xB31' for column 'user_name' at row 1 我:啥意思? DS: 这个错误表明在向MySQL数据库插入数据时,某个字符的编码与列的字符集设置不兼容。以下是原因分析和解决方案: ### **错误原因** 1. **字符集不匹配** 列 `user_name` 的字符集(如 `latin1` 或旧版 `utf8`)无法识别 `\xB31` 对应的字符。 - `\xB3` 是十六进制字节,在 `latin1` 编码中表示字符 `³`(上标三),但在 `utf8mb4` 中可能需要多字节编码。 - 若实际字符超出列的字符集支持范围,会触发此错误。 2. **旧版 `utf8` 的限制** MySQL 的 `utf8` 仅支持最多 3 字节的字符(如基本多语言平面字符),而 `utf8mb4` 支持 4 字节字符(如表情符号、某些特殊符号)。 ### **解决方案** #### 1. **修改列的字符集为 `utf8mb4`** ```sql ALTER TABLE 表名 MODIFY COLUMN user_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` #### 2. **检查并统一字符集设置** - **查看当前字符集:** ```sql SHOW CREATE TABLE 表名; ``` 确认 `DEFAULT CHARSET` 是否为 `utf8mb4`。 - **修改表或数据库的默认字符集:** ```sql ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` #### 3. **配置连接字符集** 在客户端连接时指定字符集(如使用 MySQL Connector): - **JDBC 连接示例:** ``` jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8mb4 ``` - **命令行或配置文件:** ```ini [client] default-character-set = utf8mb4 ``` #### 4. **验证数据合法性** 如果字符 `\xB31` 是用户输入或外部数据,检查其是否符合预期编码。可能需要转义或过滤非法字符。 #### 5. **升级 MySQL 版本(可选)** 如果 MySQL < 5.5.3,需升级以支持 `utf8mb4`。 ### **操作后验证** 插入数据测试: ```sql INSERT INTO 表名 (user_name) VALUES ('³1'); -- 假设原始字符是 ³1 ``` 若不再报错,则修复成功。 ### **总结** 此错误本质是字符编码冲突。通过统一使用 `utf8mb4` 并确保连接配置一致,可彻底解决问题。 【DS】 我: mysql> select * from users; -> -> -> -> -> MySQL的这些箭头是什么意思? DS: 在MySQL命令行客户端中,箭头 `->` 表示客户端正在等待你输入更多的内容,因为当前语句尚未被正确终止。出现这种情况的常见原因和解决方法如下: ### **原因分析** 1. **语句未正确结束**: - 如果语句末尾没有以分号 `;`(半角符号)结束,MySQL会认为语句未完成,继续等待输入。 - **特别注意**:即使你输入了分号,但如果是全角分号(如中文输入法的`;`)或分号后有多余字符(如空格、换行符),MySQL仍无法识别。 2. **未闭合的引号或括号**: - 如果语句中存在未闭合的引号(如 `'`)、括号(如 `(`),MySQL会持续等待闭合符号,直到输入为止。 ### **解决步骤** 1. **检查分号是否正确**: - 确保分号 `;` 是半角符号(英文输入法下的分号),且是当前行的最后一个字符。 - **错误示例**:`select * from users;`(全角分号)或 `select * from users; `(分号后带空格)。 2. **补充分号结束语句**: - 如果已经看到 `->` 提示符,直接输入 `;` 并按回车即可结束语句。 ```sql mysql> select * from users -> ; -- 输入分号后,语句立即执行 ``` 3. **检查引号或括号是否闭合**: - 如果语句中包含字符串或括号,确保它们成对出现。例如: ```sql mysql> select * from users where name = 'Alice -> '; -- 第一行未闭合的引号,需要在第二行补全 ``` ### **示例演示** - **正常情况**(正确使用分号): ```sql mysql> select * from users; -- 直接执行,显示结果 ``` - **异常情况**(未闭合引号): ```sql mysql> select * from users where name = 'Alice -> '; -- 补全引号后,语句执行 ``` ### **其他提示** - **退出等待状态**: - 如果误输入导致一直显示 `->`,可按 `Ctrl+C` 取消当前输入,重新开始。 - **配置提示符**: - MySQL的提示符可以通过 `prompt` 命令自定义,但默认行为是 `->` 表示等待输入。 **总结**:箭头 `->` 是MySQL等待你完成输入的信号,检查语句是否以半角分号正确结束,或是否存在未闭合的符号即可解决。 我:都不是上面的情况哎~ DS: 如果你的情况不属于分号缺失或符号未闭合,可能是以下 **特殊场景** 导致的问题。请逐项排查: ### **1. 多行语句未完整输入** MySQL 允许将一条语句拆分成多行输入,直到遇到分号 `;` 才会执行。即使语法正确,如果未输入完毕,也会持续显示 `->`。 **示例**: ```sql mysql> SELECT * -> FROM users -> WHERE age > 20; -- 必须输入完所有行并以分号结束 ``` **解决方法**: - 继续输入剩余内容,并以半角分号 `;` 结尾。 ### **2. 使用了未闭合的注释** 如果在语句中开启了注释(如 `/* ... */`)但未闭合,MySQL 会等待注释结束。 **示例**: ```sql mysql> SELECT * FROM users /* 这是一个未闭合的注释 -> ; -- 即使输入分号,注释未闭合也会报错 ``` **解决方法**: - 补全注释闭合符号 `*/`,再输入分号: ```sql mysql> SELECT * FROM users /* 闭合注释 */ -> ; ``` ### **3. 执行存储过程/函数时未切换分隔符** 在定义存储过程、触发器或函数时,语句内部可能包含分号 `;`。若未临时更改分隔符,MySQL 会在第一个分号处提前终止输入。 **示例**: ```sql mysql> CREATE PROCEDURE test() -> BEGIN -> SELECT * FROM users; -- 此处分号会触发立即执行 -> END; ERROR 1064 (42000): You have an error in your SQL syntax... ``` **解决方法**: - 使用 `DELIMITER` 命令临时切换分隔符(如 `//`),再定义存储过程: ```sql mysql> DELIMITER // mysql> CREATE PROCEDURE test() -> BEGIN -> SELECT * FROM users; -> END // mysql> DELIMITER ; ``` ### **4. 粘贴的语句包含隐藏字符** 从网页、文档复制 SQL 时,可能携带 **不可见的控制字符**(如换行符 `\r`、`\n`)或 **全角符号**,导致 MySQL 无法识别。 **解决方法**: - 使用纯文本编辑器(如 Notepad++)清理格式,重新粘贴。 - 手动逐行输入语句,避免复制。 ### **5. 客户端编码或终端问题** 如果终端或客户端的字符编码设置错误(如 UTF-8 支持异常),可能导致输入的分号被识别为其他字符。 **解决方法**: - 检查客户端编码: ```sql mysql> SHOW VARIABLES LIKE 'character%'; ``` - 确保客户端、服务端编码一致(建议 `utf8mb4`)。 ### **6. 输入被意外中断** 如果输入时按下 **Ctrl+C** 或其他中断键,可能导致会话进入异常状态。 **解决方法**: - 输入 `\c` 清除当前输入,重新开始: ```sql mysql> SELECT * FROM users -> \c mysql> ``` ### **终极验证方法** 输入一个最简单的语句,观察是否仍显示 `->`: ```sql mysql> SELECT 1; ``` - 如果正常返回结果,说明之前的问题是由特定语句的复杂性引起。 - 如果仍显示 `->`,可能是客户端或环境配置问题,尝试重启 MySQL 客户端或更换终端工具(如 MySQL Workbench)。 如果问题仍未解决,请提供以下信息: 1. 你输入的 **完整语句**。 2. MySQL 客户端版本(通过 `mysql --version` 查看)。 3. 操作系统类型(Windows/Linux/macOS)。 我:我重启之后就解决了,这是为什么? DS: 你通过 **重启 MySQL 客户端或服务** 后问题解决,可能的原因如下: ### **1. 客户端会话状态异常** - **问题根源**: MySQL 客户端在输入过程中可能因某些操作(如未正确处理中断、缓冲区错误等)进入 **异常状态**,导致后续输入被错误解析。 - **重启的作用**: 重启客户端会强制 **重置会话状态**,清除缓存和未完成的输入,恢复到初始环境。 ### **2. 未正确关闭的临时文件或锁** - **问题根源**: 如果之前的 MySQL 会话异常终止(如直接关闭终端、断电等),可能导致客户端或服务端遗留临时文件或锁,影响后续操作。 - **重启的作用**: 重启会释放这些残留的临时资源,解除潜在的冲突。 ### **3. 客户端/服务端编码或配置临时错乱** - **问题根源**: 某些情况下,客户端或服务端的字符编码设置(如 `utf8`、`latin1`)可能因临时操作(如粘贴特殊字符)出现混乱,导致输入的分号或语句被错误解析。 - **重启的作用**: 重启会重新加载配置文件,恢复默认编码和设置。 ### **4. 终端(Terminal)本身的兼容性问题** - **问题根源**: 如果你使用某些终端工具(如老版本的 CMD、PuTTY 等),可能在长时间使用后因内存泄漏或渲染错误,导致输入内容与实际传输内容不一致(如分号显示正常但实际是乱码)。 - **重启的作用**: 重启终端工具会重置其内部状态,确保输入内容正确传递到 MySQL 客户端。 ### **5. MySQL 服务的临时故障** - **问题根源**: 极少数情况下,MySQL 服务可能因内存不足、连接数超限等临时问题,无法正确处理客户端请求,导致交互异常。 - **重启的作用**: 重启 MySQL 服务会释放资源,修复临时故障。 ### **如何避免频繁重启?** 1. **优先尝试清理当前输入**: 输入 `\c` 清除当前未提交的语句,直接回到新提示符: ```sql mysql> SELECT * FROM users -> \c mysql> ``` 2. **检查分隔符状态**: 如果之前修改过分隔符(如 `DELIMITER //`),确保恢复为默认值 `;`: ```sql mysql> DELIMITER ; ``` 3. **使用更稳定的终端工具**: 推荐使用现代终端工具(如 Windows Terminal、iTerm2)或图形化客户端(如 MySQL Workbench)。 ### **总结** 重启本质是通过 **重置状态** 解决临时性异常。如果问题复现,需结合具体场景分析根本原因(如检查输入内容、客户端版本、系统日志等)。