mysql切到國產(chǎn)數(shù)據(jù)庫KingbaseES后的SQL區(qū)別
數(shù)據(jù)庫裝好以后,第一件事不是建業(yè)務(wù)表,也不是急著看復(fù)雜語法,而是先確認(rèn)客戶端能不能穩(wěn)定連進(jìn)去。
MySQL 用久了,手上一般會有一套很熟的動作:服務(wù)起來以后,敲一條 mysql -h -P -u -p,能進(jìn)交互界面,再查個 select version()。這套動作看起來簡單,但它解決的是最基礎(chǔ)的問題:當(dāng)前連的是哪臺機(jī)器、哪個端口、哪個用戶、哪個庫。
切到 KingbaseES 以后,入口換成了 ksql。命令也不復(fù)雜,不過幾個參數(shù)不能直接按 MySQL 的習(xí)慣套。尤其是數(shù)據(jù)庫名這一項,如果沒顯式寫出來,很容易遇到一個看起來像連接失敗、實際只是默認(rèn)庫不對的錯誤。
先確認(rèn)用的是哪個 ksql
安裝目錄里不止有數(shù)據(jù)庫服務(wù)端程序,也有客戶端工具。開始連庫之前,先確認(rèn)當(dāng)前 shell 里找到的 ksql 來自哪里。
which ksql ksql --version ksql --help | head -n 40
當(dāng)前環(huán)境里,ksql 來自安裝目錄下的 Server/bin:
/acowbo/kingbase/install/KESRealPro/V009R001C010/Server/bin/ksql
版本返回的是:
ksql (KingbaseES) V009R001C010

這一步看著普通,但后面排查問題時很有用。機(jī)器上如果裝過多個版本,或者 PATH 里混進(jìn)了別的客戶端工具,先確認(rèn)命令來源能省不少時間。
ksql --help 里也能看到它自己的參數(shù)習(xí)慣。比如數(shù)據(jù)庫名使用 -d,用戶名使用 -U,端口使用 -p。這幾個大小寫和 MySQL 不完全一樣。
MySQL: mysql -h 127.0.0.1 -P 3306 -u root -p KingbaseES: ksql -h 127.0.0.1 -p 54321 -U system -d test
對 MySQL 用戶來說,最容易順手寫錯的是端口和用戶名:MySQL 端口是大寫 -P,用戶是小寫 -u;ksql 端口是小寫 -p,用戶是大寫 -U。
這里還有一個細(xì)節(jié):ksql 的幫助里把用法寫成了 ksql [OPTION]... [DBNAME [USERNAME]]。也就是說,數(shù)據(jù)庫名和用戶名除了用參數(shù)指定,也能放在命令最后。實際寫文章或腳本時,用 -U、-d 會更清楚。
比如下面兩種寫法都能表達(dá)連接目標(biāo):
ksql -h 127.0.0.1 -p 54321 -U system -d test ksql -h 127.0.0.1 -p 54321 test system
前一種更適合放在文章和腳本里。參數(shù)名一眼能看出來,后面排查連接問題時也不會猜最后兩個位置參數(shù)分別是什么。
少了數(shù)據(jù)庫名,錯誤會有點(diǎn)繞
先看一條不完整的連接命令:
ksql -h 127.0.0.1 -p 54321 -U system
輸入密碼后,返回的是:
FATAL: database "system" does not exist

