要生成的sql:
作用是利用postgregis資料庫函式計算兩點(經緯度已知)的距離。
select st_distance(
st_transform(st_geomfromtext('point(-87.734087560562 43.770129071141)',4326),26986),
st_transform(st_geomfromtext('point(-87.747382933006 43.759234252055)', 4326),26986)
最後成功的寫法:
select st_distance(
st_transform(st_geomfromtext( ,4326),26986),
st_transform(st_geomfromtext(, 4326),26986))
$是字串:-87.734087560562 43.770129071141
$是字串point(-87.747382933006 43.759234252055)
注意1:單引號的轉義
方式a:如上使用
方式b:使用xml的轉義字元:
select st_distance(
st_transform(st_geomfromtext(' point($) ',4326),26986),
st_transform(st_geomfromtext('$ ', 4326),26986))
方式c:concat拼接的方式。
剛開始想拼接一對單引號出來,不行:
select st_distance(
st_transform(st_geomfromtext(concat(e'\'','point($)',e'\'','),4326),26986),
st_transform(st_geomfromtext(concat(e'\'','$',e'\'','), 4326),26986))
後來堅持不懈,發現是這麼寫:
select st_distance(
st_transform(st_geomfromtext(concat('point($)'),4326),26986),
st_transform(st_geomfromtext(concat('$'), 4326),26986))
這樣也行:
select st_distance(
st_transform(st_geomfromtext(concat('point(',#,')'),4326),26986),
st_transform(st_geomfromtext(concat('$'), 4326),26986))
這樣也行:
select st_distance(
st_transform(st_geomfromtext(concat('point(',#,')'),4326),26986),
st_transform(st_geomfromtext(concat(#), 4326),26986))
concat函式解析後會自帶單引號?我之前為了加上單引號還這麼寫呢:select concat('''','point(116.289573 39.892352)','''')
select concat('''','point(116.289573 39.892352)','''')
select concat('point(-87.747382933006 43.759234252055)')
select '''' || 'point(-87.747382933006 43.759234252055)' || ''''
這樣不行:
select st_distance(
st_transform(st_geomfromtext('\''point($) '\'',4326),26986),
st_transform(st_geomfromtext('\''$ '\'', 4326),26986))
sqlselect concat('\'','ddd','\'') from t_parking也有語法錯誤,應該寫為select concat(e'\'','ddd',e'\'') from t_parking,postgresql轉義放在e'\要轉義的內容'裡。詳見
折騰半天,發現這樣寫,最簡單
string param = "point(" + longitude + " " + latitude + ")";
st_geomfromtext(#,4326)
注意2:單引號為什麼不能用雙引號取代
sql裡單引號不能被雙引號取代著用。
注意3:${} 與 #{}的區別
前者是直接把字面值加在sql裡,完全是字串替換,當作佔位符。常常用來傳遞表名,欄位名,如order by $
mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫preparedstatement的set方法來賦值,有預編譯的機制。另外,傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。
後注入的引數將不會再進行sql編譯。我們知道,sql注入是發生在編譯的過程中,因為惡意注入了某些特殊字元,最後被編譯成了惡意的執行操作。而預編譯機制則可以很好的防止sql注入。
注意4:mybatis裡寫的一條sql裡可以${} 與 #{}混著用嗎?
比如這條語句:
select st_distance(st_transform(st_geomfromtext('point(117.343454 40.8978999)',4326),26986),st_transform(st_geomfromtext('point(116.289573 39.892352)', 4326),26986))
from t_parking
where id='0652b36f115c42578d13ffa45c4589c8'
寫成:select st_distance(
st_transform(st_geomfromtext( ,4326),26986),
st_transform(st_geomfromtext(, 4326),26986))
from t_parking
and id = #
可以嗎?
當然是可以的,但${}裡不能帶,jdbctype=varchar
寫這樣and id = $報錯:org.postgresql.util.psqlexception: 錯誤: 語法錯誤 在輸入的末尾\n 位置。
寫這樣and id = '$'報錯:內部錯誤。
寫這樣and id = '$'當然是正確的。
寫這樣and id = $當然是有語法錯誤的。
create database testgis;--新建乙個庫
create extension postgis;--給該庫啟用postgis(包括柵格),出現表spatial_ref_sys
create extension postgis_topology;--啟用拓撲topology庫
select st_geomfromtext('point(116.289573 39.892352)', 4326); --試用
st_astext(inf_comp_components_point.geom) --得到point(116.289573 39.892352)字串
給表t_parking新增乙個地理屬性欄位geom,座標系是4326(epsg4326,經緯度),2維
select addgeometrycolumn ('t_parking', 'geom', 4326, 'point', 2)
update t_parking geom set geom = st_geomfromtext('point(116.289573 39.892352)', 4326) where id='0652b36f115c42578d13ffa45c4589c8'
select st_astext(geom) geom from t_parking where id='0652b36f115c42578d13ffa45c4589c8'
select a1.attname as column_name,t.typname as data_type,d.description as column_comment
from (select a.attname,a.attrelid,a.atttypid,a.attnum from pg_attribute a,pg_class c where c.relname = 't_parking' and a.attnum>0 and a.attrelid=c.oid)a1 left join pg_type t on a1.atttypid=t.oid left join pg_description d on d.objoid=a1.attrelid and d.objsubid=a1.attnum;
qDebug輸出QString資料帶引號的問題
在使用qdebug輸出qstring,直接輸出會有問題 qstring str1 welcome qdebug 注意不是qdebug 輸出 welcome 如果想輸出不帶引號的 正確的方法如下 使用如下函式轉換一下 const char qprintable const qstring str qs...
excel中單元格帶引號問題
現象 excel中某個單元格拷出結果 單元格 select from dual where 1 1 拷出到文字結果 select from dual where 1 1 原因 excel中乙個單元格的內容帶著換行符,複製出來的時候預設在前後加了引號.去掉引號思路 因為存在換行,所以excel帶了引號...
Linux find命令和ls命令帶 引號的問題
linux中find命令的使用網上有很多資料 實際使用中遇到了如下問題 請看如下幾組命令 a find name abc b find name abc c find name abc d find name abc print 除了第一組,其他三組得到的結果都是一樣的,因為 name後面的字串直接...