1. DDL解釋
DDL(Data Definition Language),數據定義語言,該語言部分包括以下內容:
- 對數據庫的常用操作
- 對表結構的常用操作
- 修改表結構
2. 對數據庫的常用操作
功能 | SQL |
查看所有的數據庫 | show databases; |
查看有印象的數據庫 | show?databases like ' _xx%'(_一個字符;%任意字符) |
創建數據庫 | create database [if not exists] mydb1 [charset=utf8] |
切換 (選擇要操作的) 數據庫 | use mydb1; |
刪除數據庫 | drop database [if exists] mydb1; |
修改數據庫編碼 | alter database mydb1 character set utf8; |
注意:
像[if not exists]的[ ]代表可選項含義,真正寫命令是如果要寫,不用加[ ],加了會將報錯變為警告
2.1 對表結構的常用操作-創建表
# 創建表
create table [if not exists]表名(字段名1 類型[(寬度)] [約束條件] [comment '字段說明'],字段名2 類型[(寬度)] [約束條件] [comment '字段說明'],字段名3 類型[(寬度)] [約束條件] [comment '字段說明']
)[表的一些設置];創建表是構建一張空表,指定這個表的名字,這個表有幾列,每一列叫什么名字,
以及每一列存儲的數據類型。
數據類型
數據類型是指在創建表的時候為表中字段指定數據類型,只有數據符合類型要求才能存儲起來,使用數據類型的原則是:夠用就行,盡量使用取值范圍小的,而不用大的,這樣可以更多的節省存儲空間。
- 數值類型
類型 | 大小 | 范圍(有符號) | 范圍(無符號) | 用途 |
TINYINT | 1 byte | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或 INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 bytes | (-3.402 823 466 E+38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38, 3.402 823 466 E+38) | 單精度 浮點數值 |
DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度 浮點數值 |
DECIMAL | (一般財務用) | 依賴于M和D的值 | 依賴于M和D 的值 | 小數值 |
- 字符串類型
類型 | 大小 | 用途 |
CHAR | 0-255 bytes | 定長字符串 |
VARCHAR | 0-65535 bytes | 變長字符串 |
TINYBLOB | 0-255 bytes | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二進制形式的長文本數據 |
TEXT | 0-65 535 bytes | 長文本數據 |
MEDIUMBLOB | 0-16 777 215 bytes | 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295 bytes | 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295 bytes | 極大文本數據 |
- 日期和時間類型
類型 | 大小(bytes) | 范圍 | 格式 | 用途 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或 持續時間 |
YEAR[(2|4)] | 1 | (19)70-(20)69/1901-2155或0000 | YYYY(默認四位數) | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD? HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038結束 時間是第 2147483647 秒,北京 時間 2038-1-19 11:14:07,格林 尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期 和時間值, 時間戳 |
2.2 對表結構的常用操作—其他操作
功能 | SQL |
查看當前數據庫的所有表名稱 | show tables; |
查看指定某個表的創建語句 | show create table 表名; |
查看表結構 | desc 表名 |
刪除表 | drop table 表名 |
修改表編碼 | alter table 表名 convert to character set utf8; |
2.3 對表結構的常用操作-修改表結構格式
修改表添加列
alter table 表名 add 列名 類型(長度) [約束:first/after xx];
修改列名和類型
alter table 表名 change 舊列名 新列名 類型(長度) 約束;
修改列類型
alter table 表名 modify 列名 類型(長度);
修改表刪除列.
alter table 表名 drop 列名;
修改表名
rename table 表名 to 新表名;
alter table rename to 新表名
3. DML基本介紹
DML是指數據操作語言,英文全稱是Data Manipulation Language,用來對數據庫中表的數據記錄進行更新。關鍵字:
- 插入insertcrus
- 刪除delete
- 更新update
3.1 數據插入
insert into 表 (列名1,列名2,列名3...) values (值1,值2,值3...);
//向表中插入某些
insert into 表 values (值1,值2,值3...); ? ? //向表中插入所有列
3.2 數據修改
update 表名 set 字段名=值,字段名=值...; //改所有數據的
update 表名 set 字段名=值,字段名=值... where 條件; //限制改某些數據的
3.3 數據刪除
delete from 表名 [where 條件];
truncate table 表名 或者 truncate 表名
Caution
注意:delete和truncate原理不同,delete只刪除內容,而truncate類似于drop table ,可以理解為是將整個表刪除,然后再創建該表;
4. 使用演示
4.1 MySQL的使用演示
1、查看所有的數據庫
show databases;
“information_schema”是 MySQL 系統自帶的數據庫,主要保存 MySQL 數據庫服務器的系統信息,比如數據庫的名稱、數據表的名稱、字段名稱、存取權限、數據文件 所在的文件夾和系統使用的 文件夾,等等
“performance_schema”是 MySQL 系統自帶的數據庫,可以用來監控 MySQL 的各類性能指標。
“sys”數據庫是 MySQL 系統自帶的數據庫,主要作用是以一種更容易被理解的方式展示 MySQL 數據庫服務器的各類性能指標,幫助系統管理員和開發人員監控 MySQL 的技術性能。
“mysql”數據庫保存了 MySQL 數據庫服務器運行時需要的系統信息,比如數據文件夾、當前使用的字符集、約束檢查信息,等等
為什么 Workbench 里面我們只能看到“demo”和“sys”這 2 個數據庫呢?
這是因為,Workbench 是圖形化的管理工具,主要面向開發人 員,“demo”和“sys”這 2 個數據庫已經夠用 了。如果有特殊需求,比如,需要監控 MySQL 數據庫各項性能指標、直接操作 MySQL 數據庫系統文件等,可以由 DBA 通過 SQL 語句,查看其它的系統數據庫。
2、創建自己的數據庫
create database 數據庫名;
#創建atguigudb數據庫,該名稱不能與已經存在的數據庫重名。
create database atguigudb;
3、使用自己的數據庫
use 數據庫名;
#使用atguigudb數據庫
use atguigudb;
說明:如果沒有使用use語句,后面針對數據庫的操作也沒有加“數據名”的限定,那么會報“ERROR 1046(3D000): No database selected”(沒有選擇數據庫)
使用完use語句之后,如果接下來的SQL都是針對一個數據庫操作的,那就不用重復use了,如果要針對另 一個數據庫操作,那么要重新use。
4、查看某個庫的所有表格
show tables; ?#要求前面有use語句show tables from 數據庫名;
5、創建新的表格
create table 表名稱( ? 字段名 數據類型,字段名 數據類型
);說明:如果不是最后一個字段,后面就用加逗號,因為逗號的作用是分割每個字段。create table student(id int,name varchar(20) ?#說名字最長不超過20個字符
);
6、查看一個表的數據
select * from 數據庫表名稱;#查看學生表的數據
select * from student;
7、添加一條記錄
insert into 表名稱 values(值列表);直接插入多條數據(用,隔開)
insert into student values(1,'張三'),(2,'李四'),(3,'王五');將表student全部數據導入表stu
insert into stu select *from student;新的插入方式
insert into 表名 set eid=4,ename='趙六',deptid=1004,salary=8000;
8、查看表的創建信息
show create table 表名稱\G
每條命令以 ; 或 \g 或 \G 結束(\G有將顯示按列排序作用)#查看student表的詳細創建信息
show create table student\G
#結果如下
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)
上面的結果顯示student的表格的默認字符集是“latin1”不支持中文。
9、查看數據庫的創建信息
show create database 數據庫名\G#查看atguigudb數據庫的詳細創建信息
show create database atguigudb\G
*************************** 1. row ***************************Database: atguigudb
Create Database: CREATE DATABASE `atguigudb` /*!40100 DEFAULT
CHARACTER SET latin1 */ 1 row in set (0.00 sec)
面的結果顯示atguigudb數據庫也不支持中文,字符集默認是latin1。
10、刪除表格
drop table 表名稱;#刪除學生表
drop table student;
4.2 MySQL的編碼設置
MySQL5.7中
問題再現:命令行操作sql亂碼問題
mysql> INSERT INTO t_stu VALUES(1,'張三','男');ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column
'sname'
at row 1
問題解決
步驟1:查看編碼命令
show variables like 'character_%';
show variables like 'collation_%';
步驟2:修改mysql的數據目錄下的my.ini配置文件
[mysql] #大概在63行左右,在其下添加
default-character-set=utf8 ?#默認字符集[mysqld] # 大概在76行左右,在其下添加 ...
character-set-server=utf8 collation-server=utf8_general_ci
Caution
注意:建議修改配置文件使用notepad++等高級文本編輯器,使用記事本等軟件打開修改后可能會導致文件編碼修改為“含BOM頭”的編碼,從而服務重啟失敗。
步驟3:重啟服務
步驟4:查看編碼命令
show variables like 'character_%';
show variables like 'collation_%';
如果是以上配置就說明對了。接著我們就可以新創建數據庫、新創建數據表,接著添加包含中文的 數據了。
MySQL8.0中
在MySQL 8.0版本之前,默認字符集為latin1,utf8字符集指向的是utf8mb3。網站開發人員在數據庫設計的時候往往會將編碼修改為utf8字符集。如果遺忘修改默認的編碼,就會出現亂碼的問題。從MySQL8.0 開始,數據庫的默認編碼改為 utf8mb4 ,從而避免了上述的亂碼問題。
4.3 MySQL 字符集
MySQL字符集包括字符集(CHARACTER)和校對規則(COLLATION)兩個概念:
latin1支持西歐字符、希臘字符等
gbk支持中文簡體字符
big5支持中文繁體字符
utf8幾乎支持世界所有國家的字符。
使用MySQL命令 ?SHOW VARIABLES like 'character%';
使用MySQL命令“SHOW COLLATION;”即可查看當前MySQL服務實例支持的字符序。
MySQL字符序命名規則是:以字符序對應的字符集名稱開頭,以國家名居中(或以general居中),以ci、cs或bin結尾。
ci表示大小寫不敏感,cs表示大小寫敏感,bin表示按二進制編碼值比較。
5. MySQL圖形化管理工具
MySQL圖形化管理工具極大地方便了數據庫的操作與管理,常用的圖形化管理工具有:MySQL
Workbench、phpMyAdmin、Navicat Preminum、MySQLDumper、SQLyog、dbeaver、MySQL
ODBC Connector。
工具1. MySQL Workbench
MySQL官方提供的圖形化管理工具MySQL Workbench完全支持MySQL 5.0以上的版本。MySQL
Workbench 分為社區版和商業版,社區版完全免費,而商業版則是按年收費。
MySQL Workbench 為數據庫管理員、程序開發者和系統規劃師提供可視化設計、模型建立、以及數據庫管理功能。它包含了用于創建復雜的數據建模ER模型,正向和逆向數據庫工程,也可以用于執行通常需要花費大量時間的、難以變更和管理的文檔任務。
下載地址:http://dev.mysql.com/downloads/workbench/。
使用:
首先,我們點擊 Windows 左下角的“開始”按鈕,如果你是 Win10 系統,可以直接看到所有程序。接著, 找到“MySQL”,點開,找到“MySQL Workbench 8.0 CE”。點擊打開 Workbench,如下圖所示:
左下角有個本地連接,點擊,錄入 Root 的密碼,登錄本地 MySQL 數據庫服務器,如下圖所示:
這是一個圖形化的界面,我來給你介紹下這個界面。
- 上方是菜單。左上方是導航欄,這里我們可以看到 MySQL 數據庫服務器里面的數據庫,包括數據表、視圖、存儲過程和函數;左下方是信息欄,可以顯示上方選中的數據庫、數據表等對象的信息。
- 中間上方是工作區,你可以在這里寫 SQL 語句,點擊上方菜單欄左邊的第三個運行按 鈕,就可以執行工作區的 SQL 語句了。
- 中間下方是輸出區,用來顯示 SQL 語句的運行情況,包括什么時間開始運行的、運行的內容、運行的輸出,以及所花費的時長等信息。
工具2. Navicat
Navicat MySQL是一個強大的MySQL數據庫服務器管理和開發工具。它可以與任何3.21或以上版本的MySQL一起工作,支持觸發器、存儲過程、函數、事件、視圖、管理用戶等,對于新手來說易學易用。其精心設計的圖形用戶界面(GUI)可以讓用戶用一種安全簡便的方式來快速方便地創建、組織、訪問和共享信息。Navicat支持中文,有免費版本提供。
下載地址:http://www.navicat.com/。
工具3. SQLyog
SQLyog 是業界著名的 Webyog 公司出品的一款簡潔高效、功能強大的圖形化 MySQL 數據庫管理工具。這款工具是使用C++語言開發的。該工具可以方便地創建數據庫、表、視圖和索引等,還可以方便地進行插入、更新和刪除等操作,同時可以方便地進行數據庫、數據表的備份和還原。該工具不僅可以通過SQL文件進行大量文件的導入和導出,還可以導入和導出XML、HTML和CSV等多種格式的數據。 下載地址:http://www.webyog.com/,讀者也可以搜索中文版的下載地址。
工具4:dbeaver
DBeaver是一個通用的數據庫管理工具和 SQL 客戶端,支持所有流行的數據庫:MySQL、
PostgreSQL、 SQLite、Oracle、DB2、SQL Server、 Sybase、MS Access、Teradata、 Firebird、Apache Hive、Phoenix、 Presto等。DBeaver比大多數的SQL管理工具要輕量,而且支持中文界面。DBeaver社區版作為一個免費開源的產品,和其他類似的軟件相比,在功能和易用性上都毫不遜色。
唯一需要注意是 DBeaver 是用Java編程語言開發的,所以需要擁有 JDK(Java Development ToolKit)環境。如果電腦上沒有JDK,在選擇安裝DBeaver組件時,勾選“Include Java”即可。
下載地址:https://dbeaver.io/download/
可能出現連接問題:
有些圖形界面工具,特別是舊版本的圖形界面工具,在連接MySQL8時出現“Authentication plugin
'caching_sha2_password' cannot be loaded”錯誤。
出現這個原因是MySQL8之前的版本中加密規則是mysql_native_password,而在MySQL8之后,加密規則是caching_sha2_password。解決問題方法有兩種,第一種是升級圖形界面工具版本,第二種是把MySQL8 用戶登錄密碼加密規則還原成mysql_native_password。
第二種解決方案如下,用命令行登錄MySQL數據庫之后,執行如下命令修改用戶密碼加密規則并更新用戶密碼,這里修改用戶名為“root@localhost”的用戶密碼規則為“mysql_native_password”,密碼值為“123456”,如圖所示。
#使用mysql數據庫
USE mysql; ?#修改'root'@'localhost'用戶的密碼規則和密碼
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'abc123';#刷新權限
FLUSH PRIVILEGES;
6. MySQL目錄結構與源碼
6.1 主要目錄結構
MySQL的目錄結構 | 說明 |
bin目錄 | 所有MySQL的可執行文件。如:mysql.exe |
MySQLInstanceConfig.exe | 數據庫的配置向導,在安裝時出現的內容 |
data目錄 | 系統數據庫所在的目錄 |
my.ini文件 | MySQL的主要配置文件 |
c:\ProgramData\MySQL\MySQL Server 8.0\data\ | 用戶創建的數據庫所在的目錄 |
6.2 MySQL 源代碼獲取
首先,你要進入 MySQL下載界面。 這里你不要選擇用默認的“Microsoft Windows”,而是要通過下拉欄, 找到“Source Code”,在下面的操作系統版本里面, 選擇 Windows(Architecture
Independent),然后點擊下載。
接下來,把下載下來的壓縮文件解壓,我們就得到了 MySQL 的源代碼。
MySQL 是用 C++ 開發而成的,我簡單介紹一下源代碼的組成。
mysql-8.0.22 目錄下的各個子目錄,包含了 MySQL 各部分組件的源代碼:
- sql 子目錄是 MySQL 核心代碼;
- libmysql 子目錄是客戶端程序 API;
- mysql-test 子目錄是測試工具;
- mysys 子目錄是操作系統相關函數和輔助函數;
源代碼可以用記事本打開查看,如果你有 C++ 的開發環境,也可以在開發環境中打開查看。
如上圖所示,源代碼并不神秘,就是普通的 C++ 代碼,跟你熟悉的一樣,而且有很多注釋,可以幫助你理解。閱讀源代碼就像在跟 MySQL 的開發人員對話一樣,十分有趣。
7. 常見問題的解決
問題1:root 用戶密碼忘記,重置的操作
方法一:
1: 通過任務管理器或者服務管理,關掉mysqld(服務進程)
2: 通過命令行+特殊參數開啟mysqld mysqld --defaults-
file="D:\ProgramFiles\mysql\MySQLServer5.7Data\my.ini" --skip-grant-tables
3: 此時,mysqld服務進程已經打開。并且不需要權限檢查
4: mysql -uroot 無密碼登陸服務器。另啟動一 個客戶端進行
5: 修改權限表
(1) use mysql;
(2)update user set authentication_string=password('新密 碼') where
user='root' and Host='localhost';
(3)flush privileges;
6: 通過任務管理器,關掉mysqld服務進程。
7: 再次通過服務管理,打開mysql服務。
8: 即可用修改后的新密碼登陸。
方法二:
通用方法--啟動時跳過權限表1> 停止數據庫
C:\Users\Administrator>net stop mysql
MySQL 服務正在停止..
MySQL 服務已成功停止。
2> 啟動時跳過權限表
mysqld --console --skip-grant-tables --shared-memoryC:\Users\Administrator>mysqld --console --skip-grant-tables --shared-
memory
2024-05-09T02:10:48.290981Z 0 [System] [MY-010116] [Server]
F:\mysql\mysql-8.0.36-winx64\bin\mysqld.exe (mysqld 8.0.36) starting as process
5344
2024-05-09T02:10:48.318791Z 1 [System] [MY-013576] [InnoDB] InnoDB
initialization has started.
2024-05-09T02:10:49.700249Z 1 [System] [MY-013577] [InnoDB] InnoDB
initialization has ended.
2024-05-09T02:10:51.926542Z 0 [Warning] [MY-011311] [Server] Plugin
mysqlx reported: 'All I/O interfaces are disabled, X Protocol won't be
accessible'
2024-05-09T02:10:52.119615Z 0 [Warning] [MY-010068] [Server] CA
certificate ca.pem is self signed.
2024-05-09T02:10:52.119846Z 0 [System] [MY-013602] [Server] Channel
mysql_main configured to support TLS. Encrypted connections are now supported for
this channel.
2024-05-09T02:10:52.215835Z 0 [System] [MY-010931] [Server]
F:\mysql\mysql-8.0.36-winx64\bin\mysqld.exe: ready for connections. Version:
'8.0.36' socket: '' port: 0 MySQL Community Server - GPL.注意:不要關閉中斷3> 重新開啟新的終端,登錄并設置新密碼
PS C:\Users\Administrator> mysql -uroot -p
Enter password: 直接敲回車鍵
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.36 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
mysql> flush privileges;
Query OK, 0 rows affected (0.05 sec)
mysql> alter user root@localhost identified by '123456';
Query OK, 0 rows affected (0.02 sec)4> 退出MySQL,關閉第一個終端,正常啟動服務。
mysql> \q
Bye
PS C:\Users\Administrator> net start mysql
MySQL 服務正在啟動 ..
MySQL 服務已經啟動成功。
PS C:\Users\Administrator> mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be
insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
mysql> \q
Bye
方法三:
參考官方文檔1> 停止服務
PS C:\Users\Administrator> net stop mysql
MySQL 服務正在停止.
MySQL 服務已成功停止。
2> 創建一個文本文件,內如如下,保存為 mysql_init.txt
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
3> 啟動同時使用上一步文件修改密碼
要求管理員身份打開cmd來運行命令,暫時不要關閉終端:
C:\Users\Administrator>mysqld --init-file=F:\mysql\mysql-8.0.36-
winx64\mysql_init.txt
4> 打開另一個終端,登錄測試
PS C:\Users\Administrator> mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can
be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.36 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
mysql> \q
Bye
5> 關閉第一個終端,正常啟動服務。
C:\Users\Administrator>mysqld --init-file=F:\mysql\mysql-8.0.36-
winx64\mysql_init.txt
^C
C:\Users\Administrator>net start mysql
MySQL 服務正在啟動 ..
MySQL 服務已經啟動成功。
C:\Users\Administrator>mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can
be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
mysql> \q
Bye
6> 刪除文件 mysql_init.tx
問題2:mysql 命令報不是內部或外部命令
如果輸入mysql命令報“不是內部或外部命令”,把mysql安裝目錄的bin目錄配置到環境變量path中。如下:
問題3:錯誤 ERROR :沒有選擇數據庫就操作表格和數據
ERROR 1046 (3D000): No database selected |
解決方案一:就是使用“USE 數據庫名;”語句,這樣接下來的語句就默認針對這個數據庫進行操作 |
解決方案二:就是所有的表對象前面都加上“數據庫.” |
問題4:命令行客戶端的字符集問題
mysql> INSERT INTO t_stu VALUES(1,'張三','男');ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for
column 'sname' at row 1
原因:服務器端認為你的客戶端的字符集是utf-8,而實際上你的客戶端的字符集是GBK。
查看所有字符集:SHOW VARIABLES LIKE 'character_set_%';
解決方案,設置當前連接的客戶端字符集 “SET NAMES GBK;”
問題5:修改數據庫和表的字符編碼
修改編碼:
(1)先停止服務(2)修改my.ini文件
(3)重新啟動服務
說明:
如果是在修改my.ini之前建的庫和表,那么庫和表的編碼還是原來的Latin1,要么刪了重建,要么使用alter語句修改編碼。
mysql> create database 0728db charset Latin1;Query OK, 1 row affected (0.00 sec)mysql> use 0728db; Database changed
mysql> create table student (id int , name varchar(20)) charset Latin1; Query OK,
0 rows affected (0.02 sec)mysql> show create table student\G
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)mysql> alter table student charset utf8; #修改表字符編碼為UTF8 Query OK, 0 rows
affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(20) CHARACTER SET latin1 DEFAULT NULL, ?#字段仍然是latin1編碼
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> alter table student modify name varchar(20) charset utf8; #修改字段字符編碼為
UTF8 Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table student\G
*************************** 1. row ***************************Table: student
Create Table: CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> show create database 0728db;;
+--------+-----------------------------------------------------------------+
|Database| Create Database ? ? ? ? ? ? ? ? ? ? ? ? |
+------+-------------------------------------------------------------------+
|0728db| CREATE DATABASE `0728db` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter database 0728db charset utf8; #修改數據庫的字符編碼為utf8 Query OK, 1
row affected (0.00 sec)
mysql> show create database 0728db;
+--------+-----------------------------------------------------------------+
|Database| Create Database ? ? ? ? ? ? ? ? ? ? ? ? |
+--------+-----------------------------------------------------------------+
| 0728db | CREATE DATABASE `0728db` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+--------+-----------------------------------------------------------------+
1 row in set (0.00 sec)