這個錯誤不能馬上往“服務(wù)沒起來”或者“密碼錯了”上想。這里密碼已經(jīng)進(jìn)入校驗流程,服務(wù)端也有響應(yīng),真正的問題是沒有指定要連接的數(shù)據(jù)庫。
ksql 在沒有 -d 的情況下,會嘗試連接和用戶名同名的數(shù)據(jù)庫。當(dāng)前用戶名是 system,它就去找名為 system 的數(shù)據(jù)庫。實例里沒有這個庫,于是報了 database "system" does not exist。
這點(diǎn)和 MySQL 的使用習(xí)慣很容易打架。MySQL 里很多時候先用管理員用戶連進(jìn)去,再 use 庫名;而這里最好一開始就把目標(biāo)數(shù)據(jù)庫寫清楚。
這類錯誤也提醒了一件事:連接數(shù)據(jù)庫時不要只看“賬號密碼對不對”。主機(jī)、端口、用戶、數(shù)據(jù)庫名四個值是一起工作的。服務(wù)能響應(yīng)、密碼能通過,并不代表目標(biāo)數(shù)據(jù)庫一定存在。以后看到 could not connect to server、password authentication failed、database does not exist 這幾類錯誤,也要分開判斷,不能全當(dāng)成同一種連接失敗。
把 -d 寫上,先連進(jìn) test
補(bǔ)上數(shù)據(jù)庫名以后,連接命令變成:
ksql -h 127.0.0.1 -p 54321 -U system -d test
這次能正常進(jìn)入交互界面,提示符變成了:
test=#

這條命令里主要是四個參數(shù):
-h 127.0.0.1 連接本機(jī)數(shù)據(jù)庫服務(wù) -p 54321 連接端口 -U system 登錄用戶 -d test 目標(biāo)數(shù)據(jù)庫
這里的 test 是初始化后可以連接的數(shù)據(jù)庫。實際環(huán)境里可以換成自己的業(yè)務(wù)庫或?qū)嶒瀻欤P(guān)鍵是不要讓客戶端去猜默認(rèn)庫。
提示符也能順手看一下。test=# 里的 test 是當(dāng)前數(shù)據(jù)庫,后面的 # 和當(dāng)前高權(quán)限用戶有關(guān)。后面換成普通用戶連接 app_db 時,提示符會變成 app_db=>。它不是權(quán)限檢查工具,但能快速看出當(dāng)前大概連在哪個庫、用的是什么級別的用戶。
連進(jìn)去以后,先確認(rèn)自己在哪
進(jìn)入交互界面后,先查當(dāng)前數(shù)據(jù)庫、當(dāng)前用戶和版本:
select current_database(), current_user; select version();
當(dāng)前返回結(jié)果里,數(shù)據(jù)庫是 test,用戶是 system,版本是 KingbaseES V009R001C010。

MySQL 里常用 select database();、select user(); 看當(dāng)前位置。KingbaseES 這里換成:
select current_database(), current_user;
命令不同,作用差不多。后面要創(chuàng)建用戶、創(chuàng)建數(shù)據(jù)庫、建表,先確認(rèn)當(dāng)前庫和當(dāng)前用戶,能少犯很多低級錯誤。
再試一個最小查詢:
select 1;
然后用 \conninfo 看當(dāng)前連接信息:
\conninfo
最后退出:
\q

這里順手碰到了 ksql 里的另一類命令:反斜杠開頭的是客戶端元命令,不是 SQL。比如 \conninfo 查看連接信息,\q 退出客戶端。元命令后面單獨(dú)展開,這里先知道它不是發(fā)給數(shù)據(jù)庫執(zhí)行的 SQL 就行。
select 1; 這種 SQL 會被發(fā)送到數(shù)據(jù)庫執(zhí)行;\conninfo 和 \q 由 ksql 客戶端自己處理。這一點(diǎn)和 MySQL 客戶端里的部分命令有點(diǎn)像,比如 status、source、\q 這類動作不完全等同于 SQL。先把這個邊界分清,后面看 \l、\d、\dt 時就不會困惑:為什么這些命令不用分號,為什么它們不是標(biāo)準(zhǔn) SQL。
環(huán)境變量也能連
完整參數(shù)寫熟以后,可以用環(huán)境變量減少重復(fù)輸入。
export KINGBASE_HOST=127.0.0.1 export KINGBASE_PORT=54321 export KINGBASE_USER=system export KINGBASE_DATABASE=test
再執(zhí)行:
ksql
客戶端會讀取這些環(huán)境變量,直接連接到對應(yīng)數(shù)據(jù)庫。

