2016-08-03 32 views
0

我想防止將非ASCII字符串寫入到postgres數據庫表中的特定列中。我想過使用constrains,但在嘗試使用任何編碼轉換函數時收到錯誤消息。使用其他字符串函數,如lowerbtrim工作沒有問題。防止將非ASCII字符串寫入列

metadata = MetaData() 
constrains = [CheckConstraint('lower(name) = name', name='enforce_lower'), 
      CheckConstraint('utf8_to_ascii(name) = name', name='prevent_non_ascii')] 
concepts_table = Table('test20', metadata, 
         Column('name', Text, *constrains)) 
metadata.create_all(engine, checkfirst=False)  

的錯誤信息是:

(ProgrammingError) function utf8_to_ascii(text) does not exist

這是我的PostgreSQL的版本:

SELECT version(); 
PostgreSQL 9.5.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit 

回答

1

在PostgreSQL裏沒有utf8_to_ascii(text)功能(如錯誤消息狀態;))。取而代之的是定義的轉換(更多轉化:https://www.postgresql.org/docs/current/static/sql-createconversion.html)這個名字的:https://www.postgresql.org/docs/current/static/functions-string.html#CONVERSION-NAMES

利用現有的轉換使用convert(string bytea, src_encoding name, dest_encoding name)

嘗試使用下列約束定義:

CheckConstraint("encode(convert(name::bytea, 'UTF8'::name, 'SQL_ASCII'::name), 'escape') = name", name='prevent_non_ascii') 
+0

謝謝!但是,這導致以下錯誤:'(ProgrammingError)函數轉換(文本,未知,未知)不存在 提示:沒有函數匹配給定的名稱和參數類型。你可能需要添加明確的類型轉換。' – Framester

+1

我更新了答案。 –

+0

現在它說'(ProgrammingError)函數轉換(文本,名稱,名稱)不存在 提示:沒有函數匹配給定的名稱和參數類型。您可能需要添加明確的類型轉換。「我還在本網站上發現了utf6_to_ascii:https://www.postgresql.org/docs/current/static/functions-string.html – Framester