環(huán)境變量適合固定連接目標(biāo)。比如這臺測試機(jī)一直連 127.0.0.1:54321 的 test 庫,就可以少敲一串參數(shù)。
臨時測試時,先放在當(dāng)前終端即可,不急著寫進(jìn) .bashrc。要確認(rèn)當(dāng)前 shell 里留了什么值,可以直接看:
echo $KINGBASE_HOST echo $KINGBASE_PORT echo $KINGBASE_USER echo $KINGBASE_DATABASE
換用戶、換庫、換服務(wù)器之前,最好先清掉舊值:
unset KINGBASE_HOST KINGBASE_PORT KINGBASE_USER KINGBASE_DATABASE
這樣再執(zhí)行 ksql 時,就會回到手動傳參的狀態(tài),不會帶著上一次的連接目標(biāo)。
別一直用 system 做實驗
前面的連接都是用 system 做的。安裝初始化階段用它沒問題,但日常寫 SQL、試表結(jié)構(gòu)、做小實驗,最好不要一直使用管理員用戶。
這里創(chuàng)建一個普通用戶:
create user app_user with password '<實驗密碼>' nosuperuser nocreatedb nocreaterole;
執(zhí)行成功后返回:
CREATE ROLE
再用 \du 看角色列表,可以看到 app_user 已經(jīng)存在。

這里有個細(xì)節(jié):命令寫的是 create user,返回卻是 CREATE ROLE。這不是異常。官方文檔里也能看到,CREATE USER 是 CREATE ROLE 的別名,區(qū)別在于 CREATE USER 默認(rèn)帶登錄屬性。也就是說,KingbaseES 這里的用戶和角色體系是放在一起理解的。
這里不展開完整權(quán)限模型,只先做一個最小隔離:管理員用戶負(fù)責(zé)創(chuàng)建資源,普通用戶負(fù)責(zé)實驗操作。
nosuperuser nocreatedb nocreaterole 這幾個選項也不用背得太早,先看字面就夠了:不是超級用戶,不能創(chuàng)建數(shù)據(jù)庫,不能創(chuàng)建角色。也就是說,app_user 只是一個普通登錄用戶。這樣后面用它建表、插入數(shù)據(jù)時,能更接近日常應(yīng)用賬號的狀態(tài),而不是一直用管理員權(quán)限把問題蓋過去。
創(chuàng)建用戶時的密碼只用于本地實驗,公開內(nèi)容里不要放真實密碼。示例里可以寫成 <實驗密碼>,實際操作時按自己的密碼策略設(shè)置。命令輸出里如果出現(xiàn)密碼,也應(yīng)該提前打碼。
給普通用戶建一個自己的數(shù)據(jù)庫
用戶創(chuàng)建好以后,再創(chuàng)建一個數(shù)據(jù)庫,并把 owner 指向這個用戶:
create database app_db owner app_user;
執(zhí)行成功后,用 \l 看數(shù)據(jù)庫列表。app_db 出現(xiàn)在列表里,owner 是 app_user。

這里要把兩個概念分清楚:用戶和數(shù)據(jù)庫不是一回事。app_user 是登錄身份,app_db 是數(shù)據(jù)庫。把 app_db 的 owner 指給 app_user,再用這個用戶連接這個庫,就不用一直依賴 system。
官方 CREATE DATABASE 文檔里也有對應(yīng)語法,OWNER 可以指定新數(shù)據(jù)庫的所有者。創(chuàng)建數(shù)據(jù)庫本身需要超級用戶或者 CREATEDB 權(quán)限,這也是這里繼續(xù)使用 system 來執(zhí)行創(chuàng)建動作的原因。
和 MySQL 對比時,這里也容易有錯覺。MySQL 里經(jīng)常把“一個庫 + 一個用戶 + 一組授權(quán)”放在一起理解,業(yè)務(wù)上也會說“給某個用戶建一個庫”。KingbaseES 這里仍然可以這么組織實驗環(huán)境,但概念上要分開:用戶是用戶,數(shù)據(jù)庫是數(shù)據(jù)庫,owner 是數(shù)據(jù)庫的所有者,后面還會遇到 schema 和對象權(quán)限。當(dāng)前這一步只先把用戶和數(shù)據(jù)庫綁定起來,不把權(quán)限體系一次講完。
用普通用戶重新連一次
退出當(dāng)前連接后,換成普通用戶連接新庫:
ksql -h 127.0.0.1 -p 54321 -U app_user -d app_db
進(jìn)入后先確認(rèn)當(dāng)前身份:
select current_database(), current_user;
返回的是 app_db 和 app_user。這說明連接目標(biāo)已經(jīng)從管理員用戶的 test,切到了普通用戶自己的數(shù)據(jù)庫。

接著做一個很小的寫入驗證:
create table t_ksql_conn_demo(id int, name varchar(50)); insert into t_ksql_conn_demo values (1, 'hello ksql'); select * from t_ksql_conn_demo;
結(jié)果能查到 hello ksql,說明這個普通用戶不僅能連庫,也能在自己的數(shù)據(jù)庫里完成建表和寫入。
到這一步,ksql 入門就不只是“連上了”這么簡單。連接參數(shù)、默認(rèn)數(shù)據(jù)庫、當(dāng)前用戶、普通用戶、數(shù)據(jù)庫 owner,都已經(jīng)串起來了。
這個小表沒有業(yè)務(wù)含義,只是驗證連接后的寫入能力。比單純執(zhí)行 select 1 更進(jìn)一步:select 1 只能說明查詢能執(zhí)行,建表和插入成功,才說明這個用戶在當(dāng)前數(shù)據(jù)庫里確實有基本操作能力。后面要繼續(xù)練 SQL,也可以從這個 app_db 開始,避免在 test 庫里越堆越亂。
先把連接習(xí)慣改過來
從 MySQL 切到 ksql,第一關(guān)不是 SQL 方言,而是連接習(xí)慣。
mysql 常用的是:
mysql -h 127.0.0.1 -P 3306 -u root -p
ksql 這里更建議一開始就寫完整:
ksql -h 127.0.0.1 -p 54321 -U app_user -d app_db
幾個點(diǎn)最容易踩:
端口參數(shù):MySQL 是 -P,ksql 是 -p 用戶參數(shù):MySQL 是 -u,ksql 是 -U 數(shù)據(jù)庫名:ksql 最好顯式寫 -d 默認(rèn)行為:不寫 -d 時,可能嘗試連接和用戶名同名的數(shù)據(jù)庫 管理員用戶:system 用來初始化和管理,不適合所有實驗都壓在它身上
到此這篇關(guān)于mysql切到國產(chǎn)數(shù)據(jù)庫KingbaseES后的SQL區(qū)別的文章就介紹到這了,更多相關(guān)mysql和KingbaseES的SQL區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL中CAST()實例之轉(zhuǎn)換數(shù)據(jù)類型
CAST函數(shù)用于將某種數(shù)據(jù)類型的表達(dá)式顯式轉(zhuǎn)換為另一種數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于SQL中CAST()實例之轉(zhuǎn)換數(shù)據(jù)類型的相關(guān)資料,需要的朋友可以參考下2023-01-01
Windows MySQL修改配置文件my.ini不生效問題
在Windows Server 2019上修改MySQL 5.6的安裝目錄下my.ini文件后,需要通過修改注冊表中的ImagePath值來確保MySQL讀取新的配置文件,修改時應(yīng)確保配置文件路徑正確,并且新配置不會覆蓋原有配置,以保證修改生效2025-01-01

